<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.ecured.cu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Goldfields</id>
	<title>EcuRed - Contribuciones del colaborador [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.ecured.cu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Goldfields"/>
	<link rel="alternate" type="text/html" href="https://www.ecured.cu/Especial:Contribuciones/Goldfields"/>
	<updated>2026-05-27T05:59:59Z</updated>
	<subtitle>Contribuciones del colaborador</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://www.ecured.cu/index.php?title=DOTA:Defence_of_the_Ancients&amp;diff=1275976</id>
		<title>DOTA:Defence of the Ancients</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=DOTA:Defence_of_the_Ancients&amp;diff=1275976"/>
		<updated>2011-12-18T00:41:56Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=DotA&lt;br /&gt;
|familia=MOBA&lt;br /&gt;
|imagen=Dota_epic_3v3_by_kunkka.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=[[Icefrog]]&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=6.72f&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=Windows Xp, Vista, 7&lt;br /&gt;
|idioma=Multilenguaje&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=[http://www.playdota.com www.playdota.com]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DotA.''' Abreviatura de Defense of the Ancients y traducido al español como Defensa de los Ancestros. Es un escenario personalizado para el [[videojuego]] [[Warcraft III: The Frozen Throne]], creado con el editor de mapas de [[Warcraft III: The Frozen Throne|Warcraft III]] y basado en el escenario de [[Starcraft]] &amp;quot;Aeon of Strife&amp;quot;. El mapa se juega en dos equipos, y el objetivo del juego es destruir el Ancient (en español: ancestro) del oponente. Los Ancients son estructuras fuertemente protegidas, ubicadas en esquinas opuestas del mapa. Los jugadores controlan poderosas unidades conocidas como &amp;quot;héroes&amp;quot;, que son ayudadas por unidades controladas por inteligencia artificial llamadas &amp;quot;creeps&amp;quot;. Como en un juego de rol, los héroes obtienen puntos de experiencia para incrementar sus habilidades y usan oro para comprar equipo y elementos útiles durante la misión.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Historia y desarrollo  ==&lt;br /&gt;
&lt;br /&gt;
Warcraft III es la tercera entrega de la serie de juegos [[Warcraft|Warcraft]], desarrollada por [[Blizzard|Blizzard]] Entertainment. Al igual que su antecesor, Warcraft III incluye un editor de mapas gratuito, que permite a los jugadores crear y modificar escenarios personalizados que pueden ser utilizados en modos de un jugador y multijugador. Los mapas resultantes deben cargarse desde el juego, y pueden consistir en sencillos escenarios de batalla para jugarse en una partida normal de Warcraft, o juegos alternativos totalmente nuevos, con nuevos objetivos, unidades, objetos y eventos; Defense of the Ancients es de este último tipo. &lt;br /&gt;
&lt;br /&gt;
Al obtener inspiración de un popular mod de Starcraft conocido como Aeon of Strife, la primera versión de DotA fue liberada a mediados de [[2003]] por un individuo conocido solo por su alias &amp;quot;Eul&amp;quot;. En el DotA original de Eul, los jugadores podían elegir uno de 32 héroes y tener hasta seis ítems de forma simultánea de una bolsa con 39 opciones diferentes. Este rudimentario predecesor del actual DotA pavimentó el camino para futuras innovaciones que han llegado al éxito hasta hoy. El [[29 de mayo|29 de Mayo]] del [[2003|2003]], Blizzard liberó oficialmente el paquete de expansión [[Warcraft III: The Frozen Throne]] que sumaba una inmensurable cantidad de nuevas características a Warcraft III, incluyendo un nuevo, mucho más completo y mejorado editor de mundo (World Editor). Esta nueva herramienta entregó a los creadores de mapas muchas más opciones de costumización de items, skills, modelos, tiles, etc. Utilizando estas nuevas herramientas aparecieron muchas variaciones del Dota original, incluyendo la primera versión hecha por Steve “Guinsoo” Feak, Defense of the Ancients: Allstars que es el foco de este postmortem. &lt;br /&gt;
&lt;br /&gt;
Guinsoo en un principio inició el desarrollo de Dota Allstars a causa de que estaba frustrado con la cantidad de bugs y problemas de balance que, la versión más famosa de DotA tenía en ese entonces. Su intención original no era iniciar un proyecto a gran escala, si no, simplemente crear una versión de juego más entretenida para sus amigos y para él. Después de pasarlo bien con estos cambios iniciales, de a poco le empezó a gustar cada vez más el actuar como editor de mapa, por lo que empezó a expandir sus nuevas actualizaciones. Eul no actualizó el escenario, por lo que fueron otros autores quienes se encargaron de realizar dicha actualización, y actualizar posteriormente el juego. &lt;br /&gt;
&lt;br /&gt;
Numerosas variantes del juego se han realizado basadas en el mapa original, pero Allstars es la versión que volvió popular el juego. A partir de la versión 6.x, otro autor con el nombre de «IceFrog» se puso a cargo del desarrollo del escenario, corrigiendo errores y añadiendo o actualizando características del juego. Cada versión nueva se acompaña de un registro de cambios. &lt;br /&gt;
&lt;br /&gt;
El juego tiene un fuerte apoyo comunitario, mantenido mediante foros oficiales. Allí, los usuarios pueden comentar ideas para nuevos héroes u objetos, e indicar sugerencias de todo tipo. El mapa puede obtenerse de forma gratuita en diversos sitios de descarga, y en Battle.net mediante transferencia directa al iniciar una partida. Al igual que cualquier escenario creado con el editor de mapas de Warcraft III, la distribución de DotA no puede realizarse con fines comerciales de ningún tipo. &lt;br /&gt;
&lt;br /&gt;
Algunas versiones del escenario con oponentes controlados por inteligencia artificial han sido desarrolladas.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jugabilidad  ==&lt;br /&gt;
&lt;br /&gt;
En una partida de Defense of the Ancients siempre hay exactamente dos equipos de jugadores: los Centinelas (The Sentinel) y el Azote (The Scourge). El equipo de los Centinelas tiene su punto de inicio en la esquina inferior izquierda del mapa, mientras que el Azote tiene el suyo en la esquina superior derecha. Cada base es defendida por estructuras llamadas &amp;quot;torres&amp;quot;, y por oleadas de unidades que recorren tres caminos que unen las dos bases: una central, y dos laterales. En el fondo de cada base se encuentra el «Ancient» de cada equipo, un edificio que debe ser destruido para ganar la partida. &lt;br /&gt;
&lt;br /&gt;
Cada jugador humano controla un héroe, que es una poderosa unidad con habilidades únicas. En DotA existen una gran cantidad de héroes diferentes (104 en la versión 6.72f), cada uno con distintas habilidades y ventajas tácticas sobre los demás. El juego requiere mucho trabajo en equipo; es difícil que un solo jugador lleve a su equipo a la victoria por sí solo. El juego permite partidas con equipos de hasta 5 personas. &lt;br /&gt;
&lt;br /&gt;
Debido a que la partida se centra en el fortalecimiento de un héroe, no se requiere que el jugador se enfoque en la construcción de una base, como ocurre en la mayoría de juegos de estrategia tradicionales. Al eliminar una unidad enemiga, el jugador obtiene puntos de experiencia. Al acumular suficiente experiencia, el héroe gana un nivel, lo cual lo hace más fuerte y resistente, y le permite mejorar sus habilidades especiales. Además de obtener experiencia, el jugador obtiene un recurso monetario al eliminar enemigos: oro. Los jugadores pueden usar su oro disponible para adquirir objetos que fortalezcan a su héroe y le den nuevas habilidades adicionales. Algunos de estos objetos pueden ser combinados con otros para formar nuevos artefactos más poderosos. La compra y el manejo de los objetos es parte fundamental de una partida de DotA.&lt;br /&gt;
&lt;br /&gt;
DotA posee una gran variedad de modos de juego, que pueden ser seleccionados al inicio del partido. Dichos modos modifican diversos factores del juego, tales como la dificultad de la partida, y la selección de héroes al azar, entre otros. Algunos modos son mutuamente excluyentes, así que no pueden activarse al mismo tiempo, mientras que es posible combinar algunos otros.&lt;br /&gt;
&lt;br /&gt;
== Recepción  ==&lt;br /&gt;
&lt;br /&gt;
La popularidad de Defense of the Ancients ha aumentado con el tiempo en países de todo el mundo. En Filipinas y Tailandia, por ejemplo, es jugado tanto como el juego Counter-Strike. También es muy popular en países del norte de [[Europa]], [[Suecia]] y de [[Sudamérica]], como [[Venezuela]], [[Perú]], [[Chile]], [[Colombia]] y [[Argentina]]. &lt;br /&gt;
&lt;br /&gt;
El escenario fue presentado por Computer Gaming World en una revisión de nuevos mapas y modificaciones en Warcraft III, y fue llamado «the ultimate RTS». DotA se ha convertido en un importante escenario de torneo, empezando en el debut de la convención BlizzCon de Blizard, en el año [[2005|2005]].Allstars fue también una característica en los World Cyber Games de [[Malasia]] y [[Singapur]] en [[2005]], y de los World Cyber Games Asian Championships a partir del año [[2006|2006]]. DotA se encuentra actualmente incluido entre los juegos de las ligas internacionales Cyberathlete Amateur League y CyberEvolution. Adicionalmente, el escenario apareció en el evento Electronic Sports World Cup (ESWC) [[2008|2008]]; Oliver Paradis, administrador de competición de ESWC, apuntó que el alto nivel de apoyo comunitario que tiene el mapa fue uno de los factores que influyeron en su elección. &lt;br /&gt;
&lt;br /&gt;
En [[junio]] de [[2008]], Michael Walbridge, escribiendo para Gamasutra, afirmó que DotA es la modificación gratuita y no soportada más popular y discutida del mundo. Haciendo referencia a la gran comunidad formada alrededor del juego, Walbridge señaló que es mucho más fácil para un juego comnunitario el que sea mantenido por su comunidad, y esta es una de las grandes fortalezas del juego. &lt;br /&gt;
&lt;br /&gt;
Según [http://dotarank.com Dotarank], que lleva estadísticas de partidas y ladder de Defense of the Ancients, en los servidores oficiales de Blizzard de Battle.net se han jugado más de 500.000 partidas de DotA, por aproximadamente un millón de jugadores. &amp;lt;br&amp;gt;Blizzard apuntó que DotA es un ejemplo de lo que se puede llegar a desarrollar utilizando las herramientas de creación que se incluyen con los juegos. &lt;br /&gt;
&lt;br /&gt;
Defense of the Ancients ha sido acreditado como una influencia para el título Demigod, de Gas Powered Games. Además, ha sido citado como una inspiración para el juego Guilty Gear 2: Overture.&lt;br /&gt;
&lt;br /&gt;
== Héroes ==&lt;br /&gt;
&lt;br /&gt;
[[Anexo:Héroes del DotA|''Ver Héroes del DotA'']]&lt;br /&gt;
&lt;br /&gt;
Los héroes del DotA se dividen en 3 tipos: Fuerza, Agilidad e Inteligencia. Hasta el momento existen 104 héroes divididos en dos bandos, 53 de los Sentinel y 51 de los Scourge.&lt;br /&gt;
&lt;br /&gt;
== Véase también ==&lt;br /&gt;
&lt;br /&gt;
*[[Warcraft]]&lt;br /&gt;
*[[Warcraft III: The Frozen Throne]]&lt;br /&gt;
&lt;br /&gt;
== Enlaces externos ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.playdota.com Sitio Oficial del DotA (en inglés)]&lt;br /&gt;
*[http://www.getdota.com Sitio de Descargas del DotA]&lt;br /&gt;
*[http://www.zonadota.com Sitio Oficial del DotA (en español)]&lt;br /&gt;
*[http://foro.jovenclub.cu/index.php?board=60.0 DotA en Foro JovenClub]&lt;br /&gt;
&lt;br /&gt;
== Fuente ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.wikipedia.com| Wikipedia] &lt;br /&gt;
*[http://www.lagzero.net| Lagzero.net]&lt;br /&gt;
[[Category:Videojuegos]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=758563</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=758563"/>
		<updated>2011-07-21T17:51:21Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Distribución de procesos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Erlang'''. Es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
 ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
 Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
 ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
 Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Cuerpo de la función loop().''&lt;br /&gt;
 loop()-&amp;gt;&lt;br /&gt;
 ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
 receive Msg-&amp;gt;&lt;br /&gt;
     io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
 {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin &lt;br /&gt;
 ''% importar cuál es el segundo.''&lt;br /&gt;
  {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
 -module(math).&lt;br /&gt;
 -export([factorial/1]).&lt;br /&gt;
 factorial(0) -&amp;gt; 1;&lt;br /&gt;
 factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
&lt;br /&gt;
 -module(list).&lt;br /&gt;
 -export([quick_sort/1]).&lt;br /&gt;
 &lt;br /&gt;
 quick_sort([])-&amp;gt; [];&lt;br /&gt;
 quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
 quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
 ++ [Pivot] ++&lt;br /&gt;
 quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
 pintar(Color)-&amp;gt;&lt;br /&gt;
     case Color of&lt;br /&gt;
         “rojo”-&amp;gt;&lt;br /&gt;
             pintar_de_rojo;&lt;br /&gt;
         4-&amp;gt;&lt;br /&gt;
             pintar_de_rojo;&lt;br /&gt;
         “amarillo”-&amp;gt;&lt;br /&gt;
             pintar_de_amarillo;&lt;br /&gt;
         6-&amp;gt;&lt;br /&gt;
             pintar_de_amarillo&lt;br /&gt;
     end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
 A = 5        ''% Válido.''&lt;br /&gt;
 A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
 A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
 [Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
 &lt;br /&gt;
 ''% Ejemplo:''&lt;br /&gt;
 [X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
&lt;br /&gt;
 ''%Ejemplo:''&lt;br /&gt;
 [X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
 [{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
 pythag(N)-&amp;gt;&lt;br /&gt;
     [{A,B,C} || &lt;br /&gt;
         A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         A + B + C =&amp;lt; N,&lt;br /&gt;
         A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
 Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
                              ''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
 Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
                                    ''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
 Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
 receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
     un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=758554</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=758554"/>
		<updated>2011-07-21T17:48:37Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Lenguaje funcional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Erlang'''. Es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
 ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
 Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
 ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
 Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Cuerpo de la función loop().''&lt;br /&gt;
 loop()-&amp;gt;&lt;br /&gt;
 ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
 receive Msg-&amp;gt;&lt;br /&gt;
     io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
 {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin &lt;br /&gt;
 ''% importar cuál es el segundo.''&lt;br /&gt;
  {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
 -module(math).&lt;br /&gt;
 -export([factorial/1]).&lt;br /&gt;
 factorial(0) -&amp;gt; 1;&lt;br /&gt;
 factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
&lt;br /&gt;
 -module(list).&lt;br /&gt;
 -export([quick_sort/1]).&lt;br /&gt;
 &lt;br /&gt;
 quick_sort([])-&amp;gt; [];&lt;br /&gt;
 quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
 quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
 ++ [Pivot] ++&lt;br /&gt;
 quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
 pintar(Color)-&amp;gt;&lt;br /&gt;
     case Color of&lt;br /&gt;
         “rojo”-&amp;gt;&lt;br /&gt;
             pintar_de_rojo;&lt;br /&gt;
         4-&amp;gt;&lt;br /&gt;
             pintar_de_rojo;&lt;br /&gt;
         “amarillo”-&amp;gt;&lt;br /&gt;
             pintar_de_amarillo;&lt;br /&gt;
         6-&amp;gt;&lt;br /&gt;
             pintar_de_amarillo&lt;br /&gt;
     end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
 A = 5        ''% Válido.''&lt;br /&gt;
 A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
 A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
 [Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
 &lt;br /&gt;
 ''% Ejemplo:''&lt;br /&gt;
 [X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
&lt;br /&gt;
 ''%Ejemplo:''&lt;br /&gt;
 [X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
 [{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
 pythag(N)-&amp;gt;&lt;br /&gt;
     [{A,B,C} || &lt;br /&gt;
         A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         A + B + C =&amp;lt; N,&lt;br /&gt;
         A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=758522</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=758522"/>
		<updated>2011-07-21T17:41:13Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Lenguaje funcional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Erlang'''. Es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
 ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
 Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
 ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
 Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Cuerpo de la función loop().''&lt;br /&gt;
 loop()-&amp;gt;&lt;br /&gt;
 ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
 receive Msg-&amp;gt;&lt;br /&gt;
     io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
 {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin &lt;br /&gt;
 ''% importar cuál es el segundo.''&lt;br /&gt;
  {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
 -module(math).&lt;br /&gt;
 -export([factorial/1]).&lt;br /&gt;
 factorial(0) -&amp;gt; 1;&lt;br /&gt;
 factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
 Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
 -module(list).&lt;br /&gt;
 -export([quick_sort/1]).&lt;br /&gt;
 &lt;br /&gt;
 quick_sort([])-&amp;gt; [];&lt;br /&gt;
 quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
 quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
 ++ [Pivot] ++&lt;br /&gt;
 quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
 pintar(Color)-&amp;gt;&lt;br /&gt;
     case Color of&lt;br /&gt;
         “rojo”-&amp;gt;&lt;br /&gt;
             pintar_de_rojo;&lt;br /&gt;
         4-&amp;gt;&lt;br /&gt;
             pintar_de_rojo;&lt;br /&gt;
         “amarillo”-&amp;gt;&lt;br /&gt;
             pintar_de_amarillo;&lt;br /&gt;
         6-&amp;gt;&lt;br /&gt;
             pintar_de_amarillo&lt;br /&gt;
     end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
 A = 5        ''% Válido.''&lt;br /&gt;
 A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
 A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
 [Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
 &lt;br /&gt;
 ''% Ejemplo:''&lt;br /&gt;
 [X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
&lt;br /&gt;
 ''%Ejemplo:''&lt;br /&gt;
 [X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
 [{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
 pythag(N)-&amp;gt;&lt;br /&gt;
     [{A,B,C} || &lt;br /&gt;
         A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
         A + B + C =&amp;lt; N,&lt;br /&gt;
         A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=758499</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=758499"/>
		<updated>2011-07-21T17:37:41Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Acoplamiento de patrones (Pattern-Matching) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Erlang'''. Es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
 ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
 Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
 ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
 Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Cuerpo de la función loop().''&lt;br /&gt;
 loop()-&amp;gt;&lt;br /&gt;
 ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
 receive Msg-&amp;gt;&lt;br /&gt;
     io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
 {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin &lt;br /&gt;
 ''% importar cuál es el segundo.''&lt;br /&gt;
  {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
-module(math).&lt;br /&gt;
-export([factorial/1]).&lt;br /&gt;
factorial(0) -&amp;gt; 1;&lt;br /&gt;
factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
-module(list).&lt;br /&gt;
-export([quick_sort/1]).&lt;br /&gt;
    &lt;br /&gt;
quick_sort([])-&amp;gt; [];&lt;br /&gt;
quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
++ [Pivot] ++&lt;br /&gt;
quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
pintar(Color)-&amp;gt;&lt;br /&gt;
case Color of&lt;br /&gt;
“rojo”-&amp;gt;&lt;br /&gt;
pintar_de_rojo;&lt;br /&gt;
4-&amp;gt;&lt;br /&gt;
pintar_de_rojo;&lt;br /&gt;
“amarillo”-&amp;gt;&lt;br /&gt;
pintar_de_amarillo;&lt;br /&gt;
6-&amp;gt;&lt;br /&gt;
pintar_de_amarillo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
A = 5        ''% Válido.''&lt;br /&gt;
A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
[Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
[X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
           &lt;br /&gt;
Ejemplo:&lt;br /&gt;
[X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
[{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
pythag(N)-&amp;gt;&lt;br /&gt;
[{A,B,C} || &lt;br /&gt;
A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
A + B + C =&amp;lt; N,&lt;br /&gt;
A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=758491</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=758491"/>
		<updated>2011-07-21T17:36:42Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Lenguaje de alto nivel basado en procesos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Erlang'''. Es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
 ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
 Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
 ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
 Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 ''% Cuerpo de la función loop().''&lt;br /&gt;
 loop()-&amp;gt;&lt;br /&gt;
 ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
 receive Msg-&amp;gt;&lt;br /&gt;
     io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
{_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin importar cuál es el segundo.''&lt;br /&gt;
{perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
-module(math).&lt;br /&gt;
-export([factorial/1]).&lt;br /&gt;
factorial(0) -&amp;gt; 1;&lt;br /&gt;
factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
-module(list).&lt;br /&gt;
-export([quick_sort/1]).&lt;br /&gt;
    &lt;br /&gt;
quick_sort([])-&amp;gt; [];&lt;br /&gt;
quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
++ [Pivot] ++&lt;br /&gt;
quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
pintar(Color)-&amp;gt;&lt;br /&gt;
case Color of&lt;br /&gt;
“rojo”-&amp;gt;&lt;br /&gt;
pintar_de_rojo;&lt;br /&gt;
4-&amp;gt;&lt;br /&gt;
pintar_de_rojo;&lt;br /&gt;
“amarillo”-&amp;gt;&lt;br /&gt;
pintar_de_amarillo;&lt;br /&gt;
6-&amp;gt;&lt;br /&gt;
pintar_de_amarillo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
A = 5        ''% Válido.''&lt;br /&gt;
A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
[Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
[X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
           &lt;br /&gt;
Ejemplo:&lt;br /&gt;
[X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
[{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
pythag(N)-&amp;gt;&lt;br /&gt;
[{A,B,C} || &lt;br /&gt;
A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
A + B + C =&amp;lt; N,&lt;br /&gt;
A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=758488</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=758488"/>
		<updated>2011-07-21T17:35:47Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Lenguaje de alto nivel basado en procesos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div align=&amp;quot;justify&amp;quot;&amp;gt;&lt;br /&gt;
'''Erlang'''. Es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
 ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
 Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
 ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
 Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
 ''% Cuerpo de la función loop().''&lt;br /&gt;
 loop()-&amp;gt;&lt;br /&gt;
 ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
 receive Msg-&amp;gt;&lt;br /&gt;
     io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
 end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
{_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin importar cuál es el segundo.''&lt;br /&gt;
{perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
-module(math).&lt;br /&gt;
-export([factorial/1]).&lt;br /&gt;
factorial(0) -&amp;gt; 1;&lt;br /&gt;
factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
-module(list).&lt;br /&gt;
-export([quick_sort/1]).&lt;br /&gt;
    &lt;br /&gt;
quick_sort([])-&amp;gt; [];&lt;br /&gt;
quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
++ [Pivot] ++&lt;br /&gt;
quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
pintar(Color)-&amp;gt;&lt;br /&gt;
case Color of&lt;br /&gt;
“rojo”-&amp;gt;&lt;br /&gt;
pintar_de_rojo;&lt;br /&gt;
4-&amp;gt;&lt;br /&gt;
pintar_de_rojo;&lt;br /&gt;
“amarillo”-&amp;gt;&lt;br /&gt;
pintar_de_amarillo;&lt;br /&gt;
6-&amp;gt;&lt;br /&gt;
pintar_de_amarillo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
A = 5        ''% Válido.''&lt;br /&gt;
A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
[Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
[X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
           &lt;br /&gt;
Ejemplo:&lt;br /&gt;
[X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
[{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
pythag(N)-&amp;gt;&lt;br /&gt;
[{A,B,C} || &lt;br /&gt;
A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
A + B + C =&amp;lt; N,&lt;br /&gt;
A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733842</id>
		<title>Lenguaje de Programación C Sharp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733842"/>
		<updated>2011-07-11T22:20:19Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre= C#&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen= Cshar1.JPG&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción= Lenguaje de Programación Orientado a Objetos.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador= [[Microsoft]] Corporation.&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial= [[2001]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos= &lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia= Comercial.&lt;br /&gt;
|premios=&lt;br /&gt;
|web= http://www.microsoft.com/net&lt;br /&gt;
}}&lt;br /&gt;
'''C#''' (pronunciado si sharp en inglés) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por [[Microsoft]] como parte de su [[plataforma.NET]], que después fue aprobado como un estándar por la [[ECMA]] e [[ISO]]. &lt;br /&gt;
&lt;br /&gt;
== Características  ==&lt;br /&gt;
&lt;br /&gt;
Su sintaxis básica deriva de C/[[C++]] y utiliza el modelo de objetos de la plataforma.NET el cual es similar al de [[Lenguaje de programación Java|Java]] aunque incluye mejoras derivadas de otros lenguajes (entre ellos [[Delphi]]).&lt;br /&gt;
&lt;br /&gt;
La creación del nombre del lenguaje, C♯, proviene de dibujar dos signos positivos encima de los dos signos positivos de &amp;quot;C++&amp;quot;, queriendo dar una imagen de salto evolutivo del mismo modo que ocurrió con el paso de C a C++.&lt;br /&gt;
&lt;br /&gt;
C♯, como parte de la plataforma.NET, está normalizado por [[ECMA]] desde diciembre de [[2001]] ([http://www.ecma-international.org/publications/standards/Ecma-334.htm C# Language Specification] &amp;quot;Especificación del lenguaje C♯&amp;quot;). El [[7 de noviembre]] de [[2005]]  salió la versión 2.0 del lenguaje que incluía mejoras tales como tipos genéricos, métodos anónimos, iteradores, tipos parciales y tipos anulables. El [[19 de noviembre de 2007]] salió la versión 3.0 de C# destacando entre las mejoras los tipos implícitos, [[tipos anónimos]] y  [[LINQ]] (''Language Integrated Query'' -consulta integrada en el lenguaje).&lt;br /&gt;
&lt;br /&gt;
Aunque C♯ forma parte de la plataforma.NET, ésta es una [[interfaz de programación de aplicaciones]] ('''API'''); mientras que C♯ es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un [[compilador]] implementado que provee el marco de [[DotGNU]] - [[Proyecto Mono|Mono]] que genera programas para distintas plataformas como [[Win32]], [[UNIX]] y [[Linux]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Durante el desarrollo de la plataforma .NET, las [[bibliotecas de clases]] fueron escritas originalmente en el [[Lenguaje de Programación C|lenguaje]] compilador [[Simple Managed C]].En enero de [[1999]], [[Anders Hejlsberg]] formó un equipo con la misión de desarrollar un nuevo lenguaje de programación llamado Cool (C [[Programación Orientada a Objetos|Orientado a Objetos]]). Este nombre tuvo que ser cambiado debido a problemas de marca pasando a llamarse C♯ aunque habitualmente se escribe C#.&amp;lt;ref&amp;gt;Visual C# Developer Center, [http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&amp;lt;/ref&amp;gt; La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje.&lt;br /&gt;
&lt;br /&gt;
[[Hejlsberg]] lideró el proyecto de desarrollo de C♯. Anteriormente, ya participó en el desarrollo de otros lenguajes como [[Turbo Pascal]], [[J++]] y [[Borland Delphi]]&lt;br /&gt;
&lt;br /&gt;
== Tipos de datos ==&lt;br /&gt;
&lt;br /&gt;
C♯ contiene dos categorías generales de tipos de datos integrados: '''tipos de valor''' y '''tipos de referencia'''. El término '''tipo de valor''' indica que esos tipos contienen directamente sus valores. &lt;br /&gt;
&lt;br /&gt;
C♯ define ocho tipos de enteros, a saber:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de enteros&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De 0 a 255&lt;br /&gt;
| Entero sin signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De -128 a 127&lt;br /&gt;
| Entero con signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| 16&lt;br /&gt;
| De -32.768 a 32.767&lt;br /&gt;
| Entero corto&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65.535&lt;br /&gt;
| Entero corto sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| 32&lt;br /&gt;
| De -2.147.483.648 a 2.147.483.647&lt;br /&gt;
| Entero medio&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 0 a 4.294.967.295&lt;br /&gt;
| Entero medio sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| 64&lt;br /&gt;
| De -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807&lt;br /&gt;
| Entero largo&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 0 a 18.446.744.073.709.551.615&lt;br /&gt;
| Entero largo sin signo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los tipos de [[punto flotante]] pueden representar números con [[componentes fraccionales]]. Existen dos clases de tipos de punto flotante; '''float''' y '''double'''. El tipo '''double''' es el más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C♯ usan valores '''double'''. Quizá, el tipo flotante más interesante de C♯ es '''decimal''', dirigido al uso de cálculos monetarios. La aritmética de punto flotante normal está sujeta a una variedad de errores de redondeo cuando se aplica a valores decimales. El tipo '''decimal''' elimina estos errores y puede representar hasta 28 lugares decimales.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de punto flotante&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 1,5E-45 a 3,4E+38&lt;br /&gt;
| Punto flotante corto&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 5E-324 a 1,7E+308&lt;br /&gt;
| Punto flotante largo&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| 128&lt;br /&gt;
| De 1E-28 a 7,9E+28&lt;br /&gt;
| Punto flotante monetario&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los caracteres en C♯ no son cantidades de 8 bits como en otros muchos lenguajes de programación. Por el contrario, C♯ usa un tipo de caracteres de 16 bits llamado [[Unicode]] al cual se le llama '''char'''. No existen conversiones automáticas de tipo entero a '''char'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de caracteres&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65,535 (código Unicode)&lt;br /&gt;
| Carácter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos lógicos&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| 1&lt;br /&gt;
| true or false, no se usa 1 ó 0 ya que no hay conversión definida&lt;br /&gt;
| true or false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
No existe una conversión definida entre '''bool''' y los valores enteros (1 no se convierte a verdadero ni 0 se convierte a falso).&lt;br /&gt;
&lt;br /&gt;
== Constantes ==&lt;br /&gt;
&lt;br /&gt;
Las constantes en C♯ se denominan ''literales''. Todas las constantes tienen un tipo de dato, en caso de ser una constante entera se usa la de menor tamaño que pueda alojarla, empezando por '''int'''. En caso de punto flotante se considera como un '''double'''. Sin embargo se puede especificar explícitamente el tipo de dato que una constante deberá usar, por medio de los sufijos:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Sufijo&lt;br /&gt;
! Tipo de dato&lt;br /&gt;
! Ejemplo&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| long&lt;br /&gt;
| 12L&lt;br /&gt;
|-&lt;br /&gt;
| UL&lt;br /&gt;
| ulong&lt;br /&gt;
| 68687UL&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| float&lt;br /&gt;
| 10,19F&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| decimal&lt;br /&gt;
| 9,95M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En ocasiones, resulta más sencillo usar un sistema numérico basado en 16 en lugar de 10, para tal caso C♯ permite especificar constantes enteras en formato [[hexadecimal]], y se hace empezando con '''0x'''. Por ejemplo: '''0xFF''' equivale a 255 en decimal.&lt;br /&gt;
&lt;br /&gt;
C♯ tiene caracteres denominados '''secuencias de escape''' para facilitar la escritura con el teclado de símbolos que carecen de representación visual. Estos son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Secuencia de escape&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| \a&lt;br /&gt;
| Alerta (timbre)&lt;br /&gt;
|-&lt;br /&gt;
| \b&lt;br /&gt;
| Retroceso&lt;br /&gt;
|-&lt;br /&gt;
| \f&lt;br /&gt;
| Avance de página&lt;br /&gt;
|-&lt;br /&gt;
| \n&lt;br /&gt;
| Nueva línea&lt;br /&gt;
|-&lt;br /&gt;
| \r&lt;br /&gt;
| Retorno de carro&lt;br /&gt;
|-&lt;br /&gt;
| \t&lt;br /&gt;
| Tabulador horizontal&lt;br /&gt;
|-&lt;br /&gt;
| \v&lt;br /&gt;
| Tabulador vertical&lt;br /&gt;
|-&lt;br /&gt;
| \0&lt;br /&gt;
| Nulo&lt;br /&gt;
|-&lt;br /&gt;
| \'&lt;br /&gt;
| Comilla sencilla&lt;br /&gt;
|-&lt;br /&gt;
| \&amp;quot;&lt;br /&gt;
| Comilla doble&lt;br /&gt;
|-&lt;br /&gt;
| \\&lt;br /&gt;
| Diagonal invertida&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
C♯, al igual que [[C++]], es compatible con el tipo de constante cadena de [[caracteres]]. Dentro de la cadena de caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo '''@''' seguido por una cadena entre comillas, en tal caso, las secuencias de escape no tienen efecto y además la cadena puede ocupar dos o más líneas.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Toda [[variable]] se debe declarar antes de ser utilizada. La forma en que se declara una variable en C♯ es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tipo nombre_variable;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para asignar un valor a una variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nombre_variable = valor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las conversiones de tipo de variables en C♯ se representan en la siguiente tabla en donde la fila es el origen y la columna el destino. Los significados de las letras son: '''A''' (Conversión automática o implícita), '''E''' (Conversión explícita), '''I''' (Conversión incompatible).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=14 | Conversiones de tipo de datos&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! '''byte'''&lt;br /&gt;
! '''sbyte'''&lt;br /&gt;
! '''short'''&lt;br /&gt;
! '''ushort'''&lt;br /&gt;
! '''int'''&lt;br /&gt;
! '''uint'''&lt;br /&gt;
! '''long'''&lt;br /&gt;
! '''ulong'''&lt;br /&gt;
! '''float'''&lt;br /&gt;
! '''double'''&lt;br /&gt;
! '''decimal'''&lt;br /&gt;
! '''char'''&lt;br /&gt;
! '''bool'''&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
|&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Toda conversión implícita no ocasiona pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* Es posible (mas no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen.&lt;br /&gt;
* La conversión explícita se realiza de la siguiente forma: &amp;lt;code&amp;gt;(tipo-destino) expresion&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden:&lt;br /&gt;
&lt;br /&gt;
# Si un operando es '''decimal''', el otro operando se transforma a '''decimal'''.&lt;br /&gt;
# Si un operando es '''double''', el otro operando se transforma a '''double'''.&lt;br /&gt;
# Si un operando es '''float''', el otro operando se transforma a '''float'''.&lt;br /&gt;
# Si un operando es '''ulong''', el otro operando se transforma a '''ulong'''.&lt;br /&gt;
# Si un operando es '''long''', el otro operando se transforma a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', y si el otro operando es de tipo '''sbyte''', '''short''' o '''int''', los dos se transforman a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', el otro operando se transforma a '''uint'''.&lt;br /&gt;
# Si ninguno de los casos anteriores, los dos operandos se transforman a '''int'''.&lt;br /&gt;
&lt;br /&gt;
== Operadores ==&lt;br /&gt;
&lt;br /&gt;
C♯ tiene cuatro clases generales de [[operadores]]: '''[[Operadores aritméticos|aritméticos]]''', '''a nivel de bit''', '''relacionales''' y '''lógicos'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=3 | Operadores&lt;br /&gt;
|-&lt;br /&gt;
! Operador&lt;br /&gt;
! Significado&lt;br /&gt;
! Tipo&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
| Suma&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Resta&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
| Producto&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
| División&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
| Módulo (residuo entero)&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ++&lt;br /&gt;
| Incremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Decremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
| Igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
| Distinto que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
| Mayor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
| Menor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
| Mayor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
| Menor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&lt;br /&gt;
| AND&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
| XOR y de nivel de bits&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
| AND de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| !&lt;br /&gt;
| NOT&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| ~&lt;br /&gt;
| Complemento a uno&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&amp;lt;&lt;br /&gt;
| Desplazamiento a la izquierda&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&amp;gt;&lt;br /&gt;
| Desplazamiento a la derecha&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Los [[operadores aritméticos]] funcionan igual que en C y [[C++]].&lt;br /&gt;
* El resultado de los [[operadores relacionales]] y lógicos es un valor '''bool'''.&lt;br /&gt;
* Los [[operadores de cortocircuito]] evalúan el segundo operando solo cuando es necesario.&lt;br /&gt;
* Los [[operadores a nivel de bit]] no se pueden aplicar a tipos '''bool''', '''float''', '''double''' o '''decimal'''.&lt;br /&gt;
&lt;br /&gt;
== Instrucciones de control ==&lt;br /&gt;
&lt;br /&gt;
* La instrucción '''if-else''' es básicamente igual que en C, C++ y [[Java]].&lt;br /&gt;
* La diferencia de la instrucción '''switch''' con la versión de C, C++ y Java es que todo cuerpo perteneciente a un '''case''' debe de toparse con un '''break''' o un '''goto''' antes de toparse con otro '''case''', a menos que dicho cuerpo esté vacío.&lt;br /&gt;
* La instrucción '''for''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''do-while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''foreach''' realiza un ciclo a través de los elementos de una colección (grupo de objetos). El formato de esta instrucción es: &amp;lt;code&amp;gt;foreach(tipo variable in coleccion) instruccion;&amp;lt;/code&amp;gt;. En este ciclo se recorre la colección y la variable recibe un respectivo elemento de dicha colección en cada iteración.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''break''' permite forzar la salida de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''continue''' permite forzar la repetición temprana de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* La instrucción '''return''' es básicamente igual que en C, C++. Se utiliza para devolver un valor y salir de un método.&lt;br /&gt;
* La instrucción '''goto''' se sigue utilizando en C♯ a pesar de toda la polémica que esto conlleva.&lt;br /&gt;
&lt;br /&gt;
== Métodos ==&lt;br /&gt;
&lt;br /&gt;
* Todo método debe de ser parte de una clase, no existen métodos globales.&lt;br /&gt;
* De forma predeterminada, los parámetros se pasan por valor (se copia dicho valor).&lt;br /&gt;
* El modificador '''ref''' fuerza a pasar los parámetros por referencia en vez de pasarlos por valor.&lt;br /&gt;
* El modificador '''out''' es similar al modificador '''ref''' con una excepción: sólo se puede utilizar para pasar un valor fuera de un método. El método debe de asignar un valor al parámetro antes de que el método finalice.&lt;br /&gt;
* Cuando '''ref''' y '''out''' modifican un parámetro de referencia, la propia referencia se pasa por referencia.&lt;br /&gt;
* El modificador '''params''' sirve para definir un número variable de argumentos los cuales se implementan como una matriz. Ejemplo: &amp;lt;code&amp;gt;public int maxVal(params int[] nums){...}&amp;lt;/code&amp;gt;, esta función se podría llamar así: &amp;lt;code&amp;gt;maxVal(23,3,a,-12);&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un método debe tener como máximo un único parámetro '''params''' y éste debe de ser el último.&lt;br /&gt;
* Un método puede devolver cualquier tipo de datos, incluyendo tipos de clase.&lt;br /&gt;
* Ya que en C# las [[matrices]] se implementan como objetos, un método también puede devolver una [[matriz]] (algo que se diferencia de C++ en que las matrices no son válidas como tipos de valores devueltos).&lt;br /&gt;
* C♯ implementa '''sobrecarga de métodos''', dos o más métodos pueden tener el mismo nombre siempre y cuando se diferencien por sus parámetros.&lt;br /&gt;
* El método '''Main''' es un método especial al cual se refiere el punto de partida del programa. Tiene la siguiente sintaxis: &amp;lt;code&amp;gt;public static int Main(string[] args){...}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Clases y objetos ==&lt;br /&gt;
&lt;br /&gt;
Varios puntos a tener en cuenta en C♯ con respecto a [[clases]] y [[objetos]] son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Una [[variable de objeto]] de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java).&lt;br /&gt;
* El operador de asignación no copia los valores de un objeto, sino su referencia a él (al igual que Java).&lt;br /&gt;
* Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.&lt;br /&gt;
* Un constructor no devuelve ningún valor.&lt;br /&gt;
* Al igual que los métodos, los constructores también pueden ser sobrecargados.&lt;br /&gt;
* Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor de '''0''', '''null''' o '''false''' según corresponda.&lt;br /&gt;
* Para crear un nuevo objeto se utiliza la siguiente sintaxis: &amp;lt;code&amp;gt;variable = new nombre_clase();&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un destructor se declara como un constructor, aunque va precedido por un signo de tilde ~.&lt;br /&gt;
* Se emplea una desasignación de memoria de objetos no referenciados (recolección de basura), y cuando esto ocurre se ejecuta el destructor de dicha clase.&lt;br /&gt;
* El destructor de una clase no se llama cuando un objeto sale del ámbito.&lt;br /&gt;
* Todos los destructores se llamarán antes de que finalice un programa.&lt;br /&gt;
* La palabra clave '''this''' es un apuntador al mismo objeto en el cual se usa.&lt;br /&gt;
* La palabra clave '''static''' hace que un miembro pertenezca a una clase en vez de pertener a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto.&lt;br /&gt;
* Un método '''static''' no tiene una referencia '''this'''.&lt;br /&gt;
* Un método '''static''' puede llamar sólo a otros métodos '''static'''.&lt;br /&gt;
* Un método '''static''' sólo debe tener acceso directamente a datos '''static'''.&lt;br /&gt;
* Un constructor '''static''' se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia.&lt;br /&gt;
* C♯ permite la sobrecarga de operadores con la palabra clave '''operator'''&lt;br /&gt;
&lt;br /&gt;
== Matrices ==&lt;br /&gt;
&lt;br /&gt;
* En C♯ las matrices se implementan como objetos.&lt;br /&gt;
* Para crear una matriz se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[] nombre_matriz = new tipo[tamaño];&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se puede crear una matriz inicializada así: &amp;lt;code&amp;gt;tipo[] nombre_matriz = { val1 , val2 , val3 , ... , valN };&amp;lt;/code&amp;gt;&lt;br /&gt;
* Los índices de las matrices comienzan en 0.&lt;br /&gt;
* Para crear una matriz '''bidimensional''' se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[,] nombre_matriz = new tipo[filas,columnas]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para referirse a un elemento de una matriz bidimensional no se usa la forma &amp;lt;code&amp;gt;matriz[fila][columna]&amp;lt;/code&amp;gt; (la cual usa C++), si no &amp;lt;code&amp;gt;matriz[fila,columna]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ya que C♯ implementa matrices como objetos, cada matriz tiene asociada una propiedad '''Length''' que contiene el número de elementos que puede alojar cada matriz.&lt;br /&gt;
&lt;br /&gt;
== Cadenas de caracteres ==&lt;br /&gt;
&lt;br /&gt;
* El tipo de dato cadena se llama '''string'''.&lt;br /&gt;
* Realmente la palabra clave '''string''' es un alias de la clase '''System.String''' de la plataforma .NET.&lt;br /&gt;
* En C♯ las cadenas son objetos y no una matriz de caracteres, aun así, se puede obtener un carácter arbitrario de una cadena por medio de su índice (mas no modificarlo).&lt;br /&gt;
* La forma más común de construir una cadena es por medio de una literal o constante: &amp;lt;code&amp;gt;string str = &amp;quot;Una cadena&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
* El operador '''==''' determina si dos referencias hacen referencia al mismo objeto, pero al usar dicho operador con dos operandos tipo '''string''' se prueba la igualdad del contenido de las cadenas y no su referencia. Sin embargo, con el resto de los operadores relacionales, como '''&amp;lt;''' o '''&amp;gt;=''' se comparan las referencias.&lt;br /&gt;
* Se pueden concatenar (unir) dos cadenas mediante el operador '''+'''.&lt;br /&gt;
* Las cadenas son inmutables, una vez creadas no se pueden modificar, solo se pueden copiar total o parcialmente.&lt;br /&gt;
* Las cadenas se pueden usar en las instrucciones '''switch'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Métodos comunes de control de cadenas&lt;br /&gt;
|-&lt;br /&gt;
! Método&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;static string Copy(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una copia de str.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int CompareTo(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve menor que cero si la cadena que llama es menor que str, mayor que cero si la cadena que llama es mayor que str, y cero si las cadenas son iguales.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int IndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str.&lt;br /&gt;
Devuelve el índice de la primera coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int LastIndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str. Devuelve el índice de la última coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToLower&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en minúsculas de la cadena que llama.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToUpper&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en mayúsculas de la cadena que llama.&lt;br /&gt;
|}&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
*'''Crear una variable del tipo string y mostrarla en un mensaje'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;   &lt;br /&gt;
   using System;&lt;br /&gt;
   public void ejemplo()&lt;br /&gt;
   {&lt;br /&gt;
   string Var1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
   MessageBox.Show(Var1);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiladores ==&lt;br /&gt;
&lt;br /&gt;
En la actualidad existen los siguientes [[compilador]]es para el lenguaje C♯:&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK] incluye un compilador de C♯, pero no un [[Entorno de desarrollo integrado|IDE]].&lt;br /&gt;
*  [[Microsoft Visual Studio|Microsoft Visual Studio]], IDE por excelencia de este lenguaje, versión 2002, 2003, 2005, 2008 y 2010(beta).&lt;br /&gt;
* [[SharpDevelop|#develop]], es un IDE [[Software libre|libre]] para C♯ bajo licencia [[GNU LGPL|LGPL]], muy similar a Microsoft Visual C#.&lt;br /&gt;
* [[Proyecto Mono|Mono]], es una implementación [[Licencia pública general de GNU|GPL]] de todo el entorno [[.NET de Microsoft|.NET]] desarrollado por [[Novell]]. Como parte de esta implementación se incluye un compilador de C♯.&lt;br /&gt;
* [[Delphi]] 2006, de [[Borland]] Software Corporation.&lt;br /&gt;
* [[dotGNU]] [[Portable.NET]], de la [[Free Software Foundation]].&lt;br /&gt;
&lt;br /&gt;
== Metas del diseño del lenguaje ==&lt;br /&gt;
&lt;br /&gt;
El estándar [[ECMA]] lista las siguientes metas en el diseño para C♯:&lt;br /&gt;
&lt;br /&gt;
* Lenguaje de programación orientado a objetos '''simple, moderno y de propósito general'''.&lt;br /&gt;
* Inclusión de principios de [[ingeniería de software]] tales como revisión estricta de los tipos de datos, revisión de límites de vectores, detección de intentos de usar variables no inicializadas, y recolección de basura automática.&lt;br /&gt;
* Capacidad para desarrollar [[componentes de software]] que se puedan usar en ambientes distribuidos.&lt;br /&gt;
* [[aplicaciones portables|Portabilidad del código fuente]]&lt;br /&gt;
* Fácil migración del programador al nuevo lenguaje, especialmente para programadores familiarizados con C y [[C++]].&lt;br /&gt;
* Soporte para [[Internacionalización (computación)|internacionalización]]&lt;br /&gt;
* Adecuación para escribir aplicaciones de cualquier tamaño: desde las más grandes y sofisticadas como [[sistemas operativos]] hasta las más pequeñas funciones.&lt;br /&gt;
* Aplicaciones económicas en cuanto a memoria y procesado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[ExtendedVisualOtp]], framework para el desarrollo de aplicaciones cliente-servidor en tiempo real utilizando C Sharp y [[Erlang]].&lt;br /&gt;
&lt;br /&gt;
==Fuente==&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK]&lt;br /&gt;
*[http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&lt;br /&gt;
*[http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml]&lt;br /&gt;
*[http://www.desarrolloweb.com/articulos/499.php http://www.desarrolloweb.com/articulos/499.php]&lt;br /&gt;
*[http://es.wikipedia.org/wiki/C_sharp Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programación]][[Category:Informática]]&lt;br /&gt;
[[Category:Lenguajes_de_programación_orientada_a_objetos]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733839</id>
		<title>Lenguaje de Programación C Sharp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733839"/>
		<updated>2011-07-11T22:19:20Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre= C#&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen= Cshar1.JPG&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción= Lenguaje de Programación Orientado a Objetos.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador= [[Microsoft]] Corporation.&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial= [[2001]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos= &lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia= Comercial.&lt;br /&gt;
|premios=&lt;br /&gt;
|web= http://www.microsoft.com/net&lt;br /&gt;
}}&lt;br /&gt;
'''C#''' (pronunciado si sharp en inglés) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por [[Microsoft]] como parte de su [[plataforma.NET]], que después fue aprobado como un estándar por la [[ECMA]] e [[ISO]]. &lt;br /&gt;
&lt;br /&gt;
== Características  ==&lt;br /&gt;
&lt;br /&gt;
Su sintaxis básica deriva de C/[[C++]] y utiliza el modelo de objetos de la plataforma.NET el cual es similar al de [[Lenguaje de programación Java|Java]] aunque incluye mejoras derivadas de otros lenguajes (entre ellos [[Delphi]]).&lt;br /&gt;
&lt;br /&gt;
La creación del nombre del lenguaje, C♯, proviene de dibujar dos signos positivos encima de los dos signos positivos de &amp;quot;C++&amp;quot;, queriendo dar una imagen de salto evolutivo del mismo modo que ocurrió con el paso de C a C++.&lt;br /&gt;
&lt;br /&gt;
C♯, como parte de la plataforma.NET, está normalizado por [[ECMA]] desde diciembre de [[2001]] ([http://www.ecma-international.org/publications/standards/Ecma-334.htm C# Language Specification] &amp;quot;Especificación del lenguaje C♯&amp;quot;). El [[7 de noviembre]] de [[2005]]  salió la versión 2.0 del lenguaje que incluía mejoras tales como tipos genéricos, métodos anónimos, iteradores, tipos parciales y tipos anulables. El [[19 de noviembre de 2007]] salió la versión 3.0 de C# destacando entre las mejoras los tipos implícitos, [[tipos anónimos]] y  [[LINQ]] (''Language Integrated Query'' -consulta integrada en el lenguaje).&lt;br /&gt;
&lt;br /&gt;
Aunque C♯ forma parte de la plataforma.NET, ésta es una [[interfaz de programación de aplicaciones]] ('''API'''); mientras que C♯ es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un [[compilador]] implementado que provee el marco de [[DotGNU]] - [[Proyecto Mono|Mono]] que genera programas para distintas plataformas como [[Win32]], [[UNIX]] y [[Linux]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Durante el desarrollo de la plataforma .NET, las [[bibliotecas de clases]] fueron escritas originalmente en el [[Lenguaje de Programación C|lenguaje]] compilador [[Simple Managed C]].En enero de [[1999]], [[Anders Hejlsberg]] formó un equipo con la misión de desarrollar un nuevo lenguaje de programación llamado Cool (C [[Programación Orientada a Objetos|Orientado a Objetos]]). Este nombre tuvo que ser cambiado debido a problemas de marca pasando a llamarse C♯ aunque habitualmente se escribe C#.&amp;lt;ref&amp;gt;Visual C# Developer Center, [http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&amp;lt;/ref&amp;gt; La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje.&lt;br /&gt;
&lt;br /&gt;
[[Hejlsberg]] lideró el proyecto de desarrollo de C♯. Anteriormente, ya participó en el desarrollo de otros lenguajes como [[Turbo Pascal]], [[J++]] y [[Borland Delphi]]&lt;br /&gt;
&lt;br /&gt;
== Tipos de datos ==&lt;br /&gt;
&lt;br /&gt;
C♯ contiene dos categorías generales de tipos de datos integrados: '''tipos de valor''' y '''tipos de referencia'''. El término '''tipo de valor''' indica que esos tipos contienen directamente sus valores. &lt;br /&gt;
&lt;br /&gt;
C♯ define ocho tipos de enteros, a saber:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de enteros&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De 0 a 255&lt;br /&gt;
| Entero sin signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De -128 a 127&lt;br /&gt;
| Entero con signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| 16&lt;br /&gt;
| De -32.768 a 32.767&lt;br /&gt;
| Entero corto&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65.535&lt;br /&gt;
| Entero corto sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| 32&lt;br /&gt;
| De -2.147.483.648 a 2.147.483.647&lt;br /&gt;
| Entero medio&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 0 a 4.294.967.295&lt;br /&gt;
| Entero medio sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| 64&lt;br /&gt;
| De -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807&lt;br /&gt;
| Entero largo&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 0 a 18.446.744.073.709.551.615&lt;br /&gt;
| Entero largo sin signo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los tipos de [[punto flotante]] pueden representar números con [[componentes fraccionales]]. Existen dos clases de tipos de punto flotante; '''float''' y '''double'''. El tipo '''double''' es el más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C♯ usan valores '''double'''. Quizá, el tipo flotante más interesante de C♯ es '''decimal''', dirigido al uso de cálculos monetarios. La aritmética de punto flotante normal está sujeta a una variedad de errores de redondeo cuando se aplica a valores decimales. El tipo '''decimal''' elimina estos errores y puede representar hasta 28 lugares decimales.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de punto flotante&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 1,5E-45 a 3,4E+38&lt;br /&gt;
| Punto flotante corto&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 5E-324 a 1,7E+308&lt;br /&gt;
| Punto flotante largo&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| 128&lt;br /&gt;
| De 1E-28 a 7,9E+28&lt;br /&gt;
| Punto flotante monetario&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los caracteres en C♯ no son cantidades de 8 bits como en otros muchos lenguajes de programación. Por el contrario, C♯ usa un tipo de caracteres de 16 bits llamado [[Unicode]] al cual se le llama '''char'''. No existen conversiones automáticas de tipo entero a '''char'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de caracteres&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65,535 (código Unicode)&lt;br /&gt;
| Carácter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos lógicos&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| 1&lt;br /&gt;
| true or false, no se usa 1 ó 0 ya que no hay conversión definida&lt;br /&gt;
| true or false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
No existe una conversión definida entre '''bool''' y los valores enteros (1 no se convierte a verdadero ni 0 se convierte a falso).&lt;br /&gt;
&lt;br /&gt;
== Constantes ==&lt;br /&gt;
&lt;br /&gt;
Las constantes en C♯ se denominan ''literales''. Todas las constantes tienen un tipo de dato, en caso de ser una constante entera se usa la de menor tamaño que pueda alojarla, empezando por '''int'''. En caso de punto flotante se considera como un '''double'''. Sin embargo se puede especificar explícitamente el tipo de dato que una constante deberá usar, por medio de los sufijos:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Sufijo&lt;br /&gt;
! Tipo de dato&lt;br /&gt;
! Ejemplo&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| long&lt;br /&gt;
| 12L&lt;br /&gt;
|-&lt;br /&gt;
| UL&lt;br /&gt;
| ulong&lt;br /&gt;
| 68687UL&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| float&lt;br /&gt;
| 10,19F&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| decimal&lt;br /&gt;
| 9,95M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En ocasiones, resulta más sencillo usar un sistema numérico basado en 16 en lugar de 10, para tal caso C♯ permite especificar constantes enteras en formato [[hexadecimal]], y se hace empezando con '''0x'''. Por ejemplo: '''0xFF''' equivale a 255 en decimal.&lt;br /&gt;
&lt;br /&gt;
C♯ tiene caracteres denominados '''secuencias de escape''' para facilitar la escritura con el teclado de símbolos que carecen de representación visual. Estos son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Secuencia de escape&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| \a&lt;br /&gt;
| Alerta (timbre)&lt;br /&gt;
|-&lt;br /&gt;
| \b&lt;br /&gt;
| Retroceso&lt;br /&gt;
|-&lt;br /&gt;
| \f&lt;br /&gt;
| Avance de página&lt;br /&gt;
|-&lt;br /&gt;
| \n&lt;br /&gt;
| Nueva línea&lt;br /&gt;
|-&lt;br /&gt;
| \r&lt;br /&gt;
| Retorno de carro&lt;br /&gt;
|-&lt;br /&gt;
| \t&lt;br /&gt;
| Tabulador horizontal&lt;br /&gt;
|-&lt;br /&gt;
| \v&lt;br /&gt;
| Tabulador vertical&lt;br /&gt;
|-&lt;br /&gt;
| \0&lt;br /&gt;
| Nulo&lt;br /&gt;
|-&lt;br /&gt;
| \'&lt;br /&gt;
| Comilla sencilla&lt;br /&gt;
|-&lt;br /&gt;
| \&amp;quot;&lt;br /&gt;
| Comilla doble&lt;br /&gt;
|-&lt;br /&gt;
| \\&lt;br /&gt;
| Diagonal invertida&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
C♯, al igual que [[C++]], es compatible con el tipo de constante cadena de [[caracteres]]. Dentro de la cadena de caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo '''@''' seguido por una cadena entre comillas, en tal caso, las secuencias de escape no tienen efecto y además la cadena puede ocupar dos o más líneas.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Toda [[variable]] se debe declarar antes de ser utilizada. La forma en que se declara una variable en C♯ es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tipo nombre_variable;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para asignar un valor a una variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nombre_variable = valor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las conversiones de tipo de variables en C♯ se representan en la siguiente tabla en donde la fila es el origen y la columna el destino. Los significados de las letras son: '''A''' (Conversión automática o implícita), '''E''' (Conversión explícita), '''I''' (Conversión incompatible).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=14 | Conversiones de tipo de datos&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! '''byte'''&lt;br /&gt;
! '''sbyte'''&lt;br /&gt;
! '''short'''&lt;br /&gt;
! '''ushort'''&lt;br /&gt;
! '''int'''&lt;br /&gt;
! '''uint'''&lt;br /&gt;
! '''long'''&lt;br /&gt;
! '''ulong'''&lt;br /&gt;
! '''float'''&lt;br /&gt;
! '''double'''&lt;br /&gt;
! '''decimal'''&lt;br /&gt;
! '''char'''&lt;br /&gt;
! '''bool'''&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
|&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Toda conversión implícita no ocasiona pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* Es posible (mas no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen.&lt;br /&gt;
* La conversión explícita se realiza de la siguiente forma: &amp;lt;code&amp;gt;(tipo-destino) expresion&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden:&lt;br /&gt;
&lt;br /&gt;
# Si un operando es '''decimal''', el otro operando se transforma a '''decimal'''.&lt;br /&gt;
# Si un operando es '''double''', el otro operando se transforma a '''double'''.&lt;br /&gt;
# Si un operando es '''float''', el otro operando se transforma a '''float'''.&lt;br /&gt;
# Si un operando es '''ulong''', el otro operando se transforma a '''ulong'''.&lt;br /&gt;
# Si un operando es '''long''', el otro operando se transforma a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', y si el otro operando es de tipo '''sbyte''', '''short''' o '''int''', los dos se transforman a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', el otro operando se transforma a '''uint'''.&lt;br /&gt;
# Si ninguno de los casos anteriores, los dos operandos se transforman a '''int'''.&lt;br /&gt;
&lt;br /&gt;
== Operadores ==&lt;br /&gt;
&lt;br /&gt;
C♯ tiene cuatro clases generales de [[operadores]]: '''[[Operadores aritméticos|aritméticos]]''', '''a nivel de bit''', '''relacionales''' y '''lógicos'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=3 | Operadores&lt;br /&gt;
|-&lt;br /&gt;
! Operador&lt;br /&gt;
! Significado&lt;br /&gt;
! Tipo&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
| Suma&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Resta&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
| Producto&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
| División&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
| Módulo (residuo entero)&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ++&lt;br /&gt;
| Incremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Decremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
| Igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
| Distinto que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
| Mayor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
| Menor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
| Mayor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
| Menor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&lt;br /&gt;
| AND&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
| XOR y de nivel de bits&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
| AND de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| !&lt;br /&gt;
| NOT&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| ~&lt;br /&gt;
| Complemento a uno&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&amp;lt;&lt;br /&gt;
| Desplazamiento a la izquierda&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&amp;gt;&lt;br /&gt;
| Desplazamiento a la derecha&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Los [[operadores aritméticos]] funcionan igual que en C y [[C++]].&lt;br /&gt;
* El resultado de los [[operadores relacionales]] y lógicos es un valor '''bool'''.&lt;br /&gt;
* Los [[operadores de cortocircuito]] evalúan el segundo operando solo cuando es necesario.&lt;br /&gt;
* Los [[operadores a nivel de bit]] no se pueden aplicar a tipos '''bool''', '''float''', '''double''' o '''decimal'''.&lt;br /&gt;
&lt;br /&gt;
== Instrucciones de control ==&lt;br /&gt;
&lt;br /&gt;
* La instrucción '''if-else''' es básicamente igual que en C, C++ y [[Java]].&lt;br /&gt;
* La diferencia de la instrucción '''switch''' con la versión de C, C++ y Java es que todo cuerpo perteneciente a un '''case''' debe de toparse con un '''break''' o un '''goto''' antes de toparse con otro '''case''', a menos que dicho cuerpo esté vacío.&lt;br /&gt;
* La instrucción '''for''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''do-while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''foreach''' realiza un ciclo a través de los elementos de una colección (grupo de objetos). El formato de esta instrucción es: &amp;lt;code&amp;gt;foreach(tipo variable in coleccion) instruccion;&amp;lt;/code&amp;gt;. En este ciclo se recorre la colección y la variable recibe un respectivo elemento de dicha colección en cada iteración.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''break''' permite forzar la salida de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''continue''' permite forzar la repetición temprana de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* La instrucción '''return''' es básicamente igual que en C, C++. Se utiliza para devolver un valor y salir de un método.&lt;br /&gt;
* La instrucción '''goto''' se sigue utilizando en C♯ a pesar de toda la polémica que esto conlleva.&lt;br /&gt;
&lt;br /&gt;
== Métodos ==&lt;br /&gt;
&lt;br /&gt;
* Todo método debe de ser parte de una clase, no existen métodos globales.&lt;br /&gt;
* De forma predeterminada, los parámetros se pasan por valor (se copia dicho valor).&lt;br /&gt;
* El modificador '''ref''' fuerza a pasar los parámetros por referencia en vez de pasarlos por valor.&lt;br /&gt;
* El modificador '''out''' es similar al modificador '''ref''' con una excepción: sólo se puede utilizar para pasar un valor fuera de un método. El método debe de asignar un valor al parámetro antes de que el método finalice.&lt;br /&gt;
* Cuando '''ref''' y '''out''' modifican un parámetro de referencia, la propia referencia se pasa por referencia.&lt;br /&gt;
* El modificador '''params''' sirve para definir un número variable de argumentos los cuales se implementan como una matriz. Ejemplo: &amp;lt;code&amp;gt;public int maxVal(params int[] nums){...}&amp;lt;/code&amp;gt;, esta función se podría llamar así: &amp;lt;code&amp;gt;maxVal(23,3,a,-12);&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un método debe tener como máximo un único parámetro '''params''' y éste debe de ser el último.&lt;br /&gt;
* Un método puede devolver cualquier tipo de datos, incluyendo tipos de clase.&lt;br /&gt;
* Ya que en C# las [[matrices]] se implementan como objetos, un método también puede devolver una [[matriz]] (algo que se diferencia de C++ en que las matrices no son válidas como tipos de valores devueltos).&lt;br /&gt;
* C♯ implementa '''sobrecarga de métodos''', dos o más métodos pueden tener el mismo nombre siempre y cuando se diferencien por sus parámetros.&lt;br /&gt;
* El método '''Main''' es un método especial al cual se refiere el punto de partida del programa. Tiene la siguiente sintaxis: &amp;lt;code&amp;gt;public static int Main(string[] args){...}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Clases y objetos ==&lt;br /&gt;
&lt;br /&gt;
Varios puntos a tener en cuenta en C♯ con respecto a [[clases]] y [[objetos]] son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Una [[variable de objeto]] de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java).&lt;br /&gt;
* El operador de asignación no copia los valores de un objeto, sino su referencia a él (al igual que Java).&lt;br /&gt;
* Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.&lt;br /&gt;
* Un constructor no devuelve ningún valor.&lt;br /&gt;
* Al igual que los métodos, los constructores también pueden ser sobrecargados.&lt;br /&gt;
* Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor de '''0''', '''null''' o '''false''' según corresponda.&lt;br /&gt;
* Para crear un nuevo objeto se utiliza la siguiente sintaxis: &amp;lt;code&amp;gt;variable = new nombre_clase();&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un destructor se declara como un constructor, aunque va precedido por un signo de tilde ~.&lt;br /&gt;
* Se emplea una desasignación de memoria de objetos no referenciados (recolección de basura), y cuando esto ocurre se ejecuta el destructor de dicha clase.&lt;br /&gt;
* El destructor de una clase no se llama cuando un objeto sale del ámbito.&lt;br /&gt;
* Todos los destructores se llamarán antes de que finalice un programa.&lt;br /&gt;
* La palabra clave '''this''' es un apuntador al mismo objeto en el cual se usa.&lt;br /&gt;
* La palabra clave '''static''' hace que un miembro pertenezca a una clase en vez de pertener a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto.&lt;br /&gt;
* Un método '''static''' no tiene una referencia '''this'''.&lt;br /&gt;
* Un método '''static''' puede llamar sólo a otros métodos '''static'''.&lt;br /&gt;
* Un método '''static''' sólo debe tener acceso directamente a datos '''static'''.&lt;br /&gt;
* Un constructor '''static''' se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia.&lt;br /&gt;
* C♯ permite la sobrecarga de operadores con la palabra clave '''operator'''&lt;br /&gt;
&lt;br /&gt;
== Matrices ==&lt;br /&gt;
&lt;br /&gt;
* En C♯ las matrices se implementan como objetos.&lt;br /&gt;
* Para crear una matriz se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[] nombre_matriz = new tipo[tamaño];&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se puede crear una matriz inicializada así: &amp;lt;code&amp;gt;tipo[] nombre_matriz = { val1 , val2 , val3 , ... , valN };&amp;lt;/code&amp;gt;&lt;br /&gt;
* Los índices de las matrices comienzan en 0.&lt;br /&gt;
* Para crear una matriz '''bidimensional''' se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[,] nombre_matriz = new tipo[filas,columnas]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para referirse a un elemento de una matriz bidimensional no se usa la forma &amp;lt;code&amp;gt;matriz[fila][columna]&amp;lt;/code&amp;gt; (la cual usa C++), si no &amp;lt;code&amp;gt;matriz[fila,columna]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ya que C♯ implementa matrices como objetos, cada matriz tiene asociada una propiedad '''Length''' que contiene el número de elementos que puede alojar cada matriz.&lt;br /&gt;
&lt;br /&gt;
== Cadenas de caracteres ==&lt;br /&gt;
&lt;br /&gt;
* El tipo de dato cadena se llama '''string'''.&lt;br /&gt;
* Realmente la palabra clave '''string''' es un alias de la clase '''System.String''' de la plataforma .NET.&lt;br /&gt;
* En C♯ las cadenas son objetos y no una matriz de caracteres, aun así, se puede obtener un carácter arbitrario de una cadena por medio de su índice (mas no modificarlo).&lt;br /&gt;
* La forma más común de construir una cadena es por medio de una literal o constante: &amp;lt;code&amp;gt;string str = &amp;quot;Una cadena&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
* El operador '''==''' determina si dos referencias hacen referencia al mismo objeto, pero al usar dicho operador con dos operandos tipo '''string''' se prueba la igualdad del contenido de las cadenas y no su referencia. Sin embargo, con el resto de los operadores relacionales, como '''&amp;lt;''' o '''&amp;gt;=''' se comparan las referencias.&lt;br /&gt;
* Se pueden concatenar (unir) dos cadenas mediante el operador '''+'''.&lt;br /&gt;
* Las cadenas son inmutables, una vez creadas no se pueden modificar, solo se pueden copiar total o parcialmente.&lt;br /&gt;
* Las cadenas se pueden usar en las instrucciones '''switch'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Métodos comunes de control de cadenas&lt;br /&gt;
|-&lt;br /&gt;
! Método&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;static string Copy(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una copia de str.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int CompareTo(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve menor que cero si la cadena que llama es menor que str, mayor que cero si la cadena que llama es mayor que str, y cero si las cadenas son iguales.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int IndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str.&lt;br /&gt;
Devuelve el índice de la primera coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int LastIndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str. Devuelve el índice de la última coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToLower&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en minúsculas de la cadena que llama.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToUpper&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en mayúsculas de la cadena que llama.&lt;br /&gt;
|}&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
*'''Crear una variable del tipo string y mostrarla en un mensaje'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;   &lt;br /&gt;
   using System;&lt;br /&gt;
   public void ejemplo()&lt;br /&gt;
   {&lt;br /&gt;
   string Var1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
   MessageBox.Show(Var1);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiladores ==&lt;br /&gt;
&lt;br /&gt;
En la actualidad existen los siguientes [[compilador]]es para el lenguaje C♯:&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK] incluye un compilador de C♯, pero no un [[Entorno de desarrollo integrado|IDE]].&lt;br /&gt;
*  [[Microsoft Visual Studio|Microsoft Visual Studio]], IDE por excelencia de este lenguaje, versión 2002, 2003, 2005, 2008 y 2010(beta).&lt;br /&gt;
* [[SharpDevelop|#develop]], es un IDE [[Software libre|libre]] para C♯ bajo licencia [[GNU LGPL|LGPL]], muy similar a Microsoft Visual C#.&lt;br /&gt;
* [[Proyecto Mono|Mono]], es una implementación [[Licencia pública general de GNU|GPL]] de todo el entorno [[.NET de Microsoft|.NET]] desarrollado por [[Novell]]. Como parte de esta implementación se incluye un compilador de C♯.&lt;br /&gt;
* [[Delphi]] 2006, de [[Borland]] Software Corporation.&lt;br /&gt;
* [[dotGNU]] [[Portable.NET]], de la [[Free Software Foundation]].&lt;br /&gt;
&lt;br /&gt;
== Metas del diseño del lenguaje ==&lt;br /&gt;
&lt;br /&gt;
El estándar [[ECMA]] lista las siguientes metas en el diseño para C♯:&lt;br /&gt;
&lt;br /&gt;
* Lenguaje de programación orientado a objetos '''simple, moderno y de propósito general'''.&lt;br /&gt;
* Inclusión de principios de [[ingeniería de software]] tales como revisión estricta de los tipos de datos, revisión de límites de vectores, detección de intentos de usar variables no inicializadas, y recolección de basura automática.&lt;br /&gt;
* Capacidad para desarrollar [[componentes de software]] que se puedan usar en ambientes distribuidos.&lt;br /&gt;
* [[aplicaciones portables|Portabilidad del código fuente]]&lt;br /&gt;
* Fácil migración del programador al nuevo lenguaje, especialmente para programadores familiarizados con C y [[C++]].&lt;br /&gt;
* Soporte para [[Internacionalización (computación)|internacionalización]]&lt;br /&gt;
* Adecuación para escribir aplicaciones de cualquier tamaño: desde las más grandes y sofisticadas como [[sistemas operativos]] hasta las más pequeñas funciones.&lt;br /&gt;
* Aplicaciones económicas en cuanto a memoria y procesado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[ExtendedVisualOtp]]: Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real utilizando C Sharp y [[Erlang]].&lt;br /&gt;
&lt;br /&gt;
==Fuente==&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK]&lt;br /&gt;
*[http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&lt;br /&gt;
*[http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml]&lt;br /&gt;
*[http://www.desarrolloweb.com/articulos/499.php http://www.desarrolloweb.com/articulos/499.php]&lt;br /&gt;
*[http://es.wikipedia.org/wiki/C_sharp Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programación]][[Category:Informática]]&lt;br /&gt;
[[Category:Lenguajes_de_programación_orientada_a_objetos]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733808</id>
		<title>Lenguaje de Programación C Sharp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733808"/>
		<updated>2011-07-11T22:11:41Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre= C#&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen= Cshar1.JPG&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción= Lenguaje de Programación Orientado a Objetos.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador= [[Microsoft]] Corporation.&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial= [[2001]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos= &lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia= Comercial.&lt;br /&gt;
|premios=&lt;br /&gt;
|web= http://www.microsoft.com/net&lt;br /&gt;
}}&lt;br /&gt;
'''C#''' (pronunciado si sharp en inglés) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por [[Microsoft]] como parte de su [[plataforma.NET]], que después fue aprobado como un estándar por la [[ECMA]] e [[ISO]]. &lt;br /&gt;
&lt;br /&gt;
== Características  ==&lt;br /&gt;
&lt;br /&gt;
Su sintaxis básica deriva de C/[[C++]] y utiliza el modelo de objetos de la plataforma.NET el cual es similar al de [[Lenguaje de programación Java|Java]] aunque incluye mejoras derivadas de otros lenguajes (entre ellos [[Delphi]]).&lt;br /&gt;
&lt;br /&gt;
La creación del nombre del lenguaje, C♯, proviene de dibujar dos signos positivos encima de los dos signos positivos de &amp;quot;C++&amp;quot;, queriendo dar una imagen de salto evolutivo del mismo modo que ocurrió con el paso de C a C++.&lt;br /&gt;
&lt;br /&gt;
C♯, como parte de la plataforma.NET, está normalizado por [[ECMA]] desde diciembre de [[2001]] ([http://www.ecma-international.org/publications/standards/Ecma-334.htm C# Language Specification] &amp;quot;Especificación del lenguaje C♯&amp;quot;). El [[7 de noviembre]] de [[2005]]  salió la versión 2.0 del lenguaje que incluía mejoras tales como tipos genéricos, métodos anónimos, iteradores, tipos parciales y tipos anulables. El [[19 de noviembre de 2007]] salió la versión 3.0 de C# destacando entre las mejoras los tipos implícitos, [[tipos anónimos]] y  [[LINQ]] (''Language Integrated Query'' -consulta integrada en el lenguaje).&lt;br /&gt;
&lt;br /&gt;
Aunque C♯ forma parte de la plataforma.NET, ésta es una [[interfaz de programación de aplicaciones]] ('''API'''); mientras que C♯ es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un [[compilador]] implementado que provee el marco de [[DotGNU]] - [[Proyecto Mono|Mono]] que genera programas para distintas plataformas como [[Win32]], [[UNIX]] y [[Linux]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Durante el desarrollo de la plataforma .NET, las [[bibliotecas de clases]] fueron escritas originalmente en el [[Lenguaje de Programación C|lenguaje]] compilador [[Simple Managed C]].En enero de [[1999]], [[Anders Hejlsberg]] formó un equipo con la misión de desarrollar un nuevo lenguaje de programación llamado Cool (C [[Programación Orientada a Objetos|Orientado a Objetos]]). Este nombre tuvo que ser cambiado debido a problemas de marca pasando a llamarse C♯ aunque habitualmente se escribe C#.&amp;lt;ref&amp;gt;Visual C# Developer Center, [http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&amp;lt;/ref&amp;gt; La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje.&lt;br /&gt;
&lt;br /&gt;
[[Hejlsberg]] lideró el proyecto de desarrollo de C♯. Anteriormente, ya participó en el desarrollo de otros lenguajes como [[Turbo Pascal]], [[J++]] y [[Borland Delphi]]&lt;br /&gt;
&lt;br /&gt;
== Tipos de datos ==&lt;br /&gt;
&lt;br /&gt;
C♯ contiene dos categorías generales de tipos de datos integrados: '''tipos de valor''' y '''tipos de referencia'''. El término '''tipo de valor''' indica que esos tipos contienen directamente sus valores. &lt;br /&gt;
&lt;br /&gt;
C♯ define ocho tipos de enteros, a saber:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de enteros&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De 0 a 255&lt;br /&gt;
| Entero sin signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De -128 a 127&lt;br /&gt;
| Entero con signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| 16&lt;br /&gt;
| De -32.768 a 32.767&lt;br /&gt;
| Entero corto&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65.535&lt;br /&gt;
| Entero corto sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| 32&lt;br /&gt;
| De -2.147.483.648 a 2.147.483.647&lt;br /&gt;
| Entero medio&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 0 a 4.294.967.295&lt;br /&gt;
| Entero medio sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| 64&lt;br /&gt;
| De -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807&lt;br /&gt;
| Entero largo&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 0 a 18.446.744.073.709.551.615&lt;br /&gt;
| Entero largo sin signo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los tipos de [[punto flotante]] pueden representar números con [[componentes fraccionales]]. Existen dos clases de tipos de punto flotante; '''float''' y '''double'''. El tipo '''double''' es el más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C♯ usan valores '''double'''. Quizá, el tipo flotante más interesante de C♯ es '''decimal''', dirigido al uso de cálculos monetarios. La aritmética de punto flotante normal está sujeta a una variedad de errores de redondeo cuando se aplica a valores decimales. El tipo '''decimal''' elimina estos errores y puede representar hasta 28 lugares decimales.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de punto flotante&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 1,5E-45 a 3,4E+38&lt;br /&gt;
| Punto flotante corto&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 5E-324 a 1,7E+308&lt;br /&gt;
| Punto flotante largo&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| 128&lt;br /&gt;
| De 1E-28 a 7,9E+28&lt;br /&gt;
| Punto flotante monetario&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los caracteres en C♯ no son cantidades de 8 bits como en otros muchos lenguajes de programación. Por el contrario, C♯ usa un tipo de caracteres de 16 bits llamado [[Unicode]] al cual se le llama '''char'''. No existen conversiones automáticas de tipo entero a '''char'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de caracteres&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65,535 (código Unicode)&lt;br /&gt;
| Carácter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos lógicos&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| 1&lt;br /&gt;
| true or false, no se usa 1 ó 0 ya que no hay conversión definida&lt;br /&gt;
| true or false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
No existe una conversión definida entre '''bool''' y los valores enteros (1 no se convierte a verdadero ni 0 se convierte a falso).&lt;br /&gt;
&lt;br /&gt;
== Constantes ==&lt;br /&gt;
&lt;br /&gt;
Las constantes en C♯ se denominan ''literales''. Todas las constantes tienen un tipo de dato, en caso de ser una constante entera se usa la de menor tamaño que pueda alojarla, empezando por '''int'''. En caso de punto flotante se considera como un '''double'''. Sin embargo se puede especificar explícitamente el tipo de dato que una constante deberá usar, por medio de los sufijos:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Sufijo&lt;br /&gt;
! Tipo de dato&lt;br /&gt;
! Ejemplo&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| long&lt;br /&gt;
| 12L&lt;br /&gt;
|-&lt;br /&gt;
| UL&lt;br /&gt;
| ulong&lt;br /&gt;
| 68687UL&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| float&lt;br /&gt;
| 10,19F&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| decimal&lt;br /&gt;
| 9,95M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En ocasiones, resulta más sencillo usar un sistema numérico basado en 16 en lugar de 10, para tal caso C♯ permite especificar constantes enteras en formato [[hexadecimal]], y se hace empezando con '''0x'''. Por ejemplo: '''0xFF''' equivale a 255 en decimal.&lt;br /&gt;
&lt;br /&gt;
C♯ tiene caracteres denominados '''secuencias de escape''' para facilitar la escritura con el teclado de símbolos que carecen de representación visual. Estos son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Secuencia de escape&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| \a&lt;br /&gt;
| Alerta (timbre)&lt;br /&gt;
|-&lt;br /&gt;
| \b&lt;br /&gt;
| Retroceso&lt;br /&gt;
|-&lt;br /&gt;
| \f&lt;br /&gt;
| Avance de página&lt;br /&gt;
|-&lt;br /&gt;
| \n&lt;br /&gt;
| Nueva línea&lt;br /&gt;
|-&lt;br /&gt;
| \r&lt;br /&gt;
| Retorno de carro&lt;br /&gt;
|-&lt;br /&gt;
| \t&lt;br /&gt;
| Tabulador horizontal&lt;br /&gt;
|-&lt;br /&gt;
| \v&lt;br /&gt;
| Tabulador vertical&lt;br /&gt;
|-&lt;br /&gt;
| \0&lt;br /&gt;
| Nulo&lt;br /&gt;
|-&lt;br /&gt;
| \'&lt;br /&gt;
| Comilla sencilla&lt;br /&gt;
|-&lt;br /&gt;
| \&amp;quot;&lt;br /&gt;
| Comilla doble&lt;br /&gt;
|-&lt;br /&gt;
| \\&lt;br /&gt;
| Diagonal invertida&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
C♯, al igual que [[C++]], es compatible con el tipo de constante cadena de [[caracteres]]. Dentro de la cadena de caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo '''@''' seguido por una cadena entre comillas, en tal caso, las secuencias de escape no tienen efecto y además la cadena puede ocupar dos o más líneas.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Toda [[variable]] se debe declarar antes de ser utilizada. La forma en que se declara una variable en C♯ es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tipo nombre_variable;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para asignar un valor a una variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nombre_variable = valor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las conversiones de tipo de variables en C♯ se representan en la siguiente tabla en donde la fila es el origen y la columna el destino. Los significados de las letras son: '''A''' (Conversión automática o implícita), '''E''' (Conversión explícita), '''I''' (Conversión incompatible).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=14 | Conversiones de tipo de datos&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! '''byte'''&lt;br /&gt;
! '''sbyte'''&lt;br /&gt;
! '''short'''&lt;br /&gt;
! '''ushort'''&lt;br /&gt;
! '''int'''&lt;br /&gt;
! '''uint'''&lt;br /&gt;
! '''long'''&lt;br /&gt;
! '''ulong'''&lt;br /&gt;
! '''float'''&lt;br /&gt;
! '''double'''&lt;br /&gt;
! '''decimal'''&lt;br /&gt;
! '''char'''&lt;br /&gt;
! '''bool'''&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
|&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Toda conversión implícita no ocasiona pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* Es posible (mas no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen.&lt;br /&gt;
* La conversión explícita se realiza de la siguiente forma: &amp;lt;code&amp;gt;(tipo-destino) expresion&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden:&lt;br /&gt;
&lt;br /&gt;
# Si un operando es '''decimal''', el otro operando se transforma a '''decimal'''.&lt;br /&gt;
# Si un operando es '''double''', el otro operando se transforma a '''double'''.&lt;br /&gt;
# Si un operando es '''float''', el otro operando se transforma a '''float'''.&lt;br /&gt;
# Si un operando es '''ulong''', el otro operando se transforma a '''ulong'''.&lt;br /&gt;
# Si un operando es '''long''', el otro operando se transforma a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', y si el otro operando es de tipo '''sbyte''', '''short''' o '''int''', los dos se transforman a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', el otro operando se transforma a '''uint'''.&lt;br /&gt;
# Si ninguno de los casos anteriores, los dos operandos se transforman a '''int'''.&lt;br /&gt;
&lt;br /&gt;
== Operadores ==&lt;br /&gt;
&lt;br /&gt;
C♯ tiene cuatro clases generales de [[operadores]]: '''[[Operadores aritméticos|aritméticos]]''', '''a nivel de bit''', '''relacionales''' y '''lógicos'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=3 | Operadores&lt;br /&gt;
|-&lt;br /&gt;
! Operador&lt;br /&gt;
! Significado&lt;br /&gt;
! Tipo&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
| Suma&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Resta&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
| Producto&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
| División&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
| Módulo (residuo entero)&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ++&lt;br /&gt;
| Incremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Decremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
| Igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
| Distinto que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
| Mayor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
| Menor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
| Mayor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
| Menor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&lt;br /&gt;
| AND&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
| XOR y de nivel de bits&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
| AND de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| !&lt;br /&gt;
| NOT&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| ~&lt;br /&gt;
| Complemento a uno&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&amp;lt;&lt;br /&gt;
| Desplazamiento a la izquierda&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&amp;gt;&lt;br /&gt;
| Desplazamiento a la derecha&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Los [[operadores aritméticos]] funcionan igual que en C y [[C++]].&lt;br /&gt;
* El resultado de los [[operadores relacionales]] y lógicos es un valor '''bool'''.&lt;br /&gt;
* Los [[operadores de cortocircuito]] evalúan el segundo operando solo cuando es necesario.&lt;br /&gt;
* Los [[operadores a nivel de bit]] no se pueden aplicar a tipos '''bool''', '''float''', '''double''' o '''decimal'''.&lt;br /&gt;
&lt;br /&gt;
== Instrucciones de control ==&lt;br /&gt;
&lt;br /&gt;
* La instrucción '''if-else''' es básicamente igual que en C, C++ y [[Java]].&lt;br /&gt;
* La diferencia de la instrucción '''switch''' con la versión de C, C++ y Java es que todo cuerpo perteneciente a un '''case''' debe de toparse con un '''break''' o un '''goto''' antes de toparse con otro '''case''', a menos que dicho cuerpo esté vacío.&lt;br /&gt;
* La instrucción '''for''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''do-while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''foreach''' realiza un ciclo a través de los elementos de una colección (grupo de objetos). El formato de esta instrucción es: &amp;lt;code&amp;gt;foreach(tipo variable in coleccion) instruccion;&amp;lt;/code&amp;gt;. En este ciclo se recorre la colección y la variable recibe un respectivo elemento de dicha colección en cada iteración.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''break''' permite forzar la salida de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''continue''' permite forzar la repetición temprana de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* La instrucción '''return''' es básicamente igual que en C, C++. Se utiliza para devolver un valor y salir de un método.&lt;br /&gt;
* La instrucción '''goto''' se sigue utilizando en C♯ a pesar de toda la polémica que esto conlleva.&lt;br /&gt;
&lt;br /&gt;
== Métodos ==&lt;br /&gt;
&lt;br /&gt;
* Todo método debe de ser parte de una clase, no existen métodos globales.&lt;br /&gt;
* De forma predeterminada, los parámetros se pasan por valor (se copia dicho valor).&lt;br /&gt;
* El modificador '''ref''' fuerza a pasar los parámetros por referencia en vez de pasarlos por valor.&lt;br /&gt;
* El modificador '''out''' es similar al modificador '''ref''' con una excepción: sólo se puede utilizar para pasar un valor fuera de un método. El método debe de asignar un valor al parámetro antes de que el método finalice.&lt;br /&gt;
* Cuando '''ref''' y '''out''' modifican un parámetro de referencia, la propia referencia se pasa por referencia.&lt;br /&gt;
* El modificador '''params''' sirve para definir un número variable de argumentos los cuales se implementan como una matriz. Ejemplo: &amp;lt;code&amp;gt;public int maxVal(params int[] nums){...}&amp;lt;/code&amp;gt;, esta función se podría llamar así: &amp;lt;code&amp;gt;maxVal(23,3,a,-12);&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un método debe tener como máximo un único parámetro '''params''' y éste debe de ser el último.&lt;br /&gt;
* Un método puede devolver cualquier tipo de datos, incluyendo tipos de clase.&lt;br /&gt;
* Ya que en C# las [[matrices]] se implementan como objetos, un método también puede devolver una [[matriz]] (algo que se diferencia de C++ en que las matrices no son válidas como tipos de valores devueltos).&lt;br /&gt;
* C♯ implementa '''sobrecarga de métodos''', dos o más métodos pueden tener el mismo nombre siempre y cuando se diferencien por sus parámetros.&lt;br /&gt;
* El método '''Main''' es un método especial al cual se refiere el punto de partida del programa. Tiene la siguiente sintaxis: &amp;lt;code&amp;gt;public static int Main(string[] args){...}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Clases y objetos ==&lt;br /&gt;
&lt;br /&gt;
Varios puntos a tener en cuenta en C♯ con respecto a [[clases]] y [[objetos]] son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Una [[variable de objeto]] de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java).&lt;br /&gt;
* El operador de asignación no copia los valores de un objeto, sino su referencia a él (al igual que Java).&lt;br /&gt;
* Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.&lt;br /&gt;
* Un constructor no devuelve ningún valor.&lt;br /&gt;
* Al igual que los métodos, los constructores también pueden ser sobrecargados.&lt;br /&gt;
* Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor de '''0''', '''null''' o '''false''' según corresponda.&lt;br /&gt;
* Para crear un nuevo objeto se utiliza la siguiente sintaxis: &amp;lt;code&amp;gt;variable = new nombre_clase();&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un destructor se declara como un constructor, aunque va precedido por un signo de tilde ~.&lt;br /&gt;
* Se emplea una desasignación de memoria de objetos no referenciados (recolección de basura), y cuando esto ocurre se ejecuta el destructor de dicha clase.&lt;br /&gt;
* El destructor de una clase no se llama cuando un objeto sale del ámbito.&lt;br /&gt;
* Todos los destructores se llamarán antes de que finalice un programa.&lt;br /&gt;
* La palabra clave '''this''' es un apuntador al mismo objeto en el cual se usa.&lt;br /&gt;
* La palabra clave '''static''' hace que un miembro pertenezca a una clase en vez de pertener a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto.&lt;br /&gt;
* Un método '''static''' no tiene una referencia '''this'''.&lt;br /&gt;
* Un método '''static''' puede llamar sólo a otros métodos '''static'''.&lt;br /&gt;
* Un método '''static''' sólo debe tener acceso directamente a datos '''static'''.&lt;br /&gt;
* Un constructor '''static''' se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia.&lt;br /&gt;
* C♯ permite la sobrecarga de operadores con la palabra clave '''operator'''&lt;br /&gt;
&lt;br /&gt;
== Matrices ==&lt;br /&gt;
&lt;br /&gt;
* En C♯ las matrices se implementan como objetos.&lt;br /&gt;
* Para crear una matriz se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[] nombre_matriz = new tipo[tamaño];&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se puede crear una matriz inicializada así: &amp;lt;code&amp;gt;tipo[] nombre_matriz = { val1 , val2 , val3 , ... , valN };&amp;lt;/code&amp;gt;&lt;br /&gt;
* Los índices de las matrices comienzan en 0.&lt;br /&gt;
* Para crear una matriz '''bidimensional''' se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[,] nombre_matriz = new tipo[filas,columnas]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para referirse a un elemento de una matriz bidimensional no se usa la forma &amp;lt;code&amp;gt;matriz[fila][columna]&amp;lt;/code&amp;gt; (la cual usa C++), si no &amp;lt;code&amp;gt;matriz[fila,columna]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ya que C♯ implementa matrices como objetos, cada matriz tiene asociada una propiedad '''Length''' que contiene el número de elementos que puede alojar cada matriz.&lt;br /&gt;
&lt;br /&gt;
== Cadenas de caracteres ==&lt;br /&gt;
&lt;br /&gt;
* El tipo de dato cadena se llama '''string'''.&lt;br /&gt;
* Realmente la palabra clave '''string''' es un alias de la clase '''System.String''' de la plataforma .NET.&lt;br /&gt;
* En C♯ las cadenas son objetos y no una matriz de caracteres, aun así, se puede obtener un carácter arbitrario de una cadena por medio de su índice (mas no modificarlo).&lt;br /&gt;
* La forma más común de construir una cadena es por medio de una literal o constante: &amp;lt;code&amp;gt;string str = &amp;quot;Una cadena&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
* El operador '''==''' determina si dos referencias hacen referencia al mismo objeto, pero al usar dicho operador con dos operandos tipo '''string''' se prueba la igualdad del contenido de las cadenas y no su referencia. Sin embargo, con el resto de los operadores relacionales, como '''&amp;lt;''' o '''&amp;gt;=''' se comparan las referencias.&lt;br /&gt;
* Se pueden concatenar (unir) dos cadenas mediante el operador '''+'''.&lt;br /&gt;
* Las cadenas son inmutables, una vez creadas no se pueden modificar, solo se pueden copiar total o parcialmente.&lt;br /&gt;
* Las cadenas se pueden usar en las instrucciones '''switch'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Métodos comunes de control de cadenas&lt;br /&gt;
|-&lt;br /&gt;
! Método&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;static string Copy(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una copia de str.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int CompareTo(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve menor que cero si la cadena que llama es menor que str, mayor que cero si la cadena que llama es mayor que str, y cero si las cadenas son iguales.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int IndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str.&lt;br /&gt;
Devuelve el índice de la primera coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int LastIndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str. Devuelve el índice de la última coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToLower&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en minúsculas de la cadena que llama.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToUpper&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en mayúsculas de la cadena que llama.&lt;br /&gt;
|}&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
*'''Crear una variable del tipo string y mostrarla en un mensaje'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;   &lt;br /&gt;
   using System;&lt;br /&gt;
   public void ejemplo()&lt;br /&gt;
   {&lt;br /&gt;
   string Var1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
   MessageBox.Show(Var1);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiladores ==&lt;br /&gt;
&lt;br /&gt;
En la actualidad existen los siguientes [[compilador]]es para el lenguaje C♯:&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK] incluye un compilador de C♯, pero no un [[Entorno de desarrollo integrado|IDE]].&lt;br /&gt;
*  [[Microsoft Visual Studio|Microsoft Visual Studio]], IDE por excelencia de este lenguaje, versión 2002, 2003, 2005, 2008 y 2010(beta).&lt;br /&gt;
* [[SharpDevelop|#develop]], es un IDE [[Software libre|libre]] para C♯ bajo licencia [[GNU LGPL|LGPL]], muy similar a Microsoft Visual C#.&lt;br /&gt;
* [[Proyecto Mono|Mono]], es una implementación [[Licencia pública general de GNU|GPL]] de todo el entorno [[.NET de Microsoft|.NET]] desarrollado por [[Novell]]. Como parte de esta implementación se incluye un compilador de C♯.&lt;br /&gt;
* [[Delphi]] 2006, de [[Borland]] Software Corporation.&lt;br /&gt;
* [[dotGNU]] [[Portable.NET]], de la [[Free Software Foundation]].&lt;br /&gt;
&lt;br /&gt;
== Metas del diseño del lenguaje ==&lt;br /&gt;
&lt;br /&gt;
El estándar [[ECMA]] lista las siguientes metas en el diseño para C♯:&lt;br /&gt;
&lt;br /&gt;
* Lenguaje de programación orientado a objetos '''simple, moderno y de propósito general'''.&lt;br /&gt;
* Inclusión de principios de [[ingeniería de software]] tales como revisión estricta de los tipos de datos, revisión de límites de vectores, detección de intentos de usar variables no inicializadas, y recolección de basura automática.&lt;br /&gt;
* Capacidad para desarrollar [[componentes de software]] que se puedan usar en ambientes distribuidos.&lt;br /&gt;
* [[aplicaciones portables|Portabilidad del código fuente]]&lt;br /&gt;
* Fácil migración del programador al nuevo lenguaje, especialmente para programadores familiarizados con C y [[C++]].&lt;br /&gt;
* Soporte para [[Internacionalización (computación)|internacionalización]]&lt;br /&gt;
* Adecuación para escribir aplicaciones de cualquier tamaño: desde las más grandes y sofisticadas como [[sistemas operativos]] hasta las más pequeñas funciones.&lt;br /&gt;
* Aplicaciones económicas en cuanto a memoria y procesado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[ExtendedVisualOtp]]: Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real&lt;br /&gt;
:utilizando [[Lenguaje de Programación C Sharp|C Sharp]] y [[Erlang]].&lt;br /&gt;
&lt;br /&gt;
==Fuente==&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK]&lt;br /&gt;
*[http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&lt;br /&gt;
*[http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml]&lt;br /&gt;
*[http://www.desarrolloweb.com/articulos/499.php http://www.desarrolloweb.com/articulos/499.php]&lt;br /&gt;
*[http://es.wikipedia.org/wiki/C_sharp Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programación]][[Category:Informática]]&lt;br /&gt;
[[Category:Lenguajes_de_programación_orientada_a_objetos]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733803</id>
		<title>Lenguaje de Programación C Sharp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Lenguaje_de_Programaci%C3%B3n_C_Sharp&amp;diff=733803"/>
		<updated>2011-07-11T22:10:39Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre= C#&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen= Cshar1.JPG&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción= Lenguaje de Programación Orientado a Objetos.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador= [[Microsoft]] Corporation.&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial= [[2001]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos= &lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia= Comercial.&lt;br /&gt;
|premios=&lt;br /&gt;
|web= http://www.microsoft.com/net&lt;br /&gt;
}}&lt;br /&gt;
'''C#''' (pronunciado si sharp en inglés) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por [[Microsoft]] como parte de su [[plataforma.NET]], que después fue aprobado como un estándar por la [[ECMA]] e [[ISO]]. &lt;br /&gt;
&lt;br /&gt;
== Características  ==&lt;br /&gt;
&lt;br /&gt;
Su sintaxis básica deriva de C/[[C++]] y utiliza el modelo de objetos de la plataforma.NET el cual es similar al de [[Lenguaje de programación Java|Java]] aunque incluye mejoras derivadas de otros lenguajes (entre ellos [[Delphi]]).&lt;br /&gt;
&lt;br /&gt;
La creación del nombre del lenguaje, C♯, proviene de dibujar dos signos positivos encima de los dos signos positivos de &amp;quot;C++&amp;quot;, queriendo dar una imagen de salto evolutivo del mismo modo que ocurrió con el paso de C a C++.&lt;br /&gt;
&lt;br /&gt;
C♯, como parte de la plataforma.NET, está normalizado por [[ECMA]] desde diciembre de [[2001]] ([http://www.ecma-international.org/publications/standards/Ecma-334.htm C# Language Specification] &amp;quot;Especificación del lenguaje C♯&amp;quot;). El [[7 de noviembre]] de [[2005]]  salió la versión 2.0 del lenguaje que incluía mejoras tales como tipos genéricos, métodos anónimos, iteradores, tipos parciales y tipos anulables. El [[19 de noviembre de 2007]] salió la versión 3.0 de C# destacando entre las mejoras los tipos implícitos, [[tipos anónimos]] y  [[LINQ]] (''Language Integrated Query'' -consulta integrada en el lenguaje).&lt;br /&gt;
&lt;br /&gt;
Aunque C♯ forma parte de la plataforma.NET, ésta es una [[interfaz de programación de aplicaciones]] ('''API'''); mientras que C♯ es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un [[compilador]] implementado que provee el marco de [[DotGNU]] - [[Proyecto Mono|Mono]] que genera programas para distintas plataformas como [[Win32]], [[UNIX]] y [[Linux]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Durante el desarrollo de la plataforma .NET, las [[bibliotecas de clases]] fueron escritas originalmente en el [[Lenguaje de Programación C|lenguaje]] compilador [[Simple Managed C]].En enero de [[1999]], [[Anders Hejlsberg]] formó un equipo con la misión de desarrollar un nuevo lenguaje de programación llamado Cool (C [[Programación Orientada a Objetos|Orientado a Objetos]]). Este nombre tuvo que ser cambiado debido a problemas de marca pasando a llamarse C♯ aunque habitualmente se escribe C#.&amp;lt;ref&amp;gt;Visual C# Developer Center, [http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&amp;lt;/ref&amp;gt; La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje.&lt;br /&gt;
&lt;br /&gt;
[[Hejlsberg]] lideró el proyecto de desarrollo de C♯. Anteriormente, ya participó en el desarrollo de otros lenguajes como [[Turbo Pascal]], [[J++]] y [[Borland Delphi]]&lt;br /&gt;
&lt;br /&gt;
== Tipos de datos ==&lt;br /&gt;
&lt;br /&gt;
C♯ contiene dos categorías generales de tipos de datos integrados: '''tipos de valor''' y '''tipos de referencia'''. El término '''tipo de valor''' indica que esos tipos contienen directamente sus valores. &lt;br /&gt;
&lt;br /&gt;
C♯ define ocho tipos de enteros, a saber:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de enteros&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De 0 a 255&lt;br /&gt;
| Entero sin signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| 8&lt;br /&gt;
| De -128 a 127&lt;br /&gt;
| Entero con signo de 8 bits&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| 16&lt;br /&gt;
| De -32.768 a 32.767&lt;br /&gt;
| Entero corto&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65.535&lt;br /&gt;
| Entero corto sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| 32&lt;br /&gt;
| De -2.147.483.648 a 2.147.483.647&lt;br /&gt;
| Entero medio&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 0 a 4.294.967.295&lt;br /&gt;
| Entero medio sin signo&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| 64&lt;br /&gt;
| De -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807&lt;br /&gt;
| Entero largo&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 0 a 18.446.744.073.709.551.615&lt;br /&gt;
| Entero largo sin signo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los tipos de [[punto flotante]] pueden representar números con [[componentes fraccionales]]. Existen dos clases de tipos de punto flotante; '''float''' y '''double'''. El tipo '''double''' es el más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C♯ usan valores '''double'''. Quizá, el tipo flotante más interesante de C♯ es '''decimal''', dirigido al uso de cálculos monetarios. La aritmética de punto flotante normal está sujeta a una variedad de errores de redondeo cuando se aplica a valores decimales. El tipo '''decimal''' elimina estos errores y puede representar hasta 28 lugares decimales.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de punto flotante&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| 32&lt;br /&gt;
| De 1,5E-45 a 3,4E+38&lt;br /&gt;
| Punto flotante corto&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| 64&lt;br /&gt;
| De 5E-324 a 1,7E+308&lt;br /&gt;
| Punto flotante largo&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| 128&lt;br /&gt;
| De 1E-28 a 7,9E+28&lt;br /&gt;
| Punto flotante monetario&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Los caracteres en C♯ no son cantidades de 8 bits como en otros muchos lenguajes de programación. Por el contrario, C♯ usa un tipo de caracteres de 16 bits llamado [[Unicode]] al cual se le llama '''char'''. No existen conversiones automáticas de tipo entero a '''char'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos de caracteres&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| 16&lt;br /&gt;
| De 0 a 65,535 (código Unicode)&lt;br /&gt;
| Carácter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=4 | Tipo de datos lógicos&lt;br /&gt;
|-&lt;br /&gt;
! Tipo&lt;br /&gt;
! Ancho en bits&lt;br /&gt;
! Rango&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| 1&lt;br /&gt;
| true or false, no se usa 1 ó 0 ya que no hay conversión definida&lt;br /&gt;
| true or false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
No existe una conversión definida entre '''bool''' y los valores enteros (1 no se convierte a verdadero ni 0 se convierte a falso).&lt;br /&gt;
&lt;br /&gt;
== Constantes ==&lt;br /&gt;
&lt;br /&gt;
Las constantes en C♯ se denominan ''literales''. Todas las constantes tienen un tipo de dato, en caso de ser una constante entera se usa la de menor tamaño que pueda alojarla, empezando por '''int'''. En caso de punto flotante se considera como un '''double'''. Sin embargo se puede especificar explícitamente el tipo de dato que una constante deberá usar, por medio de los sufijos:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Sufijo&lt;br /&gt;
! Tipo de dato&lt;br /&gt;
! Ejemplo&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| long&lt;br /&gt;
| 12L&lt;br /&gt;
|-&lt;br /&gt;
| UL&lt;br /&gt;
| ulong&lt;br /&gt;
| 68687UL&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| float&lt;br /&gt;
| 10,19F&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| decimal&lt;br /&gt;
| 9,95M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En ocasiones, resulta más sencillo usar un sistema numérico basado en 16 en lugar de 10, para tal caso C♯ permite especificar constantes enteras en formato [[hexadecimal]], y se hace empezando con '''0x'''. Por ejemplo: '''0xFF''' equivale a 255 en decimal.&lt;br /&gt;
&lt;br /&gt;
C♯ tiene caracteres denominados '''secuencias de escape''' para facilitar la escritura con el teclado de símbolos que carecen de representación visual. Estos son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Secuencia de escape&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| \a&lt;br /&gt;
| Alerta (timbre)&lt;br /&gt;
|-&lt;br /&gt;
| \b&lt;br /&gt;
| Retroceso&lt;br /&gt;
|-&lt;br /&gt;
| \f&lt;br /&gt;
| Avance de página&lt;br /&gt;
|-&lt;br /&gt;
| \n&lt;br /&gt;
| Nueva línea&lt;br /&gt;
|-&lt;br /&gt;
| \r&lt;br /&gt;
| Retorno de carro&lt;br /&gt;
|-&lt;br /&gt;
| \t&lt;br /&gt;
| Tabulador horizontal&lt;br /&gt;
|-&lt;br /&gt;
| \v&lt;br /&gt;
| Tabulador vertical&lt;br /&gt;
|-&lt;br /&gt;
| \0&lt;br /&gt;
| Nulo&lt;br /&gt;
|-&lt;br /&gt;
| \'&lt;br /&gt;
| Comilla sencilla&lt;br /&gt;
|-&lt;br /&gt;
| \&amp;quot;&lt;br /&gt;
| Comilla doble&lt;br /&gt;
|-&lt;br /&gt;
| \\&lt;br /&gt;
| Diagonal invertida&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
C♯, al igual que [[C++]], es compatible con el tipo de constante cadena de [[caracteres]]. Dentro de la cadena de caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo '''@''' seguido por una cadena entre comillas, en tal caso, las secuencias de escape no tienen efecto y además la cadena puede ocupar dos o más líneas.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
Toda [[variable]] se debe declarar antes de ser utilizada. La forma en que se declara una variable en C♯ es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tipo nombre_variable;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para asignar un valor a una variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nombre_variable = valor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las conversiones de tipo de variables en C♯ se representan en la siguiente tabla en donde la fila es el origen y la columna el destino. Los significados de las letras son: '''A''' (Conversión automática o implícita), '''E''' (Conversión explícita), '''I''' (Conversión incompatible).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=14 | Conversiones de tipo de datos&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! '''byte'''&lt;br /&gt;
! '''sbyte'''&lt;br /&gt;
! '''short'''&lt;br /&gt;
! '''ushort'''&lt;br /&gt;
! '''int'''&lt;br /&gt;
! '''uint'''&lt;br /&gt;
! '''long'''&lt;br /&gt;
! '''ulong'''&lt;br /&gt;
! '''float'''&lt;br /&gt;
! '''double'''&lt;br /&gt;
! '''decimal'''&lt;br /&gt;
! '''char'''&lt;br /&gt;
! '''bool'''&lt;br /&gt;
|-&lt;br /&gt;
| '''byte'''&lt;br /&gt;
|&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''sbyte'''&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''short'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ushort'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''int'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''uint'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''long'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''ulong'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''float'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| A&lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''double'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| E&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''decimal'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''char'''&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| E&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| A&lt;br /&gt;
| &lt;br /&gt;
| I&lt;br /&gt;
|-&lt;br /&gt;
| '''bool'''&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| I&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Toda conversión implícita no ocasiona pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* Es posible (mas no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos.&lt;br /&gt;
* En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen.&lt;br /&gt;
* La conversión explícita se realiza de la siguiente forma: &amp;lt;code&amp;gt;(tipo-destino) expresion&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden:&lt;br /&gt;
&lt;br /&gt;
# Si un operando es '''decimal''', el otro operando se transforma a '''decimal'''.&lt;br /&gt;
# Si un operando es '''double''', el otro operando se transforma a '''double'''.&lt;br /&gt;
# Si un operando es '''float''', el otro operando se transforma a '''float'''.&lt;br /&gt;
# Si un operando es '''ulong''', el otro operando se transforma a '''ulong'''.&lt;br /&gt;
# Si un operando es '''long''', el otro operando se transforma a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', y si el otro operando es de tipo '''sbyte''', '''short''' o '''int''', los dos se transforman a '''long'''.&lt;br /&gt;
# Si un operando es '''uint''', el otro operando se transforma a '''uint'''.&lt;br /&gt;
# Si ninguno de los casos anteriores, los dos operandos se transforman a '''int'''.&lt;br /&gt;
&lt;br /&gt;
== Operadores ==&lt;br /&gt;
&lt;br /&gt;
C♯ tiene cuatro clases generales de [[operadores]]: '''[[Operadores aritméticos|aritméticos]]''', '''a nivel de bit''', '''relacionales''' y '''lógicos'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=3 | Operadores&lt;br /&gt;
|-&lt;br /&gt;
! Operador&lt;br /&gt;
! Significado&lt;br /&gt;
! Tipo&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
| Suma&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Resta&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
| Producto&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
| División&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
| Módulo (residuo entero)&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ++&lt;br /&gt;
| Incremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| --&lt;br /&gt;
| Decremento&lt;br /&gt;
| Aritmético&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
| Igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
| Distinto que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
| Mayor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
| Menor que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
| Mayor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
| Menor o igual que&lt;br /&gt;
| Relacional&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&lt;br /&gt;
| AND&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR&lt;br /&gt;
| Lógico y a nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
| XOR y de nivel de bits&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| OR de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
| AND de cortocircuito&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| !&lt;br /&gt;
| NOT&lt;br /&gt;
| Lógico&lt;br /&gt;
|-&lt;br /&gt;
| ~&lt;br /&gt;
| Complemento a uno&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&amp;lt;&lt;br /&gt;
| Desplazamiento a la izquierda&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&amp;gt;&lt;br /&gt;
| Desplazamiento a la derecha&lt;br /&gt;
| A nivel de bits&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Los [[operadores aritméticos]] funcionan igual que en C y [[C++]].&lt;br /&gt;
* El resultado de los [[operadores relacionales]] y lógicos es un valor '''bool'''.&lt;br /&gt;
* Los [[operadores de cortocircuito]] evalúan el segundo operando solo cuando es necesario.&lt;br /&gt;
* Los [[operadores a nivel de bit]] no se pueden aplicar a tipos '''bool''', '''float''', '''double''' o '''decimal'''.&lt;br /&gt;
&lt;br /&gt;
== Instrucciones de control ==&lt;br /&gt;
&lt;br /&gt;
* La instrucción '''if-else''' es básicamente igual que en C, C++ y [[Java]].&lt;br /&gt;
* La diferencia de la instrucción '''switch''' con la versión de C, C++ y Java es que todo cuerpo perteneciente a un '''case''' debe de toparse con un '''break''' o un '''goto''' antes de toparse con otro '''case''', a menos que dicho cuerpo esté vacío.&lt;br /&gt;
* La instrucción '''for''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''do-while''' es básicamente igual que en C, C++ y Java.&lt;br /&gt;
* La instrucción '''foreach''' realiza un ciclo a través de los elementos de una colección (grupo de objetos). El formato de esta instrucción es: &amp;lt;code&amp;gt;foreach(tipo variable in coleccion) instruccion;&amp;lt;/code&amp;gt;. En este ciclo se recorre la colección y la variable recibe un respectivo elemento de dicha colección en cada iteración.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''break''' permite forzar la salida de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* Al igual que en C y C++, la instrucción '''continue''' permite forzar la repetición temprana de un ciclo omitiendo el código restante en el cuerpo del ciclo.&lt;br /&gt;
* La instrucción '''return''' es básicamente igual que en C, C++. Se utiliza para devolver un valor y salir de un método.&lt;br /&gt;
* La instrucción '''goto''' se sigue utilizando en C♯ a pesar de toda la polémica que esto conlleva.&lt;br /&gt;
&lt;br /&gt;
== Métodos ==&lt;br /&gt;
&lt;br /&gt;
* Todo método debe de ser parte de una clase, no existen métodos globales.&lt;br /&gt;
* De forma predeterminada, los parámetros se pasan por valor (se copia dicho valor).&lt;br /&gt;
* El modificador '''ref''' fuerza a pasar los parámetros por referencia en vez de pasarlos por valor.&lt;br /&gt;
* El modificador '''out''' es similar al modificador '''ref''' con una excepción: sólo se puede utilizar para pasar un valor fuera de un método. El método debe de asignar un valor al parámetro antes de que el método finalice.&lt;br /&gt;
* Cuando '''ref''' y '''out''' modifican un parámetro de referencia, la propia referencia se pasa por referencia.&lt;br /&gt;
* El modificador '''params''' sirve para definir un número variable de argumentos los cuales se implementan como una matriz. Ejemplo: &amp;lt;code&amp;gt;public int maxVal(params int[] nums){...}&amp;lt;/code&amp;gt;, esta función se podría llamar así: &amp;lt;code&amp;gt;maxVal(23,3,a,-12);&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un método debe tener como máximo un único parámetro '''params''' y éste debe de ser el último.&lt;br /&gt;
* Un método puede devolver cualquier tipo de datos, incluyendo tipos de clase.&lt;br /&gt;
* Ya que en C# las [[matrices]] se implementan como objetos, un método también puede devolver una [[matriz]] (algo que se diferencia de C++ en que las matrices no son válidas como tipos de valores devueltos).&lt;br /&gt;
* C♯ implementa '''sobrecarga de métodos''', dos o más métodos pueden tener el mismo nombre siempre y cuando se diferencien por sus parámetros.&lt;br /&gt;
* El método '''Main''' es un método especial al cual se refiere el punto de partida del programa. Tiene la siguiente sintaxis: &amp;lt;code&amp;gt;public static int Main(string[] args){...}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Clases y objetos ==&lt;br /&gt;
&lt;br /&gt;
Varios puntos a tener en cuenta en C♯ con respecto a [[clases]] y [[objetos]] son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* Una [[variable de objeto]] de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java).&lt;br /&gt;
* El operador de asignación no copia los valores de un objeto, sino su referencia a él (al igual que Java).&lt;br /&gt;
* Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.&lt;br /&gt;
* Un constructor no devuelve ningún valor.&lt;br /&gt;
* Al igual que los métodos, los constructores también pueden ser sobrecargados.&lt;br /&gt;
* Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor de '''0''', '''null''' o '''false''' según corresponda.&lt;br /&gt;
* Para crear un nuevo objeto se utiliza la siguiente sintaxis: &amp;lt;code&amp;gt;variable = new nombre_clase();&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Un destructor se declara como un constructor, aunque va precedido por un signo de tilde ~.&lt;br /&gt;
* Se emplea una desasignación de memoria de objetos no referenciados (recolección de basura), y cuando esto ocurre se ejecuta el destructor de dicha clase.&lt;br /&gt;
* El destructor de una clase no se llama cuando un objeto sale del ámbito.&lt;br /&gt;
* Todos los destructores se llamarán antes de que finalice un programa.&lt;br /&gt;
* La palabra clave '''this''' es un apuntador al mismo objeto en el cual se usa.&lt;br /&gt;
* La palabra clave '''static''' hace que un miembro pertenezca a una clase en vez de pertener a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto.&lt;br /&gt;
* Un método '''static''' no tiene una referencia '''this'''.&lt;br /&gt;
* Un método '''static''' puede llamar sólo a otros métodos '''static'''.&lt;br /&gt;
* Un método '''static''' sólo debe tener acceso directamente a datos '''static'''.&lt;br /&gt;
* Un constructor '''static''' se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia.&lt;br /&gt;
* C♯ permite la sobrecarga de operadores con la palabra clave '''operator'''&lt;br /&gt;
&lt;br /&gt;
== Matrices ==&lt;br /&gt;
&lt;br /&gt;
* En C♯ las matrices se implementan como objetos.&lt;br /&gt;
* Para crear una matriz se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[] nombre_matriz = new tipo[tamaño];&amp;lt;/code&amp;gt;&lt;br /&gt;
* Se puede crear una matriz inicializada así: &amp;lt;code&amp;gt;tipo[] nombre_matriz = { val1 , val2 , val3 , ... , valN };&amp;lt;/code&amp;gt;&lt;br /&gt;
* Los índices de las matrices comienzan en 0.&lt;br /&gt;
* Para crear una matriz '''bidimensional''' se utiliza el siguiente formato: &amp;lt;code&amp;gt;tipo[,] nombre_matriz = new tipo[filas,columnas]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para referirse a un elemento de una matriz bidimensional no se usa la forma &amp;lt;code&amp;gt;matriz[fila][columna]&amp;lt;/code&amp;gt; (la cual usa C++), si no &amp;lt;code&amp;gt;matriz[fila,columna]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ya que C♯ implementa matrices como objetos, cada matriz tiene asociada una propiedad '''Length''' que contiene el número de elementos que puede alojar cada matriz.&lt;br /&gt;
&lt;br /&gt;
== Cadenas de caracteres ==&lt;br /&gt;
&lt;br /&gt;
* El tipo de dato cadena se llama '''string'''.&lt;br /&gt;
* Realmente la palabra clave '''string''' es un alias de la clase '''System.String''' de la plataforma .NET.&lt;br /&gt;
* En C♯ las cadenas son objetos y no una matriz de caracteres, aun así, se puede obtener un carácter arbitrario de una cadena por medio de su índice (mas no modificarlo).&lt;br /&gt;
* La forma más común de construir una cadena es por medio de una literal o constante: &amp;lt;code&amp;gt;string str = &amp;quot;Una cadena&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
* El operador '''==''' determina si dos referencias hacen referencia al mismo objeto, pero al usar dicho operador con dos operandos tipo '''string''' se prueba la igualdad del contenido de las cadenas y no su referencia. Sin embargo, con el resto de los operadores relacionales, como '''&amp;lt;''' o '''&amp;gt;=''' se comparan las referencias.&lt;br /&gt;
* Se pueden concatenar (unir) dos cadenas mediante el operador '''+'''.&lt;br /&gt;
* Las cadenas son inmutables, una vez creadas no se pueden modificar, solo se pueden copiar total o parcialmente.&lt;br /&gt;
* Las cadenas se pueden usar en las instrucciones '''switch'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Métodos comunes de control de cadenas&lt;br /&gt;
|-&lt;br /&gt;
! Método&lt;br /&gt;
! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;static string Copy(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una copia de str.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int CompareTo(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve menor que cero si la cadena que llama es menor que str, mayor que cero si la cadena que llama es mayor que str, y cero si las cadenas son iguales.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int IndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str.&lt;br /&gt;
Devuelve el índice de la primera coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;int LastIndexOf(string str)&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Busca en la cadena que llama la subcadena especificada por str. Devuelve el índice de la última coincidencia, o -1 en caso de error.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToLower&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en minúsculas de la cadena que llama.&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt;code&amp;gt;string ToUpper&amp;lt;/code&amp;gt;'''&lt;br /&gt;
| Devuelve una versión en mayúsculas de la cadena que llama.&lt;br /&gt;
|}&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
*'''Crear una variable del tipo string y mostrarla en un mensaje'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;   &lt;br /&gt;
   using System;&lt;br /&gt;
   public void ejemplo()&lt;br /&gt;
   {&lt;br /&gt;
   string Var1 = &amp;quot;Hola&amp;quot;;&lt;br /&gt;
   MessageBox.Show(Var1);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiladores ==&lt;br /&gt;
&lt;br /&gt;
En la actualidad existen los siguientes [[compilador]]es para el lenguaje C♯:&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK] incluye un compilador de C♯, pero no un [[Entorno de desarrollo integrado|IDE]].&lt;br /&gt;
*  [[Microsoft Visual Studio|Microsoft Visual Studio]], IDE por excelencia de este lenguaje, versión 2002, 2003, 2005, 2008 y 2010(beta).&lt;br /&gt;
* [[SharpDevelop|#develop]], es un IDE [[Software libre|libre]] para C♯ bajo licencia [[GNU LGPL|LGPL]], muy similar a Microsoft Visual C#.&lt;br /&gt;
* [[Proyecto Mono|Mono]], es una implementación [[Licencia pública general de GNU|GPL]] de todo el entorno [[.NET de Microsoft|.NET]] desarrollado por [[Novell]]. Como parte de esta implementación se incluye un compilador de C♯.&lt;br /&gt;
* [[Delphi]] 2006, de [[Borland]] Software Corporation.&lt;br /&gt;
* [[dotGNU]] [[Portable.NET]], de la [[Free Software Foundation]].&lt;br /&gt;
&lt;br /&gt;
== Metas del diseño del lenguaje ==&lt;br /&gt;
&lt;br /&gt;
El estándar [[ECMA]] lista las siguientes metas en el diseño para C♯:&lt;br /&gt;
&lt;br /&gt;
* Lenguaje de programación orientado a objetos '''simple, moderno y de propósito general'''.&lt;br /&gt;
* Inclusión de principios de [[ingeniería de software]] tales como revisión estricta de los tipos de datos, revisión de límites de vectores, detección de intentos de usar variables no inicializadas, y recolección de basura automática.&lt;br /&gt;
* Capacidad para desarrollar [[componentes de software]] que se puedan usar en ambientes distribuidos.&lt;br /&gt;
* [[aplicaciones portables|Portabilidad del código fuente]]&lt;br /&gt;
* Fácil migración del programador al nuevo lenguaje, especialmente para programadores familiarizados con C y [[C++]].&lt;br /&gt;
* Soporte para [[Internacionalización (computación)|internacionalización]]&lt;br /&gt;
* Adecuación para escribir aplicaciones de cualquier tamaño: desde las más grandes y sofisticadas como [[sistemas operativos]] hasta las más pequeñas funciones.&lt;br /&gt;
* Aplicaciones económicas en cuanto a memoria y procesado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referencias==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
&lt;br /&gt;
*[[Ciencia de la Información]]&lt;br /&gt;
*[[Puntero (C++)]]&lt;br /&gt;
*[[Constructor (C++)]]&lt;br /&gt;
*[[Ficheros en C++]]&lt;br /&gt;
*[[C++]]&lt;br /&gt;
*[[Programación de Computadoras]]&lt;br /&gt;
*[[Programación Orientada a Objetos]]&lt;br /&gt;
*[[Historia del Lenguaje C]]&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real utilizando [[Lenguaje de Programación C Sharp|C Sharp y [[Erlang]]]].&lt;br /&gt;
&lt;br /&gt;
==Fuente==&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&amp;amp;displaylang=en Microsoft.NET framework SDK]&lt;br /&gt;
*[http://msdn.microsoft.com/en-us/vcsharp/aa336779.aspx Frequently Asked Questions About Visual C# .NET 2003]&lt;br /&gt;
*[http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml http://www.lenguajes-de-programacion.com/programacion-orientada-a-objetos.shtml]&lt;br /&gt;
*[http://www.desarrolloweb.com/articulos/499.php http://www.desarrolloweb.com/articulos/499.php]&lt;br /&gt;
*[http://es.wikipedia.org/wiki/C_sharp Wikipedia]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programación]][[Category:Informática]]&lt;br /&gt;
[[Category:Lenguajes_de_programación_orientada_a_objetos]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Ejabberd&amp;diff=733792</id>
		<title>Ejabberd</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Ejabberd&amp;diff=733792"/>
		<updated>2011-07-11T22:08:06Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Véase también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Ejabber&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=imagen_ej.png&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Servidor Chat&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=ProcessOne&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=[http://www.process-one.net/en/projects/ejabberd Ejabber]&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
'''Ejabberd.''' es un servidor de mensajería instantánea de código abierto ([[GNU GPL]]) para plataformas [[Unix]] ([[BSD]], [[GNU/Linux]], etc), [[Microsoft Windows]] y otras. Para la comunicación instantánea se utiliza [[XMPP]]. Está escrito principalmente en [[Erlang]], es [[Software]] concurrente y distribuido. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Historia  ==&lt;br /&gt;
&lt;br /&gt;
Alexey Shchepin fundó el proyecto en [[2002]] y continúa manteniéndolo. El nombre [[Ejabberd]] significa [[Erlang]] Jabber Daemon . Se escribe en letras minúsculas solamente, que es uso común en el mundo de [[Unix]]. El objetivo del proyecto ejabberd es la creación de un servidor [[XMPP]] estable y con variedad de posibilidades. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Ejabberd nos permitirá'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
#Crear Usuarios &lt;br /&gt;
#Salas de Chat &lt;br /&gt;
#Administradores y más&lt;br /&gt;
&lt;br /&gt;
'''¿En donde podremos implementar Ejabberd?''' &lt;br /&gt;
&lt;br /&gt;
[[Ejabberd]] puede ser implementado en una Oficina, Centro de Estudio, Aulas o el Hogar. [[Ejabberd]] nos permitirá crear nuestro propio &amp;quot;[[Servidor]] Chat&amp;quot; donde podremos crear &amp;quot;Usuarios&amp;quot; personalizados. &lt;br /&gt;
&lt;br /&gt;
Si disponemos de una [[IP]] Pública, en su defecto un Dominio Registrado, también podremos usar [[Ejabberd]] como [[Servidor]] de Mensajería en [[Internet]], no solo nuestra Red Local. En esta entrada de Wiki realizaremos una configuración básica para su puesta en función. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Instalación  ==&lt;br /&gt;
&lt;br /&gt;
[[Ejabberd]] se encuentra en los &amp;quot;Repositorios de [[Debian]]&amp;quot; Para instalar vamos a ejecutar en nuestra Terminal Favorita: &lt;br /&gt;
&amp;lt;pre&amp;gt; #aptitude install ejabberd &amp;lt;/pre&amp;gt; &lt;br /&gt;
== Configuración  ==&lt;br /&gt;
&lt;br /&gt;
Esta prueba ha sido realizada en una Red Local con 15 máquinas, El [[Servidor]] [[Debian]] posee como [[IP]] Local xxx.xxx.xxx.xxx Y como [[Ip]] Pública XXX.XXX.XXX.XXX &lt;br /&gt;
&lt;br /&gt;
Lo primero que haremos será decirle a nuestro [[Servidor]] [[Ejabberd]] cual será el Dominio a utilizar, para ello hemos escogido la [[IP]] con nuestra Red Local [xxx.xxx.xxx.xxx] para ello en nuestra terminal como Usuario Root haremos lo siguiente: &lt;br /&gt;
&amp;lt;pre&amp;gt; #nano /etc/ejabberd/ejabberd.cfg &amp;lt;/pre&amp;gt; &lt;br /&gt;
Ahora buscamos las siguientes líneas donde configuraremos de la siguiente manera: &lt;br /&gt;
&amp;lt;pre&amp;gt;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
%% Options which are set by Debconf and managed by ucf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%% Admin user&lt;br /&gt;
{acl, admin, {user, &amp;quot;&amp;quot;, &amp;quot;ip servidor&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
%% Hostname&lt;br /&gt;
{hosts, [&amp;quot;ip servidor&amp;quot;]}.&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&amp;lt;/pre&amp;gt; &lt;br /&gt;
Para administrar nuestro [[Servidor]] [[Ejabberd]] vía Web [Http] deberemos verificar que tengamos la siguiente línea &lt;br /&gt;
&amp;lt;pre&amp;gt;{5280, ejabberd_http, [&lt;br /&gt;
                         http_poll,&lt;br /&gt;
                         web_admin&lt;br /&gt;
                        ]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]}.&amp;lt;/pre&amp;gt; &lt;br /&gt;
'''Recuerda:''' Que debes tener abierto el puerto '''5280''' en tu [[Firewall]] o [[Router]] en caso que este se encuentre administrado. &lt;br /&gt;
&lt;br /&gt;
== Creando el Usuario Administrador  ==&lt;br /&gt;
&lt;br /&gt;
Antes de ingresar a [[Ejabberd]] por Web, debemos de crear un Usuario [[Administrador]], para ello haremos lo siguiente desde Terminal como Usuario Root. &lt;br /&gt;
&lt;br /&gt;
La sintaxis es:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;#ejabberdctl register &amp;amp;lt;usuario&amp;amp;gt; &amp;amp;lt;servidor&amp;amp;gt; &amp;amp;lt;contraseña&amp;amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
por lo que en la terminal haremos:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;# ejabberdctl register migue ip-servidor 123456&amp;lt;/pre&amp;gt; &lt;br /&gt;
Ahora debemos decirle a Ejabberd que &amp;quot;Migue&amp;quot; será un Usuario con privilegios de [[Administrador]], para ello, entramos nuevamente a nuestro archivo de configuración:&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;# nano /etc/ejabberd/ejabberd.cfg&amp;lt;/pre&amp;gt; &lt;br /&gt;
Y agregamos a &amp;quot;Migue&amp;quot; en la siguiente línea&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;%%% ====================&lt;br /&gt;
%%% ACCESS CONTROL LISTS&lt;br /&gt;
&lt;br /&gt;
%%&lt;br /&gt;
%% The 'admin' ACL grants administrative privileges to Jabber accounts.&lt;br /&gt;
%% You can put as many accounts as you want.&lt;br /&gt;
%%&lt;br /&gt;
&lt;br /&gt;
{acl, admin, {user, &amp;quot;migue&amp;quot;, &amp;quot;ip-servidor&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
%%{acl, admin, {user, &amp;quot;ermine&amp;quot;, &amp;quot;example.org&amp;quot;}}.&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Verificando que Ejabberd funcione correctamente  ==&lt;br /&gt;
&lt;br /&gt;
Primero reiniciaremos [[Ejabberd]]&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;# /etc/init.d/ejabberd restart&amp;lt;/pre&amp;gt; &lt;br /&gt;
Ahora verificaremos que está funcionando&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;# ejabberdctl status&amp;lt;/pre&amp;gt; &lt;br /&gt;
Nos tiene que decir: &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;Node ejabberd@TU_SERVIDOR is started. Status: started&lt;br /&gt;
ejabberd is running&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Ingresando a Ejabberd vía Http  ==&lt;br /&gt;
&lt;br /&gt;
Para ello en tu navegador tienes que colocar: http://ip-servidor:5280/admin &lt;br /&gt;
&lt;br /&gt;
Te pedirá un usuario, en cual será &lt;br /&gt;
&lt;br /&gt;
'''migue@ip-servidor''' &lt;br /&gt;
&lt;br /&gt;
La contraseña será que has especificado al momento de crear tu Usuario, en nuestro caso es: &lt;br /&gt;
&lt;br /&gt;
'''123456''' &lt;br /&gt;
&lt;br /&gt;
== Creando Usuarios  ==&lt;br /&gt;
&lt;br /&gt;
Para esta prueba se creará un &amp;quot;Usuario&amp;quot; de prueba para que se comunique con &amp;quot;Migue&amp;quot; [Administrador] &amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;# ejabberdctl register usuario 192.168.15.130 123456&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Configuración del programa Cliente  ==&lt;br /&gt;
&lt;br /&gt;
Programa para [[GNU/Linux]] &lt;br /&gt;
&lt;br /&gt;
Para esta prueba hemos utilizado Kopete como programa de mensajería cliente en [[GNU/Linux]]. Su configuración es la siguiente: &amp;lt;br&amp;gt;Usuario: migue@ip-servidor&amp;lt;br&amp;gt;Servidor: xxx.xxx.xxx.xxx&amp;lt;br&amp;gt;Puerto: 5222 &lt;br /&gt;
&lt;br /&gt;
Programa para [[Windows]] &lt;br /&gt;
&lt;br /&gt;
Para nuestro usuario de Prueba llamado usuario hemos instalado [[Pidgin]] como cliente Jabberd&amp;lt;br&amp;gt;Usuario: usuario@ip-servidor&amp;lt;br&amp;gt;Servidor: xxx.xxx.xxx.xxx&amp;lt;br&amp;gt;Puerto: 5222&amp;lt;br&amp;gt;Finalmente &lt;br /&gt;
&lt;br /&gt;
Hemos configurado Ejabber en nuestro hogar, para ello hemos hecho la prueba con [[GNU/Linux]] y Windows en una Máquina Virtual con [[Microsoft Windows]] Xp &lt;br /&gt;
&lt;br /&gt;
Nuestro [[Servidor]] [[Ejabberd]] está funcionando&amp;lt;br&amp;gt;Autenticación mediante [[LDAP]] &lt;br /&gt;
&lt;br /&gt;
He aqui una confguración básica de como logre autenticar mi [[Ejabberd]] con el [[LDAP]] mediante el metodo auth_method, [[LDAP]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;{auth_method, ldap}.&lt;br /&gt;
{ldap_servers, [&amp;quot;10.x.x.x&amp;quot;]}.&lt;br /&gt;
{ldap_rootdn, &amp;quot;cn=admin,dc=mydominio,dc=com&amp;quot;}.&lt;br /&gt;
{ldap_password, &amp;quot;password&amp;quot;}.&lt;br /&gt;
{ldap_base, &amp;quot;dc=mydominio,dc=com&amp;quot;}.&lt;br /&gt;
{ldap_filter, &amp;quot;(objectClass=sambaSamAccount)&amp;quot;}.&amp;lt;/pre&amp;gt; &lt;br /&gt;
Y ya&amp;lt;br&amp;gt;'''listo'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Véase también  ==&lt;br /&gt;
&lt;br /&gt;
*[[GNU/Linux]] &lt;br /&gt;
*[[XMPP]] (Extensible Messaging and Presence Protocol)&lt;br /&gt;
*[[ExtendedVisualOtp]], framework para el desarrollo de appliciones cliente-servidor de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
== Enlaces externos  ==&lt;br /&gt;
&lt;br /&gt;
Proyecto principal &lt;br /&gt;
&lt;br /&gt;
*(en inglés) [http://www.process-one.net/en/projects/ejabberd/ Official Sitio web] &lt;br /&gt;
*(en inglés) [http://www.ejabberd.im/ Community Sitio web]&lt;br /&gt;
&lt;br /&gt;
== Fuentes  ==&lt;br /&gt;
&lt;br /&gt;
*[http://es.wikipedia.org/wiki/Ejabberd Wikipedia] &lt;br /&gt;
*[http://www.esdebian.org/wiki/servidor-basico-mensajeria-ejabberd-debian Comunidad esdebian]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733781</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733781"/>
		<updated>2011-07-11T22:04:46Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|600px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg|thumb|700px|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg|thumb|700px|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733772</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733772"/>
		<updated>2011-07-11T22:03:09Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|574px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg|thumb|700px|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg|thumb|700px|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733755</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733755"/>
		<updated>2011-07-11T21:58:58Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|1200px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg|thumb|600px|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg|thumb|800px|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733748</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733748"/>
		<updated>2011-07-11T21:57:55Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|1200px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg|thumb|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg|thumb|800px|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733742</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733742"/>
		<updated>2011-07-11T21:56:19Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|1200px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg|thumb|800px|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg|thumb|800px|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733739</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733739"/>
		<updated>2011-07-11T21:54:58Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|1000px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||thumb|1000px|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||thumb|1000px|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733732</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733732"/>
		<updated>2011-07-11T21:53:52Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|400px|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||fame|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||fame|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733714</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733714"/>
		<updated>2011-07-11T21:51:25Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|border|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||fame|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||fame|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733710</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733710"/>
		<updated>2011-07-11T21:50:22Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|fame|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||fame|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||fame|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733704</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733704"/>
		<updated>2011-07-11T21:49:28Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo 1'''&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|fame|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||fame|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||fame|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Archivo:Evo_logo.jpg&amp;diff=733695</id>
		<title>Archivo:Evo logo.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Archivo:Evo_logo.jpg&amp;diff=733695"/>
		<updated>2011-07-11T21:47:02Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sumario ==&lt;br /&gt;
&lt;br /&gt;
== Estado de copyright: ==&lt;br /&gt;
&lt;br /&gt;
== Fuente: ==&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733689</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733689"/>
		<updated>2011-07-11T21:45:46Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Ejemplo 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
===Ejemplo 1===&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|fame|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||fame|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||fame|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Archivo:Evo_imagen3.jpg&amp;diff=733683</id>
		<title>Archivo:Evo imagen3.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Archivo:Evo_imagen3.jpg&amp;diff=733683"/>
		<updated>2011-07-11T21:44:36Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sumario ==&lt;br /&gt;
&lt;br /&gt;
== Estado de copyright: ==&lt;br /&gt;
&lt;br /&gt;
== Fuente: ==&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Archivo:Evo_imagen2.jpg&amp;diff=733678</id>
		<title>Archivo:Evo imagen2.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Archivo:Evo_imagen2.jpg&amp;diff=733678"/>
		<updated>2011-07-11T21:43:30Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sumario ==&lt;br /&gt;
&lt;br /&gt;
== Estado de copyright: ==&lt;br /&gt;
&lt;br /&gt;
== Fuente: ==&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Archivo:Evo_imagen1.jpg&amp;diff=733666</id>
		<title>Archivo:Evo imagen1.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Archivo:Evo_imagen1.jpg&amp;diff=733666"/>
		<updated>2011-07-11T21:41:32Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sumario ==&lt;br /&gt;
&lt;br /&gt;
== Estado de copyright: ==&lt;br /&gt;
&lt;br /&gt;
== Fuente: ==&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733660</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733660"/>
		<updated>2011-07-11T21:40:20Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Ejemplo 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
===Ejemplo 1===&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen1.jpg|thumb|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen2.jpg||thumb|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:evo_imagen3.jpg||thumb|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733652</id>
		<title>ExtendedVisualOtp</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ExtendedVisualOtp&amp;diff=733652"/>
		<updated>2011-07-11T21:38:03Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: Página creada con '{{Ficha Software |nombre=ExtendedVisualOtp |familia= |imagen=evo_logo.jpg |tamaño= |descripción=Framework para el desarrollo de aplicaciones de cliente-servidor. |imagen2= |ta...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ExtendedVisualOtp&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=evo_logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Framework para el desarrollo de aplicaciones de cliente-servidor.&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ivan Carmenates García]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=[[Diciembre 7]], [[2010]]&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=1.5&lt;br /&gt;
|género=[[Software]] [[Framework]]&lt;br /&gt;
|sistemas operativos=[[Windows]], [[Unix]]&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=http://comunidades.uci.cu/projects/evo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, orientado al desarrollo de [[aplicaciones de tiempo real]], donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
&lt;br /&gt;
==Introducción==&lt;br /&gt;
El '''ExtendedVisualOtp''' (EVO) es un componente especializado en la comunicación cliente – servidor, implementado en los lenguajes de programación [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de [[Microsoft]] y [[Erlang]] de [[Ericsson]], orientado al desarrollo de aplicaciones de tiempo real, donde las aplicaciones servidoras son escritas en el lenguaje de programación Erlang, y las aplicaciones clientes en [[.Net]]. El concepto principal de este componente, es el desarrollo de aplicaciones cliente - servidor, donde el factor productividad es elevado y el costo de producción bastante bajo. Ideal para pequeñas compañías con poca experiencia en este tipo de aplicaciones, que desean insertarse en este amplio mundo, que es, la interacción e intercambio de información a través de la red de una forma rápida y eficaz.&lt;br /&gt;
Con este componente se pueden escribir fácilmente aplicaciones de mensajería instantánea y redes sociales sobre el desktop, también es posible la creación de Juegos Masivos On Line. Utilizando el potencial que tiene Erlang para el manejo de la concurrencia y respuesta en tiempo real, es posible la creación de cualquier tipo de aplicación cliente – servidor, que requiera de la premisa de respuesta en tiempo real.&lt;br /&gt;
&lt;br /&gt;
Esto se puede ver para entrar en calor con un pequeño ejemplo:&lt;br /&gt;
&lt;br /&gt;
===Ejemplo 1===&lt;br /&gt;
Imagine que usted desea desarrollar una pequeña aplicación cliente y quiere realizar una petición ''“conocer mi saldo”'' a una aplicación servidora, y además ser notificado de la respuesta generada a &lt;br /&gt;
través de esa petición.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:imagen1.jpg|thumb|center|Ilustración 1. Ejemplo 1: Interacción cliente – servidor.]]&lt;br /&gt;
&lt;br /&gt;
Desarrollar este simple ejemplo en cualquier lenguaje de programación, sin la utilización de un componente facilitador, puede representar un largo trabajo. Sin embargo, utilizando la librería ''ExtendedVisualOtp.dll'' para el desarrollo de aplicaciones clientes y la plantilla para servidores, ''evo_template'', pasa de ser un largo y agotador trabajo a uno simple y acogedor.&lt;br /&gt;
&lt;br /&gt;
'''Respuesta del ejemplo 1 utilizando EVO'''&lt;br /&gt;
&lt;br /&gt;
En la aplicación cliente, después de unas sencillas configuraciones visuales para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest'' de la librería ''ExtendedVisualOtp.dll''.&lt;br /&gt;
&lt;br /&gt;
    // Para conectar con el servidor.&lt;br /&gt;
    erlangServerInterface1.Connect(); &lt;br /&gt;
&lt;br /&gt;
    // Para enviar una petición.&lt;br /&gt;
    erlangServerRequest1.Request(“Descripción de la petición”, object _mensaje);&lt;br /&gt;
Otra forma puede ser:&lt;br /&gt;
   erlangServerRequest1.Request(object _mensaje);&lt;br /&gt;
&lt;br /&gt;
[[Archivo:imagen2.jpg||thumb|center|Ilustración 2. Configuración visual para los componentes ''ErlangServerInterface'' y ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
La respuesta a la petición anterior, puede llegar de forma asincrónica a través del evento ''OnReceive'' del componente ''ErlangServerRequest'', o puede ser capturada de forma sincrónica utilizando la función ''WaitForReply()'' inmediatamente después de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
    &lt;br /&gt;
    IServerReply reply = reqinfo.WaitForReply();&lt;br /&gt;
    MessageBox.Show(reply.CSharpReply.ToString());&lt;br /&gt;
&lt;br /&gt;
'''reqinfo''' es un objeto de ''IRequestInfo'', que contiene la información de la petición que se realizó al servidor, permitiendo hacer algunas cosas con ella, tales como, bloquear el programa para esperar por la respuesta ''reqinfo.WaitForReply()'' o abortar la petición realizada ''reqinfo.AbortRequest()''.&lt;br /&gt;
&lt;br /&gt;
'''reply''' es un objeto de ''IServerReply'', que contiene la información necesaria para tratar la respuesta enviada por el servidor.&lt;br /&gt;
&lt;br /&gt;
En caso de que usted desee recibir la respuesta de forma asincrónica, usted debe usar el evento ''OnReceive'' del componente ''ErlangServerRequest'', y no utilizar la función ''WaitForReply()'', ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    IRequestInfo reqinfo = erlangServerRequest1.Request(“conoce el salario”, new object[] {&lt;br /&gt;
        “ ‘conocer_mi_saldo’ ”, “Ivan Carmenates García”});&lt;br /&gt;
&lt;br /&gt;
[[Archivo:imagen3.jpg||thumb|center|Ilustración 3. Evento ''OnReceive'' del componente ''ErlangServerRequest''.]]&lt;br /&gt;
&lt;br /&gt;
    // Y para recibir los mensajes de forma asincrónica utilizando&lt;br /&gt;
    // el evento de la ilustración 3.&lt;br /&gt;
    OnReceiveErlangServerRequestMethodNameHere(IServerReply _reply)&lt;br /&gt;
    {&lt;br /&gt;
        switch(_reply.Description) {&lt;br /&gt;
            case “conoce el salario”:&lt;br /&gt;
                MessageBox.Show(_reply.CSharpReply.ToString());&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Entonces, para escribir aplicaciones servidoras, usted debe editar la plantilla para servidores ''evo_template'', y en el archivo llamado ''evo_request_handler.erl'' que se encuentra en la carpeta ''sources'', a partir de la línea 28, parte: '''[USER FUNCTIONS TO MODIFY]''' escribir nuestro código. Para el caso del ejemplo 1 sería:&lt;br /&gt;
&lt;br /&gt;
    {{conocer_mi_saldo, Nombre}, Pid, RequestInfo}-&amp;gt;&lt;br /&gt;
        Reply = evo_db_module:obtener_saldo(Nombre), %% Esta función se implementa en otro módulo.&lt;br /&gt;
        Pid ! {reply, Reply, RequestInfo};&lt;br /&gt;
&lt;br /&gt;
Esta es la sencilla forma con la cual se escriben aplicaciones cliente – servidor en EVO. Si usted se pregunta ¿Cómo es posible?, ¿Debe haber algo más?, la respuesta es simplemente, ¡esto es todo!. El componente EVO en su integridad, tanto la plantilla ''evo_template'' para desarrollar aplicaciones servidoras, como la librería ''ExtendedVisualOtp.dll'' para desarrollar las aplicaciones clientes, se encarga por usted de desarrollar todo el trabajo engorroso. Usted simplemente se abstrae a que existe un cartero muy veloz y eficaz, al que usted puede llamar para que entregue sus cartas o mensajes a un destinatario determinado, que en este caso, es el servidor, el cual puede enviar también ese mensaje a las demás personas en todo el “mundo”, o a una persona en específico; si es programado de esa forma.&lt;br /&gt;
&lt;br /&gt;
==Enviando objetos==&lt;br /&gt;
En EVO enviar objetos es tan fácil como pasar un objeto a un método por parámetro, con solo enviar el objeto como parámetro de la petición, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    class MiObjeto {&lt;br /&gt;
        string nombre;&lt;br /&gt;
        int id;&lt;br /&gt;
        void obtener_nombre() {&lt;br /&gt;
            return this.nombre;&lt;br /&gt;
        }&lt;br /&gt;
        void poner_nombre(string _nombre) {&lt;br /&gt;
            this.nombre = _nombre;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MiObjeto obj = new MiObjeto ();&lt;br /&gt;
    obj.poner_nombre(“ExtendedVisualOtp”);&lt;br /&gt;
    &lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ enviar_mi_objeto’ ”,  obj);&lt;br /&gt;
&lt;br /&gt;
Para recibirlo en otro cliente, si en el servidor se programa para que envíe el mismo mensaje a todos los demás clientes, es el mismo mecanismo de siempre pero casteando con la clase, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    MessageBox.Show((_reply.CSharpReply as MiObjeto).obtener_nombre());&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa con cualquier objeto serializable, ejemplo:&lt;br /&gt;
&lt;br /&gt;
    // Para hacer la petición.&lt;br /&gt;
    erlangServerRequest1.Request(new object[] {“ ‘enviar_imagen’ ”,&lt;br /&gt;
        new Image.FromFile(“c:\\prueba.jpg”));&lt;br /&gt;
&lt;br /&gt;
    // Para recibir la imagen en otro cliente.&lt;br /&gt;
    if (_reply.Description == “enviar_imagen”) {&lt;br /&gt;
        pictureBox1.Image = _reply.CSharpReply as Image;&lt;br /&gt;
&lt;br /&gt;
==Funcionalidades de la ExtendedVisualOtp.dll==&lt;br /&gt;
&lt;br /&gt;
===ConvertToCSharp===&lt;br /&gt;
Es una clase utilitaria para convertir objetos ''Otp.Erlang.Object'' a objetos CSharp.&lt;br /&gt;
*'''FromErlangObject(Otp.Erlang.Object _object)'''&lt;br /&gt;
:Convierte términos ''Otp.Erlang.Object'' en términos CSharp, ejemplo:&lt;br /&gt;
::''Otp.Erlang.List'': ''[lista]'' en CSharp ''List&amp;lt;object&amp;gt;''&lt;br /&gt;
::''Otp.Erlang.Tuple'': ''{tupla}'' en CSharp ''object[]''&lt;br /&gt;
::''Otp.Erlang.Atom'': ''‘átomo’'' en CSharp string: ''“ ‘átomo‘ ”''&lt;br /&gt;
:Un objeto ''Otp.Erlang.List'': ''[1, {nombre, “Ivan”}]'' es convertido a un objeto CSharp ''List&amp;lt;object&amp;gt;'':&lt;br /&gt;
:''new List&amp;lt;object&amp;gt;().AddRange(new object[] {1, new object[] { “ ‘nombre’ ”, “ExtendedVisualOtp” }})''&lt;br /&gt;
*'''FromErlangReply(Otp.Erlang.Object _replyObject)'''&lt;br /&gt;
:Convierte una respuesta o mensaje del servidor en formato ''Otp.Erlang.Object'' a un objeto CSharp de ''IServerReply''.&lt;br /&gt;
&lt;br /&gt;
===ConvertToErlang===&lt;br /&gt;
Es una clase utilitaria para convertir objetos CSharp a objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''ToErlangObject(object _object)'''&lt;br /&gt;
:Convierte objetos CSharp a objetos ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''List&amp;lt;object&amp;gt;'' en ''Otp.Erlang.List'': ''[lista]''&lt;br /&gt;
::''object[]'' en ''Otp.Erlang.Tuple'': ''{tupla}''&lt;br /&gt;
::string: ''“ ‘átomo’ ”'' en ''Otp.Erlang.Atom'': ''‘átomo’''&lt;br /&gt;
*'''ToErlangObjectFromString(string _object)'''&lt;br /&gt;
:Crea de una cadena CSharp un objeto ''Otp.Erlang.Object'', ejemplo:&lt;br /&gt;
::''“{nombre, \“Ivan\” , ’edad’, 26}”'' es convertido a un termino Erlang ''{nombre, “Ivan”, edad, 26}''.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerInterface===&lt;br /&gt;
Es un componente para configurar los parámetros de conexión en orden de trabajar como interface con el servidor.&lt;br /&gt;
*'''AutoTrace'''&lt;br /&gt;
:Establece si los mensajes de comunicación con el servidor deben ser mostrados en la consola de debug.&lt;br /&gt;
*'''Connect()'''&lt;br /&gt;
:Intenta la conexión con el servidor. &lt;br /&gt;
*'''ErlangCookie'''&lt;br /&gt;
:Establece la contraseña para conectarse con el nodo servidor Erlang.&lt;br /&gt;
*'''Disconnect()'''&lt;br /&gt;
:Le desconecta del servidor.&lt;br /&gt;
*'''IsConnected'''&lt;br /&gt;
:Obtiene el estado de la conexión.&lt;br /&gt;
*'''OnDisconnected'''&lt;br /&gt;
:Evento que se dispara cuando se pierde la conexión con el servidor.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando un mensaje del servidor es recibido. El parámetro es el mensaje.&lt;br /&gt;
*'''PingTimeOut'''&lt;br /&gt;
:Establece el tiempo de espera para conectarse con el servidor.&lt;br /&gt;
*'''RemoteAddress'''&lt;br /&gt;
:Establece la dirección del servidor.&lt;br /&gt;
*'''RemoteNodeName'''&lt;br /&gt;
:Establece el nombre del nodo servidor.&lt;br /&gt;
*'''RemoteProcessName'''&lt;br /&gt;
:Establece el nombre del proceso en el servidor que maneja las peticiones de los clientes.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En los eventos ''OnReceive'' y ''OnDisconnect'' de este componente.&lt;br /&gt;
*'''SentToErlangServerRequest(ErlangServerRequest _erlangServerRequest, IServerReply _reply)'''&lt;br /&gt;
:Permite re-direccionar los mensajes globales enviados por el servidor a una interface ''ErlangServerRequest'' dada.&lt;br /&gt;
*'''ServerPort'''&lt;br /&gt;
:Establece el puerto daemon para conectarse con el servidor Erlang.&lt;br /&gt;
*'''StartEVOTestApplication()'''&lt;br /&gt;
:Inicia la aplicación de pruebas EVO Test Application.&lt;br /&gt;
*'''UseShortNames'''&lt;br /&gt;
:Establece si el formato de nombres cortos para la dirección del servidor va a ser usando en la conexión, ejemplo de nombre corto ''pc5'', ejemplo de nombre largo: ''pc5.evo.cu''.&lt;br /&gt;
*'''AllowReceiveClientImage'''&lt;br /&gt;
:Propiedad que establece si se pueden recibir imágenes de clientes en su cliente receptor, esto se debe desactivar para problemas de seguridad, ya que si está activo puede ser blanco fácil de ataques, debido a que cualquier programador conectado al servidor puede enviarle una aplicación maliciosa y ser ejecutada en su pc. Esta opción está por defecto desactivada.&lt;br /&gt;
&lt;br /&gt;
===ErlangServerRequest===&lt;br /&gt;
Es un componente para realizar peticiones al servidor, utilizando el componente ''ErlangServerInterface'' como interface de conexión.&lt;br /&gt;
*'''AbortAllRequests()'''&lt;br /&gt;
:Aborta todas las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortAsyncRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Async'' (asincrónicas) realizadas al servidor.&lt;br /&gt;
*'''AbortNormalRequests()'''&lt;br /&gt;
:Aborta todas las peticiones del tipo ''Normal'' realizadas al servidor. Una petición del tipo ''Normal'' es una petición que espera porque se complete ella misma para retornar el control al programa, pero no espera por que la respuesta sea recibida, es a elección del programador esperar también por la respuesta utilizando la función ''WaitForReply()'' inmediatamente después de la petición.&lt;br /&gt;
*'''AbortRequest(IRequestInfo _requestInfo)'''&lt;br /&gt;
:Aborta una petición específica.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Establece el valor para la descripción de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''Message'''&lt;br /&gt;
:Establece el valor para el mensaje de la petición cuando se usan las funciones ''Request()'' o ''RequestAsync()'' sin parámetros.&lt;br /&gt;
*'''ErlangServerInterface'''&lt;br /&gt;
:Establece la interfaz de conexión.&lt;br /&gt;
*'''OnReceive'''&lt;br /&gt;
:Evento que se dispara cuando se recibe una respuesta a una petición realizada al servidor. El parámetro es la respuesta.&lt;br /&gt;
*'''Request(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(string _description, object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Async'' al servidor. Una petición del tipo ''Async'', es una petición que no espera por que sea completada ella misma para retornar el control al programa, tampoco espera por la respuesta. Este tipo de petición es realizada en un hilo independiente y no retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''Request(object _message)'''&lt;br /&gt;
:Realiza una petición del tipo ''Normal'' al servidor, extrayendo la descripción para la misma, del mismo mensaje. Retorna un objeto ''IRequestInfo''.&lt;br /&gt;
*'''RequestAsync(object _message)'''&lt;br /&gt;
Realiza una petición del tipo ''Async'' al servidor, extrayendo la descripción para la misma del mismo mensaje. No retorna ninguna información de petición ''IRequestInfo''.&lt;br /&gt;
*'''SetOwnerForm(Form _ownerForm)'''&lt;br /&gt;
:Establece la forma propietaria del componente para la validación de los errores de cruzamiento de hilos. Al establecer una forma como propietaria, no se necesitará validar para esta forma el tratamiento de requerimiento de invocación ''if (this.InvokeRequired) this.Invoke(delegate method)''. En el evento ''OnReceive'' de este componente.&lt;br /&gt;
*'''PublishClientImage()'''&lt;br /&gt;
:Publica a todos los clientes conectados al servidor la imagen de su aplicación. Esto es una funcionalidad extra para programadores que desean compartir ideas de sus aplicaciones. Para ello el programador receptor debe tener una aplicación conectada al servidor. Y el programador transmisor con solo ejecutar esta función al estar conectado también al servidor, la aplicación que esté desarrollando es transfería y ejecutada en la pc del programador receptor.&lt;br /&gt;
&lt;br /&gt;
===IRequestInfo===&lt;br /&gt;
Es una clase o interface que contiene información de las peticiones realizadas al servidor.&lt;br /&gt;
*'''AbortRequest()'''&lt;br /&gt;
:Aborta la petición a la que apunta el objeto ''IRequestInfo''.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Propiedad para obtener la descripción de una petición realizada al servidor.&lt;br /&gt;
*'''Kind'''&lt;br /&gt;
:Obtiene el tipo de petición realizada al servidor.&lt;br /&gt;
*'''WaitForReply()'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa.&lt;br /&gt;
*'''WaitForReply(int _timeout)'''&lt;br /&gt;
:Espera por la respuesta de la petición para retornar el control al programa un tiempo especificado por el parámetro ''_timeout'' en milisegundos.&lt;br /&gt;
*'''WasAnswered'''&lt;br /&gt;
:Indica si la petición fue contestada.&lt;br /&gt;
*'''WasMade'''&lt;br /&gt;
:Indica si la petición fue realizada.&lt;br /&gt;
&lt;br /&gt;
===IServerReply===&lt;br /&gt;
Es una clase o interfaz que contiene información acerca de la respuesta de una petición realizada.&lt;br /&gt;
*'''CSharpReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objeto CSharp.&lt;br /&gt;
*'''Description'''&lt;br /&gt;
:Contiene la descripción de la petición que generó esta respuesta.&lt;br /&gt;
*'''ErlangReply'''&lt;br /&gt;
:Contiene la respuesta en formato de objetos ''Otp.Erlang.Object''.&lt;br /&gt;
*'''RequestInfo'''&lt;br /&gt;
:Contiene el objeto ''IRequestInfo'' de la petición que generó esta respuesta.&lt;br /&gt;
&lt;br /&gt;
===RequestKind===&lt;br /&gt;
Es un enumerado que contiene los tipos de peticiones existentes en EVO.&lt;br /&gt;
*'''Async'''&lt;br /&gt;
:Es una petición que no espera por ella misma a que sea completada para retornar el control al programa, tampoco espera por que la respuesta a la misma sea recibida. No retorna información de petición ''IRequestInfo''. La respuesta debe ser obtenida de forma asincrónica a través del evento ''OnReceiv''e del componente ''ErlangServerRequest''. No es posible abortar esta petición una vez realizada, pero si es posible abortar todas las peticiones del mismo tipo ''Async'' incluyéndola, utilizando la función ''AbortAsyncRequests()'' del componente ''ErlangServerRequest''.&lt;br /&gt;
*'''Normal'''&lt;br /&gt;
:Es una petición que espera por ella misma a que sea completada para retornar el control al programa, pero no por que sea recibida la respuesta. Es a elección del programador si desea esperar por también por la respuesta para retornar el control al programa, utilizando la función ''WaitForReply()'' del mismo objeto ''IRequestInfo'', o abortar la misma utilizando la función ''AbortRequest()'' inmediatamente después de realizada la petición. Retorna un objeto ''IRequestInfo'' con la información de la petición.&lt;br /&gt;
*'''ServerSent'''&lt;br /&gt;
:Es un tipo de petición que no fue requerida por el cliente, esto significa que puede ser un mensaje global enviado voluntariamente por el servidor ejemplo utilizando la función ''send_to_all(Descripción, Mensaje)'' de la plantilla para servidores ''evo_template''. El objeto ''IRequestInfo'' del mensaje enviado por el servidor, puede ser obtenido mediante la propiedad ''RequestInfo'' del objeto de ''IServerReply'' obtenido una vez que el mensaje es recibido a través del evento ''OnReceive'' del componente ''ErlangServerInterface''. Este tipo de mensajes puede ser re-direccionado a un manejador de petición ''ErlangServerRequest'' utilizando la función S''endToErlangServerRequest'' del mismo componente ''ErlangServerInterface''.&lt;br /&gt;
&lt;br /&gt;
==La plantilla evo_template==&lt;br /&gt;
Archivos de la plantilla para servidores ''evo_template'':&lt;br /&gt;
*'''1.install.cmd'''&lt;br /&gt;
:Instala la aplicación servidora y su base de datos.&lt;br /&gt;
*'''1.start.cmd'''&lt;br /&gt;
:Inicia la aplicación servidora.&lt;br /&gt;
*'''2.service_install-start.cmd'''&lt;br /&gt;
:Instala la aplicación como un servicio de windows.&lt;br /&gt;
*'''2.service_stop.cmd'''&lt;br /&gt;
:Detiene la ejecución del servicio.&lt;br /&gt;
*'''2.service_uninstall.cmd'''&lt;br /&gt;
:Desinstala el servicio de windows.&lt;br /&gt;
*'''compile.cmd'''&lt;br /&gt;
:Comando para compilar los códigos fuentes de la carpeta ''[sources]''.&lt;br /&gt;
*'''config.cmd'''&lt;br /&gt;
:Archivo de configuración.&lt;br /&gt;
*'''Carpeta [beam]'''&lt;br /&gt;
:Contiene los archivos compilados necesarios para la ejecución de la aplicación servidora.&lt;br /&gt;
*'''appname.app'''&lt;br /&gt;
:Es el fichero de aplicación para las aplicaciones Erlang.&lt;br /&gt;
*'''appname.beam'''&lt;br /&gt;
:Es el punto de entrada a la aplicación servidora.&lt;br /&gt;
*'''appname_debug_module.beam'''&lt;br /&gt;
:Es el módulo de debug para imprimir mensajes en la consola de Erlang.&lt;br /&gt;
*'''appname_main_interface.beam'''&lt;br /&gt;
:Es el módulo de interface principal con el cliente.&lt;br /&gt;
*'''appname_main_supervisor.beam'''&lt;br /&gt;
:Es el módulo de supervisión que vela porque los demás módulos trabajen continuamente. Comportamiento Erlang/Otp.&lt;br /&gt;
*'''Carpeta [sources]'''&lt;br /&gt;
:Contiene los archivos fuentes necesarios para programar una aplicación servidora.&lt;br /&gt;
*'''appname_db_module.erl'''&lt;br /&gt;
:Es el módulo de base de datos, que implementa una capa para la base de datos de Erlang, mnesia. Aquí se pueden escribir los scripts de base de datos.&lt;br /&gt;
*'''appname_db_server.erl'''&lt;br /&gt;
:Es el módulo servidor para las funciones de base de datos, implementa el comportamiento gen_server.&lt;br /&gt;
*'''appname_request_handler.erl'''&lt;br /&gt;
:Módulo de manejo de peticiones de los clientes.&lt;br /&gt;
*'''to_compile.cmd'''&lt;br /&gt;
:Inicia una consola de compilación.&lt;br /&gt;
*'''user_default.erl'''&lt;br /&gt;
:Comandos de la consola de EVO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[Erlang]], Lenguaje de programación funcional de alto nivel.&lt;br /&gt;
*[[Lenguaje de Programación C Sharp|C Sharp]], lenguaje de programación orientado a objetos.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://comunidades.uci.cu/projects/evo *Comunidad Cubana del proyecto EVO* :)]&lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Visual_Basic&amp;diff=732579</id>
		<title>Visual Basic</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Visual_Basic&amp;diff=732579"/>
		<updated>2011-07-11T18:43:21Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Definición|Nombre=Visual Basic|imagen=VB.jpg|concepto=Visual Basic es un lenguaje de programación desarrollado por el alemán [[Alan Cooper]] para [[Microsoft]].}}'''Visual Basic'''. Es un lenguaje de programación desarrollado por el alemán [[Alan Cooper]] para [[Microsoft]]. El lenguaje de programación es un dialecto de BASIC, con importantes agregados. Su primera versión fue presentada en [[1991]], con la intención de simplificar la programación utilizando un ambiente de desarrollo completamente gráfico que facilitara la creación de interfaces gráficas y, en cierta medida, también la [[Programación]] misma. Desde el [[2001]] Microsoft ha propuesto abandonar el desarrollo basado en la API Win32 y pasar a trabajar sobre un framework o marco común de librerías independiente de la versión del sistema operativo, NET [[Framework]], a través de Visual Basic, NET (y otros lenguajes como [[Lenguaje de Programación C Sharp|C Sharp (C#)]] de fácil transición de código entre ellos). &lt;br /&gt;
&lt;br /&gt;
== Visual Basic  ==&lt;br /&gt;
&lt;br /&gt;
Visual basic. Constituye un [[IDE]] (entorno de desarrollo integrado, o, en inglés, Integrated Development Enviroment) que ha sido empaquetado como un Programa de aplicación; es decir, consiste en un editor de código (programa donde se escribe el código fuente), un depurador (programa que corrige errores en el código fuente para que pueda ser bien compilado), un compilador (programa que traduce el código fuente a lenguaje de máquina), y un constructor de interfaz gráfica o GUI (es una forma de programar en la que no es necesario escribir el código para la parte gráfica del [[Programa]], sino que se puede hacer de forma visual). &lt;br /&gt;
&lt;br /&gt;
Con Visual Basic se pueden desarrollar aplicaciones para [[Windows]] más rápidamente. Los errores de [[Programación]] no se generan tan frecuentemente y, si lo hacen, son más sencillos de depurar. Además incluye dos conceptos importantes: &lt;br /&gt;
&lt;br /&gt;
*Un método visual de creación de aplicaciones, incluyendo formularios ([[Ventanas]]), controles y, componentes del formulario. &lt;br /&gt;
*La habilidad de asociar código directamente a cada evento de cada elemento del diseño visual.&lt;br /&gt;
*ES posible escribir aplicaciones sin usar componentes visuales, es decir escribir [[Aplicaciones de consola en VB6|aplicaciones de consola]]).&lt;br /&gt;
&lt;br /&gt;
== La programación visual y guiados por eventos  ==&lt;br /&gt;
&lt;br /&gt;
Un [[Programa]] realizado en dos es un conjunto de sentencias que se ejecutan de arriba a abajo más o menos, en el orden que el programador ha diseñado. Una aplicación en Windows presenta todas las opciones posibles en uno o más Formularios para que el usuario elija entre ellas. La secuencia en la que se ejecutarán las sentencias no puede ser prevista por el programador. Ésto da lugar a la programación orientada a eventos. &lt;br /&gt;
&lt;br /&gt;
Para programar una aplicación en [[Windows]] hay que escribir código separado para cada objeto en general, quedando la aplicación dividida en pequeños procedimientos, conducido cada uno de ellos por un suceso. Un suceso es una acción reconocida por un objeto ([[formulario]] o control) el suceso puede ser causado por el usuario o, indirectamente por el código. &lt;br /&gt;
&lt;br /&gt;
En Visual Basic cada formulario y cada control tienen predefinidos un conjunto de sucesos. Cuando ocurren estos sucesos, Visual Basic invoca al procedimiento asociado con el objeto para ese suceso. Para desarrollar una aplicación en Visual_Basic, los pasos que se seguirán son: &lt;br /&gt;
&lt;br /&gt;
1.Crear la interfaz de usuario. &lt;br /&gt;
&lt;br /&gt;
2.Modificar las propiedades de cada objeto. &lt;br /&gt;
&lt;br /&gt;
3.Escribir el código asociado a los eventos de cada objeto. &lt;br /&gt;
&lt;br /&gt;
== El entorno Visual Basic  ==&lt;br /&gt;
&lt;br /&gt;
Los elementos que componen la pantalla de Visual Basic son: &lt;br /&gt;
&lt;br /&gt;
'''Barra de menús'''. Visualiza las órdenes que se utilizan para desarrollar, probar y archivar una aplicación. Los menús que nos encontramos son: &lt;br /&gt;
&lt;br /&gt;
*Archivo contiene las órdenes para trabajar con archivos. &lt;br /&gt;
*Edición contiene las herramientas que ayudan a escribir el código. &lt;br /&gt;
*Ver da acceso rápido a todas las partes del [[Programa]]. &lt;br /&gt;
*Insertar permite incluir nuevos módulos y formularios en la aplicación. &lt;br /&gt;
*Ejecutar permite verificar la aplicación mientras se desarrolla. &lt;br /&gt;
*Herramientas controla el aspecto y propiedades del entorno. &lt;br /&gt;
*Complementos contiene las utilidades para el manejo de [[bases de datos]]. &lt;br /&gt;
*Ayuda.&lt;br /&gt;
&lt;br /&gt;
'''Ventana o barra de herramientas'''. Facilita el uso a las órdenes más comunes. De izquierda a derecha los iconos que aparecen permiten: &lt;br /&gt;
&lt;br /&gt;
*[[Formulario]] crear un nuevo Formulario. &lt;br /&gt;
*Modulo crear un nuevo módulo. Se utiliza para crear fragmentos de código independiente del formulario. &lt;br /&gt;
*Abrir Project permite abrir un proyecto. &lt;br /&gt;
*Guardar Proyecto permite guardar un proyecto. &lt;br /&gt;
*Bloquear Controles impide que se muevan los controles del formulario involuntariamente. &lt;br /&gt;
*Editor de Menús visualiza la ventana de diseño de menús. &lt;br /&gt;
*Propiedades visualiza la ventana de propiedades de los distintos objetos. &lt;br /&gt;
*Examinador de Objetos muestra las clases, métodos, propiedades, etc. de los objetos disponibles en la aplicación. &lt;br /&gt;
*Proyecto visualiza la [[Ventana]] de proyecto. &lt;br /&gt;
*Inicio. &lt;br /&gt;
*Interrumpir. &lt;br /&gt;
*Terminar. &lt;br /&gt;
*Alternar Puntos de Ruptura. &lt;br /&gt;
*Inspección Instantánea visualiza el valor del elemento seleccionado en la ventana de código. &lt;br /&gt;
*Llamadas visualiza la estructura de llamadas activas. &lt;br /&gt;
*Paso a Paso por instrucciones. &lt;br /&gt;
*Paso a Paso por procedimientos.&lt;br /&gt;
&lt;br /&gt;
'''Caja de herramientas '''. Provee de un conjunto de herramientas que permiten colocar los controles en el formulario durante el diseño del proyecto. Ventana de proyecto. En esta ventana están especificados los ficheros (formularios, módulos, etc.) que forman la aplicación y, dónde se seleccionarán para crearlos o modificarlos. Esto se debe a que hay ficheros que pueden utilizarse en más de una aplicación. Además contiene dos botones: Ver Formulario que visualiza el formulario seleccionado y; Ver Código que visualiza el código del fichero seleccionado. &lt;br /&gt;
&lt;br /&gt;
'''Ventana del formulario '''. Es la ventana que da lugar a la interfaz de usuario. Es la ventana que se personalizará. Los puntos que aparecen sobre el formulario, forman una rejilla que ayuda a la hora de alinear los controles que se sitúan sobre el mismo. Esta rejilla desaparece en tiempo de ejecución. Para eliminarla en tiempo de diseño se accederá a la opción Herramientas/Opciones/Ficha Entorno/Mostrar Cuadrícula. &lt;br /&gt;
&lt;br /&gt;
'''Ventana de propiedades'''. Especifica las propiedades de cada uno de los objetos. En cada momento mostrará las propiedades del objeto seleccionado en el formulario. Está formada por dos partes: la lista desplegable de objetos que visualiza el nombre del objeto seleccionado y, la lista de propiedades del objeto seleccionado. &lt;br /&gt;
&lt;br /&gt;
== ¿Qué sucede al ejecutar una aplicación Visual Basic?  ==&lt;br /&gt;
&lt;br /&gt;
Los eventos que tendrán lugar a la hora de ejecutar una aplicación son: &lt;br /&gt;
&lt;br /&gt;
-Form&amp;amp;nbsp; Initialize &lt;br /&gt;
&lt;br /&gt;
-Form Load &lt;br /&gt;
&lt;br /&gt;
-Form Resize &lt;br /&gt;
&lt;br /&gt;
-Form Activate &lt;br /&gt;
&lt;br /&gt;
-Form GotFocus &lt;br /&gt;
&lt;br /&gt;
-Form Paint (solo en el caso de que la propiedad AutoRedraw del formulario esté establecida a False) y, antes de descargar un formulario de memoria, los eventos que tienen lugar son: &lt;br /&gt;
&lt;br /&gt;
*Form Terminate &lt;br /&gt;
*Form Unload&lt;br /&gt;
&lt;br /&gt;
== ¿Cómo funciona una aplicación Visual Basic?  ==&lt;br /&gt;
&lt;br /&gt;
Normalmente, se escribe código a los eventos a los que se quiera dar respuesta. Si el evento no tiene respuesta o no se produce, Visual Basic no hará nada, es decir no se ejecutará código alguno. Para poder ejecutar código, se tendrá que haber dado respuesta a algún evento de algún control y, que dicho evento tenga lugar. &lt;br /&gt;
&lt;br /&gt;
== ¿Es Visual Basic 4.0 orientado a objetos?  ==&lt;br /&gt;
&lt;br /&gt;
Visual Basic 4.0 es la primera versión realmente orientada a objetos. Cumple los tres conceptos clave: &lt;br /&gt;
&lt;br /&gt;
Encapsulación: La utiliza de manera diferente a [[C++]]. Los objetos Visual Basic tienen propiedades como color, tamaño, tipo de letra y, además incorporan unos métodos que responden a mensaje como clics de ratón, pulsación de teclas, etc. En los que se puede integrar código. Polimorfismo: Capacidad de reaccionar de manera distinta ante un mensaje idéntico, dependiendo del objeto que lo reciba, p.e. un clic del ratón recibido por un botón de comando o por una caja de texto. Herencia: Capacidad de derivarse a partir de otro objeto. &lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
&lt;br /&gt;
*Microsoft Visual Basic 6.0 Common Controls &lt;br /&gt;
*Manuales Básicos de Visual Basic (for scripting) &lt;br /&gt;
*Visual Basic [[2005]] Express Edition - Sitio web de la edición gratis de Visual Basic .NET &lt;br /&gt;
*Visual Basic en Open Directory Project&lt;br /&gt;
&lt;br /&gt;
== Enlace externo  ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.canalvisualbasic.net/manual/manual-visual-basic/ Canalvisualbasic]&lt;br /&gt;
&lt;br /&gt;
[[Category:Herramientas_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=CASE&amp;diff=732539</id>
		<title>CASE</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=CASE&amp;diff=732539"/>
		<updated>2011-07-11T18:37:13Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Herramientas&lt;br /&gt;
|nombre=CASE&lt;br /&gt;
|imagen=CASE.gif&lt;br /&gt;
|nombre_herramienta=Ingeniería de Software Asistida por Computadora.&lt;br /&gt;
|descripcion_herramienta=diversas aplicaciones [[informática]]s destinadas a aumentar la productividad en el desarrollo de [[software]] reduciendo los costes de las misma}}&lt;br /&gt;
&lt;br /&gt;
'''CASE'''(Cumputer Aided [[Software]] Engineering).Conjunto de programas y ayudas que dan asistencia a los analistas, ingenieros de Software y desarrolladores, durante todos los pasos del ciclo de vida de desarrollo de un software. Este puede ser generalmente aplicado a cualquier sistema o colección de herramientas que ayudan a automatizar el proceso de diseño y desarrollo de software. &lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
En la década del 70 un proyecto nombrado ISDOS diseñó un lenguaje denominado PSL que analizaba la relación existente entre los requisitos de un problema y las necesidades que éstos generaban. La aplicación que ayudaba a buscar las necesidades de los diseñadores se denominaba PSA. Este lenguaje y esta herramienta son consideradas como los inicios de  las herramientas informáticas que ayudan a crear nuevos proyectos informáticos.&lt;br /&gt;
&lt;br /&gt;
La primera herramienta CASE sale oficialmente a en el año [[1984]] nombrada  Excelerator y trabajaba bajo una plataforma PC.&lt;br /&gt;
&lt;br /&gt;
El máximo desarrollo de las herramientas CASE se alcanza a principios de los años 90. La [[IBM]] y la empresa de software AD/Cycle  habían conseguido una alianza para trabajabar con herramientas CASE que abarcaban todo el ciclo de vida del software utilizando mainframes. &lt;br /&gt;
&lt;br /&gt;
Los mainframes han ido siendo menos utilizados y el mercado de las Big CASE ha muerto completamente abriendo el mercado de diversas herramientas más específicas para cada fase del ciclo de vida del software.&lt;br /&gt;
&lt;br /&gt;
== Objetivos ==&lt;br /&gt;
* Mejorar la productividad en el desarrollo y mantenimiento del software.&lt;br /&gt;
* Aumentar la calidad del software.&lt;br /&gt;
* Reducir el tiempo y coste de desarrollo y mantenimiento de los sistemas informáticos.&lt;br /&gt;
*Mejorar la planificación de un proyecto&lt;br /&gt;
* Aumentar la biblioteca de conocimiento informático de una empresa ayudando a la búsqueda de soluciones para los requisitos.&lt;br /&gt;
* Automatizar el desarrollo del software, la documentación, la generación de código, las pruebas de errores y la gestión del proyecto.&lt;br /&gt;
*Ayuda a la reutilización del [[software]], portabilidad y estandarización de la documentación&lt;br /&gt;
* Gestión global en todas las fases de desarrollo de software con una misma herramienta.&lt;br /&gt;
*Facilitar el uso de las distintas metodologías propias de la ingeniería del software.&lt;br /&gt;
&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las herramientas CASE se pueden clasificar teniendo en cuenta los siguientes parámetros:&lt;br /&gt;
* Las plataformas que soportan.&lt;br /&gt;
* Las fases del ciclo de vida del desarrollo de sistemas que cubren.&lt;br /&gt;
* La arquitectura de las aplicaciones que producen.&lt;br /&gt;
* Su funcionalidad.&lt;br /&gt;
&lt;br /&gt;
También se pueden clasificar  basándose en las fases del ciclo de desarrollo que cubren:&lt;br /&gt;
* ''Upper CASE (U-CASE)'', herramientas que ayudan en las fases de planificación, análisis de requisitos y estrategia del desarrollo..&lt;br /&gt;
* ''Middle CASE (M-CASE)'', herramientas para automatizar tareas en el análisis y diseño de la aplicación.&lt;br /&gt;
* ''Lower CASE (L-CASE)'', herramientas que semi-automatizan la generación de código, crean programas de detección de errores, soportan la depuración de programas y pruebas,  además de  automatizar la documentación completa de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Tomando en consideración su funcionalidad se podrían identificar como:&lt;br /&gt;
* Herramientas de generación semiautomática de código.&lt;br /&gt;
* Editores [[UML]].&lt;br /&gt;
* Herramientas de Refactorización de código.&lt;br /&gt;
* Herramientas de mantenimiento como los sistemas de control de versiones.&lt;br /&gt;
==Algunas herramientas==&lt;br /&gt;
=== Visual Paradigm  ===&lt;br /&gt;
&lt;br /&gt;
Visual Paradigmas una de las herramientas UML CASE del mercado, considerada como muy completa y fácil de usar, con soporte multiplataforma y que proporciona excelente facilidades de interoperabilidad con otras aplicaciones. &lt;br /&gt;
&lt;br /&gt;
Fue creada para el ciclo vital completo del desarrollo de software que lo automatiza y acelera, permitiendo la captura de requisitos, análisis, diseño e implementación. Tiene la capacidad de crear el esquema de clases a partir de una base de datos y crear la definición de base de datos a partir del esquema de las clases. &lt;br /&gt;
&lt;br /&gt;
Permite invertir código fuente de programas, archivos ejecutables y binarios en modelos UML al instante, creando de manera simple toda la documentación. Está diseñada para usuarios interesados en sistemas de software de gran escala con el uso del acercamiento orientado a objeto, además apoya los estándares más recientes de las notaciones de Java y de UML. Incorpora el soporte para trabajo en equipo, que permite que varios desarrolladores trabajen a la vez en el mismo diagrama y vean en tiempo real los cambios hechos por sus compañeros. &lt;br /&gt;
&lt;br /&gt;
==== Características  ====&lt;br /&gt;
&lt;br /&gt;
* Producto de calidad&lt;br /&gt;
* Soporta aplicaciones [[Web]].&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
*Compatibilidad entre ediciones.&lt;br /&gt;
*Se integra con las siguientes herramientas Java:&lt;br /&gt;
** [[Eclipse]]/IBM WebSphere.&lt;br /&gt;
** Jbuilder.&lt;br /&gt;
** NetBeans IDE.&lt;br /&gt;
** [[Oracle]] Jdeveloper.&lt;br /&gt;
**BEA Weblogic. &lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Apoya todo lo básico en cuanto a artefactos generados en las etapas de definición de requerimientos y de especificación de componentes.&lt;br /&gt;
* Tiene apoyo adicional en cuanto a generación de artefactos automáticamente.&lt;br /&gt;
* Genera modelos VP-UML instantáneamente a partir de código binario .Net.&lt;br /&gt;
* Generación de documentación en formatos HTML y [[PDF]].&lt;br /&gt;
* Disponibilidad en múltiples plataformas: [[Microsoft Windows]] (98, 2000, XP, o Vista), [[Linux]], Mac OS X, [[Solaris]] o [[Java]].&lt;br /&gt;
* Brinda la posibilidad de intercambiar información mediante la importación y exportación de ficheros con aplicaciones como por ejemplo Visio y Rational Rose.&lt;br /&gt;
* Generación de código e ingeniería inversa: brinda la posibilidad de generar código a partir de los diagramas, para las plataformas como .Net, Java y [[PHP]], así como obtener los diagramas a partir del código.&lt;br /&gt;
* Generación de documentación: brinda la posibilidad de documentar todo el trabajo sin necesidad de utilizar herramientas externas. &lt;br /&gt;
&lt;br /&gt;
==== Desventajas  ====&lt;br /&gt;
&lt;br /&gt;
* Las imágenes y reportes generados, no son de muy buena calidad.&lt;br /&gt;
&lt;br /&gt;
===POSEIDON para UML===&lt;br /&gt;
&lt;br /&gt;
Es una herramienta para modelar cualquier clase de sistema que esté o no relacionada con programación. Poseidon para UML puede simplificar la compleja tarea de desarrollo de software ayudando a estructurar pensamientos, a clarificar la comunicación, y a encontrar la correcta abstracción. La incorrecta implantación de la herramienta UML, le sumergirá en detalles llenos de funciones extrañas y excesivamente complicadas, lo que le evitará el ahorro de tiempo y esfuerzo.&lt;br /&gt;
&lt;br /&gt;
La intuitiva interfaz hace de Poseidon una de las herramientas más rápidas de UML para dominar el análisis orientado a objetos, liberando al diseñador para centrase solamente en su modelo. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
* Soporta diagramas UML.&lt;br /&gt;
* Opciones avanzadas de impresión.&lt;br /&gt;
* Soporta gráficos en la mayoría de los formatos.&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
* Compatibilidad entre ediciones.&lt;br /&gt;
* Capacidades ampliables a través de plug-ins, es posible cargarlos en tiempo de ejecución&lt;br /&gt;
* Generación de documentación en HTML y formato Word 2003.&lt;br /&gt;
* Soporta los formatos gráficos gif, ps, eps, wmf, jpg y png.&lt;br /&gt;
&lt;br /&gt;
====Ventajas====&lt;br /&gt;
* Herramienta hecha completamente en Java, por lo que es independiente de la plataforma.&lt;br /&gt;
* Interfaz de usuario muy bien diseñada, fácil de aprender a usar e intuitiva.&lt;br /&gt;
&lt;br /&gt;
====Desventajas====&lt;br /&gt;
* En la versión Trial la grabación de proyectos está limitada a ocho diagramas.&lt;br /&gt;
&lt;br /&gt;
===ArgoUML===&lt;br /&gt;
Es una aplicación de diagramado de UML escrita en Java y publicada bajo la Licencia BSD ( Bekerley Software Distribution) open source. Dado que es una aplicación Java, está disponible en cualquier plataforma soportada por Java.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, desde la versión 0.20, ArgoUML está incompleto. No es conforme completamente a los estándares UML y carece de soporte completo para algunos tipos de diagramas de secuencia y los de colaboración. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
Nuevas características en V0.20:&lt;br /&gt;
* Características de extensibilidad mejoradas de UML 1.4.&lt;br /&gt;
* Diagramas de secuencia.&lt;br /&gt;
* Compatibilidad AndroMDA.&lt;br /&gt;
* Cientos de bugs han sido arreglados.&lt;br /&gt;
* La mayoría de las funciones ahora soportan la selección múltiple de los elementos del modelo.&lt;br /&gt;
* Se puede arrastrar y soltar desde el árbol de exploración al diagrama y dentro del árbol de exploración.&lt;br /&gt;
* Construido en diseños críticos, suministra una revisión no obstructiva del diseño y sugerencias para mejoras.&lt;br /&gt;
* Interfaz de módulos extensible.&lt;br /&gt;
* Soporte de internacionalización para inglés, alemán, francés, español y ruso.&lt;br /&gt;
* Restricciones OCL para clases.&lt;br /&gt;
* Soporte para el lenguaje de generación de código: Java, PHP, [[Python]], [[C++]] y [[Lenguaje de Programación C Sharp|C Sharp]].&lt;br /&gt;
* Ingeniería inversa.&lt;br /&gt;
* Disposición (layout) automática del diagrama de clases.&lt;br /&gt;
* Generación de ficheros png, gif, jpg, svg, eps desde diagramas.&lt;br /&gt;
* Soporte para comentarios para múltiples elementos.&lt;br /&gt;
* Todos los diagramas 1.4 están soportados.&lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Genera código automáticamente.&lt;br /&gt;
* Propone soluciones a algunos errores.&lt;br /&gt;
* Panel de propiedades y de tareas pendientes bastante útil. &lt;br /&gt;
&lt;br /&gt;
====Desventajas ====&lt;br /&gt;
&lt;br /&gt;
* Instalación costosa.&lt;br /&gt;
* Poco amigable.&lt;br /&gt;
* Difícil de empezar.&lt;br /&gt;
* No tiene botón ¨deshacer¨.&lt;br /&gt;
* Los modelos a veces no pueden ser re-abiertos.&lt;br /&gt;
* No hay llamadas reflexivas en los diagramas de secuencia.&lt;br /&gt;
* Se debe seleccionar una clase para crear un diagrama de secuencia. &lt;br /&gt;
== Fuentes==&lt;br /&gt;
&lt;br /&gt;
* http://hugolopez.phi.com.co &lt;br /&gt;
&lt;br /&gt;
* http://users.dsic.upv.es &lt;br /&gt;
&lt;br /&gt;
[[Category:Ciencias_informáticas]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732536</id>
		<title>ArgoUML</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732536"/>
		<updated>2011-07-11T18:37:07Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Algunas funciones y consideraciones importantes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ArgoUML&lt;br /&gt;
|familia=Desarrollo de software&lt;br /&gt;
|imagen=Argologo.jpg&lt;br /&gt;
|tamaño=18.1 Mb&lt;br /&gt;
|descripción=Logo de la aplicación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=0.32.1&lt;br /&gt;
|género=Ingeniería de Software&lt;br /&gt;
|sistemas operativos=Multiplataforma (Java)&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=BSD&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
'''ArgoUML'''.Es una herramienta libre de modelado&lt;br /&gt;
sencilla de utilizar, que incluye soporte para los diagramas del estándar [[UML]] y se  puede utilizar tanto para realizar&lt;br /&gt;
los [[diagramas]] de apoyo a la [[ingeniería de software]] como aplicar la [[Ingeniería inversa]] a proyectos ya terminados.&lt;br /&gt;
&lt;br /&gt;
==Introducción al software==&lt;br /&gt;
Durante la última década, el [[Análisis Orientado a Objeto y Diseño]] (Object Oriented Analysis and Design; OOA&amp;amp;D) se ha convertido en el paradigma de desarrollo de [[software]] dominante. Con ello se ha conseguido un gran avance en los procesos de pensamiento de todo el personal involucrado en el ciclo de vida del desarrollo del software.&lt;br /&gt;
En estos tiempos es imposible pensar en comenzar el desarrollo formal de cualquier software sin antes haber realizado todo el proceso de [[ingeniería]] necesario incluyendo el modelado de la aplicación que permita garantizar en el futuro la escalabilidad del mismo. Como soporte de este proceso existen varias herramientas basadas en [[UML]] ([[Unified Markup Lenguage]]) entre las que se encuentra el ArgoUML.&lt;br /&gt;
&lt;br /&gt;
==Algunas funciones y consideraciones importantes==         &lt;br /&gt;
ArgoUML fue concebido como un entorno y herramienta para utilizar en el análisis y diseño de [[sistemas de software orientados a objeto]]. En este sentido es similar a muchas de las herramientas [[CASE]] comerciales que son vendidas como herramientas para modelar sistemas software. ArgoUML tiene un número de distinciones muy importantes de muchas de esas herramientas. Al estar desarrollado en [[Java]] el programa no depende de ninguna plataforma por esa razón puede instalarse en múltiples [[sistemas operativos]], teniendo como única condición previa la [[máquina virtual de Java]] instalada ([[JDK]]). Además tiene soporte para [[UML]] 1.4 y proporciona buenas herramientas para dibujar y manipular los diagramas.&lt;br /&gt;
&lt;br /&gt;
Como muchas otras herramientas para el análisis de sistemas informáticos de esta potencia, ArgoUML proporciona la generación del código, el cual puede ser utilizado en los siguientes lenguajes: [[Java]], [[C++]], [[Lenguaje de Programación C Sharp|C Sharp]] (C#) y [[PHP]]. Como otro aspecto importante a tener en cuenta los proyectos de esta aplicación pueden exportarse a múltiples formatos gráficos mencionados con anterioridad.&lt;br /&gt;
&lt;br /&gt;
==Consejo para el trabajo con el software==&lt;br /&gt;
Para comenzar a trabajar con ArgoUML, sólo es necesario abrir la aplicación y pulsar con el botón derecho sobre el modelo en el menú de la izquierda, para seleccionar el tipo de [[diagrama]] a crear (de casos de uso, de clases, de actividades, etcétera). En la parte inferior derecha de la ventana, aparecen las propiedades del objeto seleccionado, las cuales se pueden modificar en cualquier momento, con sólo seleccionarla. En la ventana a la izquierda de las propiedades, aparecen las críticas, que son recomendaciones que realiza la aplicación con vistas a obtener un buen [[diagrama UML]].&lt;br /&gt;
Una vez creado el diagrama, para generar el [[código fuente]] sólo es necesario pulsar F7, o ir al menú principal, opción Generar (o Generate).&lt;br /&gt;
&lt;br /&gt;
=='''Tres mejores funciones'''==&lt;br /&gt;
* Posee soporte para el lenguaje de generación de Código: Java, PHP, [[Python]], C++ y CSharp.&lt;br /&gt;
* Permite la realización de ingeniería inversa&lt;br /&gt;
* Los diagramas pueden ser exportados a los siguientes formatos [[PNG]], [[GIF]], [[JPG]], [[SVG]], [[EPS]].&lt;br /&gt;
&lt;br /&gt;
==Conclusiones finales sobre el software==&lt;br /&gt;
El uso de herramientas como ArgoUML permite realizar un diseño de la aplicación empleando [[UML]], de manera que se puedan generar las clases del diagrama dibujado automáticamente. Así, el diagrama de clases no es sólo una ayuda al diseño de aplicaciones, sino que se convierte en un aporte interesante a la programación, lo cual puede ser un incentivo a tener en cuenta a la hora de realizar el proceso de análisis de sistemas informáticos.&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[StartUML]]&lt;br /&gt;
*[[CASE]]&lt;br /&gt;
==Fuentes==&lt;br /&gt;
*[http://revista.jovenclub.cu Revista Tino]&lt;br /&gt;
*[http://argouml.tigris.org Sitio Web oficial de ArgoUML]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software_Libre]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=CASE&amp;diff=732527</id>
		<title>CASE</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=CASE&amp;diff=732527"/>
		<updated>2011-07-11T18:35:55Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Herramientas&lt;br /&gt;
|nombre=CASE&lt;br /&gt;
|imagen=CASE.gif&lt;br /&gt;
|nombre_herramienta=Ingeniería de Software Asistida por Computadora.&lt;br /&gt;
|descripcion_herramienta=diversas aplicaciones [[informática]]s destinadas a aumentar la productividad en el desarrollo de [[software]] reduciendo los costes de las misma}}&lt;br /&gt;
&lt;br /&gt;
'''CASE'''(Cumputer Aided [[Software]] Engineering).Conjunto de programas y ayudas que dan asistencia a los analistas, ingenieros de Software y desarrolladores, durante todos los pasos del ciclo de vida de desarrollo de un software. Este puede ser generalmente aplicado a cualquier sistema o colección de herramientas que ayudan a automatizar el proceso de diseño y desarrollo de software. &lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
En la década del 70 un proyecto nombrado ISDOS diseñó un lenguaje denominado PSL que analizaba la relación existente entre los requisitos de un problema y las necesidades que éstos generaban. La aplicación que ayudaba a buscar las necesidades de los diseñadores se denominaba PSA. Este lenguaje y esta herramienta son consideradas como los inicios de  las herramientas informáticas que ayudan a crear nuevos proyectos informáticos.&lt;br /&gt;
&lt;br /&gt;
La primera herramienta CASE sale oficialmente a en el año [[1984]] nombrada  Excelerator y trabajaba bajo una plataforma PC.&lt;br /&gt;
&lt;br /&gt;
El máximo desarrollo de las herramientas CASE se alcanza a principios de los años 90. La [[IBM]] y la empresa de software AD/Cycle  habían conseguido una alianza para trabajabar con herramientas CASE que abarcaban todo el ciclo de vida del software utilizando mainframes. &lt;br /&gt;
&lt;br /&gt;
Los mainframes han ido siendo menos utilizados y el mercado de las Big CASE ha muerto completamente abriendo el mercado de diversas herramientas más específicas para cada fase del ciclo de vida del software.&lt;br /&gt;
&lt;br /&gt;
== Objetivos ==&lt;br /&gt;
* Mejorar la productividad en el desarrollo y mantenimiento del software.&lt;br /&gt;
* Aumentar la calidad del software.&lt;br /&gt;
* Reducir el tiempo y coste de desarrollo y mantenimiento de los sistemas informáticos.&lt;br /&gt;
*Mejorar la planificación de un proyecto&lt;br /&gt;
* Aumentar la biblioteca de conocimiento informático de una empresa ayudando a la búsqueda de soluciones para los requisitos.&lt;br /&gt;
* Automatizar el desarrollo del software, la documentación, la generación de código, las pruebas de errores y la gestión del proyecto.&lt;br /&gt;
*Ayuda a la reutilización del [[software]], portabilidad y estandarización de la documentación&lt;br /&gt;
* Gestión global en todas las fases de desarrollo de software con una misma herramienta.&lt;br /&gt;
*Facilitar el uso de las distintas metodologías propias de la ingeniería del software.&lt;br /&gt;
&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las herramientas CASE se pueden clasificar teniendo en cuenta los siguientes parámetros:&lt;br /&gt;
* Las plataformas que soportan.&lt;br /&gt;
* Las fases del ciclo de vida del desarrollo de sistemas que cubren.&lt;br /&gt;
* La arquitectura de las aplicaciones que producen.&lt;br /&gt;
* Su funcionalidad.&lt;br /&gt;
&lt;br /&gt;
También se pueden clasificar  basándose en las fases del ciclo de desarrollo que cubren:&lt;br /&gt;
* ''Upper CASE (U-CASE)'', herramientas que ayudan en las fases de planificación, análisis de requisitos y estrategia del desarrollo..&lt;br /&gt;
* ''Middle CASE (M-CASE)'', herramientas para automatizar tareas en el análisis y diseño de la aplicación.&lt;br /&gt;
* ''Lower CASE (L-CASE)'', herramientas que semi-automatizan la generación de código, crean programas de detección de errores, soportan la depuración de programas y pruebas,  además de  automatizar la documentación completa de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Tomando en consideración su funcionalidad se podrían identificar como:&lt;br /&gt;
* Herramientas de generación semiautomática de código.&lt;br /&gt;
* Editores [[UML]].&lt;br /&gt;
* Herramientas de Refactorización de código.&lt;br /&gt;
* Herramientas de mantenimiento como los sistemas de control de versiones.&lt;br /&gt;
==Algunas herramientas==&lt;br /&gt;
=== Visual Paradigm  ===&lt;br /&gt;
&lt;br /&gt;
Visual Paradigmas una de las herramientas UML CASE del mercado, considerada como muy completa y fácil de usar, con soporte multiplataforma y que proporciona excelente facilidades de interoperabilidad con otras aplicaciones. &lt;br /&gt;
&lt;br /&gt;
Fue creada para el ciclo vital completo del desarrollo de software que lo automatiza y acelera, permitiendo la captura de requisitos, análisis, diseño e implementación. Tiene la capacidad de crear el esquema de clases a partir de una base de datos y crear la definición de base de datos a partir del esquema de las clases. &lt;br /&gt;
&lt;br /&gt;
Permite invertir código fuente de programas, archivos ejecutables y binarios en modelos UML al instante, creando de manera simple toda la documentación. Está diseñada para usuarios interesados en sistemas de software de gran escala con el uso del acercamiento orientado a objeto, además apoya los estándares más recientes de las notaciones de Java y de UML. Incorpora el soporte para trabajo en equipo, que permite que varios desarrolladores trabajen a la vez en el mismo diagrama y vean en tiempo real los cambios hechos por sus compañeros. &lt;br /&gt;
&lt;br /&gt;
==== Características  ====&lt;br /&gt;
&lt;br /&gt;
* Producto de calidad&lt;br /&gt;
* Soporta aplicaciones [[Web]].&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
*Compatibilidad entre ediciones.&lt;br /&gt;
*Se integra con las siguientes herramientas Java:&lt;br /&gt;
** [[Eclipse]]/IBM WebSphere.&lt;br /&gt;
** Jbuilder.&lt;br /&gt;
** NetBeans IDE.&lt;br /&gt;
** [[Oracle]] Jdeveloper.&lt;br /&gt;
**BEA Weblogic. &lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Apoya todo lo básico en cuanto a artefactos generados en las etapas de definición de requerimientos y de especificación de componentes.&lt;br /&gt;
* Tiene apoyo adicional en cuanto a generación de artefactos automáticamente.&lt;br /&gt;
* Genera modelos VP-UML instantáneamente a partir de código binario .Net.&lt;br /&gt;
* Generación de documentación en formatos HTML y [[PDF]].&lt;br /&gt;
* Disponibilidad en múltiples plataformas: [[Microsoft Windows]] (98, 2000, XP, o Vista), [[Linux]], Mac OS X, [[Solaris]] o [[Java]].&lt;br /&gt;
* Brinda la posibilidad de intercambiar información mediante la importación y exportación de ficheros con aplicaciones como por ejemplo Visio y Rational Rose.&lt;br /&gt;
* Generación de código e ingeniería inversa: brinda la posibilidad de generar código a partir de los diagramas, para las plataformas como .Net, Java y [[PHP]], así como obtener los diagramas a partir del código.&lt;br /&gt;
* Generación de documentación: brinda la posibilidad de documentar todo el trabajo sin necesidad de utilizar herramientas externas. &lt;br /&gt;
&lt;br /&gt;
==== Desventajas  ====&lt;br /&gt;
&lt;br /&gt;
* Las imágenes y reportes generados, no son de muy buena calidad.&lt;br /&gt;
&lt;br /&gt;
===POSEIDON para UML===&lt;br /&gt;
&lt;br /&gt;
Es una herramienta para modelar cualquier clase de sistema que esté o no relacionada con programación. Poseidon para UML puede simplificar la compleja tarea de desarrollo de software ayudando a estructurar pensamientos, a clarificar la comunicación, y a encontrar la correcta abstracción. La incorrecta implantación de la herramienta UML, le sumergirá en detalles llenos de funciones extrañas y excesivamente complicadas, lo que le evitará el ahorro de tiempo y esfuerzo.&lt;br /&gt;
&lt;br /&gt;
La intuitiva interfaz hace de Poseidon una de las herramientas más rápidas de UML para dominar el análisis orientado a objetos, liberando al diseñador para centrase solamente en su modelo. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
* Soporta diagramas UML.&lt;br /&gt;
* Opciones avanzadas de impresión.&lt;br /&gt;
* Soporta gráficos en la mayoría de los formatos.&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
* Compatibilidad entre ediciones.&lt;br /&gt;
* Capacidades ampliables a través de plug-ins, es posible cargarlos en tiempo de ejecución&lt;br /&gt;
* Generación de documentación en HTML y formato Word 2003.&lt;br /&gt;
* Soporta los formatos gráficos gif, ps, eps, wmf, jpg y png.&lt;br /&gt;
&lt;br /&gt;
====Ventajas====&lt;br /&gt;
* Herramienta hecha completamente en Java, por lo que es independiente de la plataforma.&lt;br /&gt;
* Interfaz de usuario muy bien diseñada, fácil de aprender a usar e intuitiva.&lt;br /&gt;
&lt;br /&gt;
====Desventajas====&lt;br /&gt;
* En la versión Trial la grabación de proyectos está limitada a ocho diagramas.&lt;br /&gt;
&lt;br /&gt;
===ArgoUML===&lt;br /&gt;
Es una aplicación de diagramado de UML escrita en Java y publicada bajo la Licencia BSD ( Bekerley Software Distribution) open source. Dado que es una aplicación Java, está disponible en cualquier plataforma soportada por Java.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, desde la versión 0.20, ArgoUML está incompleto. No es conforme completamente a los estándares UML y carece de soporte completo para algunos tipos de diagramas de secuencia y los de colaboración. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
Nuevas características en V0.20:&lt;br /&gt;
* Características de extensibilidad mejoradas de UML 1.4.&lt;br /&gt;
* Diagramas de secuencia.&lt;br /&gt;
* Compatibilidad AndroMDA.&lt;br /&gt;
* Cientos de bugs han sido arreglados.&lt;br /&gt;
* La mayoría de las funciones ahora soportan la selección múltiple de los elementos del modelo.&lt;br /&gt;
* Se puede arrastrar y soltar desde el árbol de exploración al diagrama y dentro del árbol de exploración.&lt;br /&gt;
* Construido en diseños críticos, suministra una revisión no obstructiva del diseño y sugerencias para mejoras.&lt;br /&gt;
* Interfaz de módulos extensible.&lt;br /&gt;
* Soporte de internacionalización para inglés, alemán, francés, español y ruso.&lt;br /&gt;
* Restricciones OCL para clases.&lt;br /&gt;
* Soporte para el lenguaje de generación de código: Java, PHP, [[Python]], [[C++]] y [[Lenguaje de Programación C Sharp|CSharp]].&lt;br /&gt;
* Ingeniería inversa.&lt;br /&gt;
* Disposición (layout) automática del diagrama de clases.&lt;br /&gt;
* Generación de ficheros png, gif, jpg, svg, eps desde diagramas.&lt;br /&gt;
* Soporte para comentarios para múltiples elementos.&lt;br /&gt;
* Todos los diagramas 1.4 están soportados.&lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Genera código automáticamente.&lt;br /&gt;
* Propone soluciones a algunos errores.&lt;br /&gt;
* Panel de propiedades y de tareas pendientes bastante útil. &lt;br /&gt;
&lt;br /&gt;
====Desventajas ====&lt;br /&gt;
&lt;br /&gt;
* Instalación costosa.&lt;br /&gt;
* Poco amigable.&lt;br /&gt;
* Difícil de empezar.&lt;br /&gt;
* No tiene botón ¨deshacer¨.&lt;br /&gt;
* Los modelos a veces no pueden ser re-abiertos.&lt;br /&gt;
* No hay llamadas reflexivas en los diagramas de secuencia.&lt;br /&gt;
* Se debe seleccionar una clase para crear un diagrama de secuencia. &lt;br /&gt;
== Fuentes==&lt;br /&gt;
&lt;br /&gt;
* http://hugolopez.phi.com.co &lt;br /&gt;
&lt;br /&gt;
* http://users.dsic.upv.es &lt;br /&gt;
&lt;br /&gt;
[[Category:Ciencias_informáticas]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732501</id>
		<title>ArgoUML</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732501"/>
		<updated>2011-07-11T18:32:56Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Tres mejores funciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ArgoUML&lt;br /&gt;
|familia=Desarrollo de software&lt;br /&gt;
|imagen=Argologo.jpg&lt;br /&gt;
|tamaño=18.1 Mb&lt;br /&gt;
|descripción=Logo de la aplicación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=0.32.1&lt;br /&gt;
|género=Ingeniería de Software&lt;br /&gt;
|sistemas operativos=Multiplataforma (Java)&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=BSD&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
'''ArgoUML'''.Es una herramienta libre de modelado&lt;br /&gt;
sencilla de utilizar, que incluye soporte para los diagramas del estándar [[UML]] y se  puede utilizar tanto para realizar&lt;br /&gt;
los [[diagramas]] de apoyo a la [[ingeniería de software]] como aplicar la [[Ingeniería inversa]] a proyectos ya terminados.&lt;br /&gt;
&lt;br /&gt;
==Introducción al software==&lt;br /&gt;
Durante la última década, el [[Análisis Orientado a Objeto y Diseño]] (Object Oriented Analysis and Design; OOA&amp;amp;D) se ha convertido en el paradigma de desarrollo de [[software]] dominante. Con ello se ha conseguido un gran avance en los procesos de pensamiento de todo el personal involucrado en el ciclo de vida del desarrollo del software.&lt;br /&gt;
En estos tiempos es imposible pensar en comenzar el desarrollo formal de cualquier software sin antes haber realizado todo el proceso de [[ingeniería]] necesario incluyendo el modelado de la aplicación que permita garantizar en el futuro la escalabilidad del mismo. Como soporte de este proceso existen varias herramientas basadas en [[UML]] ([[Unified Markup Lenguage]]) entre las que se encuentra el ArgoUML.&lt;br /&gt;
&lt;br /&gt;
==Algunas funciones y consideraciones importantes==         &lt;br /&gt;
ArgoUML fue concebido como un entorno y herramienta para utilizar en el análisis y diseño de [[sistemas de software orientados a objeto]]. En este sentido es similar a muchas de las herramientas [[CASE]] comerciales que son vendidas como herramientas para modelar sistemas software. ArgoUML tiene un número de distinciones muy importantes de muchas de esas herramientas. Al estar desarrollado en [[Java]] el programa no depende de ninguna plataforma por esa razón puede instalarse en múltiples [[sistemas operativos]], teniendo como única condición previa la [[máquina virtual de Java]] instalada ([[JDK]]). Además tiene soporte para [[UML]] 1.4 y proporciona buenas herramientas para dibujar y manipular los diagramas.&lt;br /&gt;
&lt;br /&gt;
Como muchas otras herramientas para el análisis de sistemas informáticos de esta potencia, ArgoUML proporciona la generación del código, el cual puede ser utilizado en los siguientes lenguajes: [[Java]], [[C++]], [[C Sharp]] (C#) y [[PHP]]. Como otro aspecto importante a tener en cuenta los proyectos de esta aplicación pueden exportarse a múltiples formatos gráficos mencionados con anterioridad.&lt;br /&gt;
&lt;br /&gt;
==Consejo para el trabajo con el software==&lt;br /&gt;
Para comenzar a trabajar con ArgoUML, sólo es necesario abrir la aplicación y pulsar con el botón derecho sobre el modelo en el menú de la izquierda, para seleccionar el tipo de [[diagrama]] a crear (de casos de uso, de clases, de actividades, etcétera). En la parte inferior derecha de la ventana, aparecen las propiedades del objeto seleccionado, las cuales se pueden modificar en cualquier momento, con sólo seleccionarla. En la ventana a la izquierda de las propiedades, aparecen las críticas, que son recomendaciones que realiza la aplicación con vistas a obtener un buen [[diagrama UML]].&lt;br /&gt;
Una vez creado el diagrama, para generar el [[código fuente]] sólo es necesario pulsar F7, o ir al menú principal, opción Generar (o Generate).&lt;br /&gt;
&lt;br /&gt;
=='''Tres mejores funciones'''==&lt;br /&gt;
* Posee soporte para el lenguaje de generación de Código: Java, PHP, [[Python]], C++ y CSharp.&lt;br /&gt;
* Permite la realización de ingeniería inversa&lt;br /&gt;
* Los diagramas pueden ser exportados a los siguientes formatos [[PNG]], [[GIF]], [[JPG]], [[SVG]], [[EPS]].&lt;br /&gt;
&lt;br /&gt;
==Conclusiones finales sobre el software==&lt;br /&gt;
El uso de herramientas como ArgoUML permite realizar un diseño de la aplicación empleando [[UML]], de manera que se puedan generar las clases del diagrama dibujado automáticamente. Así, el diagrama de clases no es sólo una ayuda al diseño de aplicaciones, sino que se convierte en un aporte interesante a la programación, lo cual puede ser un incentivo a tener en cuenta a la hora de realizar el proceso de análisis de sistemas informáticos.&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[StartUML]]&lt;br /&gt;
*[[CASE]]&lt;br /&gt;
==Fuentes==&lt;br /&gt;
*[http://revista.jovenclub.cu Revista Tino]&lt;br /&gt;
*[http://argouml.tigris.org Sitio Web oficial de ArgoUML]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software_Libre]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732488</id>
		<title>ArgoUML</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732488"/>
		<updated>2011-07-11T18:30:58Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Algunas funciones y consideraciones importantes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ArgoUML&lt;br /&gt;
|familia=Desarrollo de software&lt;br /&gt;
|imagen=Argologo.jpg&lt;br /&gt;
|tamaño=18.1 Mb&lt;br /&gt;
|descripción=Logo de la aplicación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=0.32.1&lt;br /&gt;
|género=Ingeniería de Software&lt;br /&gt;
|sistemas operativos=Multiplataforma (Java)&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=BSD&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
'''ArgoUML'''.Es una herramienta libre de modelado&lt;br /&gt;
sencilla de utilizar, que incluye soporte para los diagramas del estándar [[UML]] y se  puede utilizar tanto para realizar&lt;br /&gt;
los [[diagramas]] de apoyo a la [[ingeniería de software]] como aplicar la [[Ingeniería inversa]] a proyectos ya terminados.&lt;br /&gt;
&lt;br /&gt;
==Introducción al software==&lt;br /&gt;
Durante la última década, el [[Análisis Orientado a Objeto y Diseño]] (Object Oriented Analysis and Design; OOA&amp;amp;D) se ha convertido en el paradigma de desarrollo de [[software]] dominante. Con ello se ha conseguido un gran avance en los procesos de pensamiento de todo el personal involucrado en el ciclo de vida del desarrollo del software.&lt;br /&gt;
En estos tiempos es imposible pensar en comenzar el desarrollo formal de cualquier software sin antes haber realizado todo el proceso de [[ingeniería]] necesario incluyendo el modelado de la aplicación que permita garantizar en el futuro la escalabilidad del mismo. Como soporte de este proceso existen varias herramientas basadas en [[UML]] ([[Unified Markup Lenguage]]) entre las que se encuentra el ArgoUML.&lt;br /&gt;
&lt;br /&gt;
==Algunas funciones y consideraciones importantes==         &lt;br /&gt;
ArgoUML fue concebido como un entorno y herramienta para utilizar en el análisis y diseño de [[sistemas de software orientados a objeto]]. En este sentido es similar a muchas de las herramientas [[CASE]] comerciales que son vendidas como herramientas para modelar sistemas software. ArgoUML tiene un número de distinciones muy importantes de muchas de esas herramientas. Al estar desarrollado en [[Java]] el programa no depende de ninguna plataforma por esa razón puede instalarse en múltiples [[sistemas operativos]], teniendo como única condición previa la [[máquina virtual de Java]] instalada ([[JDK]]). Además tiene soporte para [[UML]] 1.4 y proporciona buenas herramientas para dibujar y manipular los diagramas.&lt;br /&gt;
&lt;br /&gt;
Como muchas otras herramientas para el análisis de sistemas informáticos de esta potencia, ArgoUML proporciona la generación del código, el cual puede ser utilizado en los siguientes lenguajes: [[Java]], [[C++]], [[C Sharp]] (C#) y [[PHP]]. Como otro aspecto importante a tener en cuenta los proyectos de esta aplicación pueden exportarse a múltiples formatos gráficos mencionados con anterioridad.&lt;br /&gt;
&lt;br /&gt;
==Consejo para el trabajo con el software==&lt;br /&gt;
Para comenzar a trabajar con ArgoUML, sólo es necesario abrir la aplicación y pulsar con el botón derecho sobre el modelo en el menú de la izquierda, para seleccionar el tipo de [[diagrama]] a crear (de casos de uso, de clases, de actividades, etcétera). En la parte inferior derecha de la ventana, aparecen las propiedades del objeto seleccionado, las cuales se pueden modificar en cualquier momento, con sólo seleccionarla. En la ventana a la izquierda de las propiedades, aparecen las críticas, que son recomendaciones que realiza la aplicación con vistas a obtener un buen [[diagrama UML]].&lt;br /&gt;
Una vez creado el diagrama, para generar el [[código fuente]] sólo es necesario pulsar F7, o ir al menú principal, opción Generar (o Generate).&lt;br /&gt;
&lt;br /&gt;
=='''Tres mejores funciones'''==&lt;br /&gt;
* Posee soporte para el lenguaje de generación de Código: [[Java]], [[PHP]], [[Python]], [[C++]] y [[CSharp]] ([[C#]])&lt;br /&gt;
* Permite la realización de ingeniería inversa&lt;br /&gt;
* Los diagramas pueden ser exportados a los siguientes formatos [[PNG]], [[GIF]], [[JPG]], [[SVG]], [[EPS]].&lt;br /&gt;
&lt;br /&gt;
==Conclusiones finales sobre el software==&lt;br /&gt;
El uso de herramientas como ArgoUML permite realizar un diseño de la aplicación empleando [[UML]], de manera que se puedan generar las clases del diagrama dibujado automáticamente. Así, el diagrama de clases no es sólo una ayuda al diseño de aplicaciones, sino que se convierte en un aporte interesante a la programación, lo cual puede ser un incentivo a tener en cuenta a la hora de realizar el proceso de análisis de sistemas informáticos.&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[StartUML]]&lt;br /&gt;
*[[CASE]]&lt;br /&gt;
==Fuentes==&lt;br /&gt;
*[http://revista.jovenclub.cu Revista Tino]&lt;br /&gt;
*[http://argouml.tigris.org Sitio Web oficial de ArgoUML]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software_Libre]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732472</id>
		<title>ArgoUML</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732472"/>
		<updated>2011-07-11T18:28:33Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Introducción al software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ArgoUML&lt;br /&gt;
|familia=Desarrollo de software&lt;br /&gt;
|imagen=Argologo.jpg&lt;br /&gt;
|tamaño=18.1 Mb&lt;br /&gt;
|descripción=Logo de la aplicación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=0.32.1&lt;br /&gt;
|género=Ingeniería de Software&lt;br /&gt;
|sistemas operativos=Multiplataforma (Java)&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=BSD&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
'''ArgoUML'''.Es una herramienta libre de modelado&lt;br /&gt;
sencilla de utilizar, que incluye soporte para los diagramas del estándar [[UML]] y se  puede utilizar tanto para realizar&lt;br /&gt;
los [[diagramas]] de apoyo a la [[ingeniería de software]] como aplicar la [[Ingeniería inversa]] a proyectos ya terminados.&lt;br /&gt;
&lt;br /&gt;
==Introducción al software==&lt;br /&gt;
Durante la última década, el [[Análisis Orientado a Objeto y Diseño]] (Object Oriented Analysis and Design; OOA&amp;amp;D) se ha convertido en el paradigma de desarrollo de [[software]] dominante. Con ello se ha conseguido un gran avance en los procesos de pensamiento de todo el personal involucrado en el ciclo de vida del desarrollo del software.&lt;br /&gt;
En estos tiempos es imposible pensar en comenzar el desarrollo formal de cualquier software sin antes haber realizado todo el proceso de [[ingeniería]] necesario incluyendo el modelado de la aplicación que permita garantizar en el futuro la escalabilidad del mismo. Como soporte de este proceso existen varias herramientas basadas en [[UML]] ([[Unified Markup Lenguage]]) entre las que se encuentra el ArgoUML.&lt;br /&gt;
&lt;br /&gt;
==Algunas funciones y consideraciones importantes==         &lt;br /&gt;
ArgoUML fue concebido como un entorno y herramienta para utilizar en el análisis y diseño de [[sistemas de software orientados a objeto]]. En este sentido es similar a muchas de las herramientas [[CASE]] comerciales que son vendidas como herramientas para modelar sistemas software. ArgoUML tiene un número de distinciones muy importantes de muchas de esas herramientas. Al estar desarrollado en [[Java]] el programa no depende de ninguna plataforma por esa razón puede instalarse en múltiples [[sistemas operativos]], teniendo como única condición previa la [[máquina virtual de Java]] instalada ([[JDK]]). Además tiene soporte para [[UML]] 1.4 y proporciona buenas herramientas para dibujar y manipular los diagramas.&lt;br /&gt;
&lt;br /&gt;
Como muchas otras herramientas para el análisis de sistemas informáticos de esta potencia, ArgoUML proporciona la generación del código, el cual puede ser utilizado en los siguientes lenguajes: [[Java]], [[C++]], [[CSharp]] (C#) y [[PHP]]. Como otro aspecto importante a tener en cuenta los proyectos de esta aplicación pueden exportarse a múltiples formatos gráficos mencionados con anterioridad.&lt;br /&gt;
&lt;br /&gt;
==Consejo para el trabajo con el software==&lt;br /&gt;
Para comenzar a trabajar con ArgoUML, sólo es necesario abrir la aplicación y pulsar con el botón derecho sobre el modelo en el menú de la izquierda, para seleccionar el tipo de [[diagrama]] a crear (de casos de uso, de clases, de actividades, etcétera). En la parte inferior derecha de la ventana, aparecen las propiedades del objeto seleccionado, las cuales se pueden modificar en cualquier momento, con sólo seleccionarla. En la ventana a la izquierda de las propiedades, aparecen las críticas, que son recomendaciones que realiza la aplicación con vistas a obtener un buen [[diagrama UML]].&lt;br /&gt;
Una vez creado el diagrama, para generar el [[código fuente]] sólo es necesario pulsar F7, o ir al menú principal, opción Generar (o Generate).&lt;br /&gt;
&lt;br /&gt;
=='''Tres mejores funciones'''==&lt;br /&gt;
* Posee soporte para el lenguaje de generación de Código: [[Java]], [[PHP]], [[Python]], [[C++]] y [[CSharp]] ([[C#]])&lt;br /&gt;
* Permite la realización de ingeniería inversa&lt;br /&gt;
* Los diagramas pueden ser exportados a los siguientes formatos [[PNG]], [[GIF]], [[JPG]], [[SVG]], [[EPS]].&lt;br /&gt;
&lt;br /&gt;
==Conclusiones finales sobre el software==&lt;br /&gt;
El uso de herramientas como ArgoUML permite realizar un diseño de la aplicación empleando [[UML]], de manera que se puedan generar las clases del diagrama dibujado automáticamente. Así, el diagrama de clases no es sólo una ayuda al diseño de aplicaciones, sino que se convierte en un aporte interesante a la programación, lo cual puede ser un incentivo a tener en cuenta a la hora de realizar el proceso de análisis de sistemas informáticos.&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[StartUML]]&lt;br /&gt;
*[[CASE]]&lt;br /&gt;
==Fuentes==&lt;br /&gt;
*[http://revista.jovenclub.cu Revista Tino]&lt;br /&gt;
*[http://argouml.tigris.org Sitio Web oficial de ArgoUML]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software_Libre]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732460</id>
		<title>ArgoUML</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732460"/>
		<updated>2011-07-11T18:26:51Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Algunas funciones y consideraciones importantes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ArgoUML&lt;br /&gt;
|familia=Desarrollo de software&lt;br /&gt;
|imagen=Argologo.jpg&lt;br /&gt;
|tamaño=18.1 Mb&lt;br /&gt;
|descripción=Logo de la aplicación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=0.32.1&lt;br /&gt;
|género=Ingeniería de Software&lt;br /&gt;
|sistemas operativos=Multiplataforma (Java)&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=BSD&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
'''ArgoUML'''.Es una herramienta libre de modelado&lt;br /&gt;
sencilla de utilizar, que incluye soporte para los diagramas del estándar [[UML]] y se  puede utilizar tanto para realizar&lt;br /&gt;
los [[diagramas]] de apoyo a la [[ingeniería de software]] como aplicar la [[Ingeniería inversa]] a proyectos ya terminados.&lt;br /&gt;
&lt;br /&gt;
==Introducción al software==&lt;br /&gt;
Durante la última década, el [[Análisis Orientado a Objeto y Diseño]] (Object Oriented Analysis and Design; OOA&amp;amp;D) se ha convertido en el paradigma de desarrollo de [[software]] dominante. Con ello se ha conseguido un gran avance en los procesos de pensamiento de todo el personal involucrado en el ciclo de vida del desarrollo del [[software]].&lt;br /&gt;
En estos tiempos es imposible pensar en comenzar el desarrollo formal de cualquier software sin antes haber realizado todo el proceso de [[ingeniería]] necesario incluyendo el modelado de la aplicación que permita garantizar en el futuro la escalabilidad del mismo. Como soporte de este proceso existen varias herramientas basadas en [[UML]] ([[Unified Markup Lenguage]]) entre las que se encuentra el ArgoUML.&lt;br /&gt;
&lt;br /&gt;
==Algunas funciones y consideraciones importantes==         &lt;br /&gt;
ArgoUML fue concebido como un entorno y herramienta para utilizar en el análisis y diseño de [[sistemas de software orientados a objeto]]. En este sentido es similar a muchas de las herramientas [[CASE]] comerciales que son vendidas como herramientas para modelar sistemas software. ArgoUML tiene un número de distinciones muy importantes de muchas de esas herramientas. Al estar desarrollado en [[Java]] el programa no depende de ninguna plataforma por esa razón puede instalarse en múltiples [[sistemas operativos]], teniendo como única condición previa la [[máquina virtual de Java]] instalada ([[JDK]]). Además tiene soporte para [[UML]] 1.4 y proporciona buenas herramientas para dibujar y manipular los diagramas.&lt;br /&gt;
&lt;br /&gt;
Como muchas otras herramientas para el análisis de sistemas informáticos de esta potencia, ArgoUML proporciona la generación del código, el cual puede ser utilizado en los siguientes lenguajes: [[Java]], [[C++]], [[CSharp]] (C#) y [[PHP]]. Como otro aspecto importante a tener en cuenta los proyectos de esta aplicación pueden exportarse a múltiples formatos gráficos mencionados con anterioridad.&lt;br /&gt;
&lt;br /&gt;
==Consejo para el trabajo con el software==&lt;br /&gt;
Para comenzar a trabajar con ArgoUML, sólo es necesario abrir la aplicación y pulsar con el botón derecho sobre el modelo en el menú de la izquierda, para seleccionar el tipo de [[diagrama]] a crear (de casos de uso, de clases, de actividades, etcétera). En la parte inferior derecha de la ventana, aparecen las propiedades del objeto seleccionado, las cuales se pueden modificar en cualquier momento, con sólo seleccionarla. En la ventana a la izquierda de las propiedades, aparecen las críticas, que son recomendaciones que realiza la aplicación con vistas a obtener un buen [[diagrama UML]].&lt;br /&gt;
Una vez creado el diagrama, para generar el [[código fuente]] sólo es necesario pulsar F7, o ir al menú principal, opción Generar (o Generate).&lt;br /&gt;
&lt;br /&gt;
=='''Tres mejores funciones'''==&lt;br /&gt;
* Posee soporte para el lenguaje de generación de Código: [[Java]], [[PHP]], [[Python]], [[C++]] y [[CSharp]] ([[C#]])&lt;br /&gt;
* Permite la realización de ingeniería inversa&lt;br /&gt;
* Los diagramas pueden ser exportados a los siguientes formatos [[PNG]], [[GIF]], [[JPG]], [[SVG]], [[EPS]].&lt;br /&gt;
&lt;br /&gt;
==Conclusiones finales sobre el software==&lt;br /&gt;
El uso de herramientas como ArgoUML permite realizar un diseño de la aplicación empleando [[UML]], de manera que se puedan generar las clases del diagrama dibujado automáticamente. Así, el diagrama de clases no es sólo una ayuda al diseño de aplicaciones, sino que se convierte en un aporte interesante a la programación, lo cual puede ser un incentivo a tener en cuenta a la hora de realizar el proceso de análisis de sistemas informáticos.&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[StartUML]]&lt;br /&gt;
*[[CASE]]&lt;br /&gt;
==Fuentes==&lt;br /&gt;
*[http://revista.jovenclub.cu Revista Tino]&lt;br /&gt;
*[http://argouml.tigris.org Sitio Web oficial de ArgoUML]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software_Libre]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732455</id>
		<title>ArgoUML</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=ArgoUML&amp;diff=732455"/>
		<updated>2011-07-11T18:25:42Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Tres mejores funciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=ArgoUML&lt;br /&gt;
|familia=Desarrollo de software&lt;br /&gt;
|imagen=Argologo.jpg&lt;br /&gt;
|tamaño=18.1 Mb&lt;br /&gt;
|descripción=Logo de la aplicación&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=0.32.1&lt;br /&gt;
|género=Ingeniería de Software&lt;br /&gt;
|sistemas operativos=Multiplataforma (Java)&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=BSD&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
}}&lt;br /&gt;
'''ArgoUML'''.Es una herramienta libre de modelado&lt;br /&gt;
sencilla de utilizar, que incluye soporte para los diagramas del estándar [[UML]] y se  puede utilizar tanto para realizar&lt;br /&gt;
los [[diagramas]] de apoyo a la [[ingeniería de software]] como aplicar la [[Ingeniería inversa]] a proyectos ya terminados.&lt;br /&gt;
&lt;br /&gt;
==Introducción al software==&lt;br /&gt;
Durante la última década, el [[Análisis Orientado a Objeto y Diseño]] (Object Oriented Analysis and Design; OOA&amp;amp;D) se ha convertido en el paradigma de desarrollo de [[software]] dominante. Con ello se ha conseguido un gran avance en los procesos de pensamiento de todo el personal involucrado en el ciclo de vida del desarrollo del [[software]].&lt;br /&gt;
En estos tiempos es imposible pensar en comenzar el desarrollo formal de cualquier software sin antes haber realizado todo el proceso de [[ingeniería]] necesario incluyendo el modelado de la aplicación que permita garantizar en el futuro la escalabilidad del mismo. Como soporte de este proceso existen varias herramientas basadas en [[UML]] ([[Unified Markup Lenguage]]) entre las que se encuentra el ArgoUML.&lt;br /&gt;
&lt;br /&gt;
==Algunas funciones y consideraciones importantes==         &lt;br /&gt;
ArgoUML fue concebido como un entorno y herramienta para utilizar en el análisis y diseño de [[sistemas de software orientados a objeto]]. En este sentido es similar a muchas de las herramientas [[CASE]] comerciales que son vendidas como herramientas para modelar sistemas software. ArgoUML tiene un número de distinciones muy importantes de muchas de esas herramientas. Al estar desarrollado en [[Java]] el programa no depende de ninguna plataforma por esa razón puede instalarse en múltiples [[sistemas operativos]], teniendo como única condición previa la [[máquina virtual de Java]] instalada ([[JDK]]). Además tiene soporte para [[UML]] 1.4 y proporciona buenas herramientas para dibujar y manipular los diagramas.&lt;br /&gt;
&lt;br /&gt;
Como muchas otras herramientas para el análisis de sistemas informáticos de esta potencia, ArgoUML proporciona la generación del código, el cual puede ser utilizado en los siguientes lenguajes: [[Java]], [[C++]], [[C#]] y [[PHP]]. Como otro aspecto importante a tener en cuenta los proyectos de esta aplicación pueden exportarse a múltiples formatos gráficos mencionados con anterioridad.&lt;br /&gt;
 &lt;br /&gt;
==Consejo para el trabajo con el software==&lt;br /&gt;
Para comenzar a trabajar con ArgoUML, sólo es necesario abrir la aplicación y pulsar con el botón derecho sobre el modelo en el menú de la izquierda, para seleccionar el tipo de [[diagrama]] a crear (de casos de uso, de clases, de actividades, etcétera). En la parte inferior derecha de la ventana, aparecen las propiedades del objeto seleccionado, las cuales se pueden modificar en cualquier momento, con sólo seleccionarla. En la ventana a la izquierda de las propiedades, aparecen las críticas, que son recomendaciones que realiza la aplicación con vistas a obtener un buen [[diagrama UML]].&lt;br /&gt;
Una vez creado el diagrama, para generar el [[código fuente]] sólo es necesario pulsar F7, o ir al menú principal, opción Generar (o Generate).&lt;br /&gt;
&lt;br /&gt;
=='''Tres mejores funciones'''==&lt;br /&gt;
* Posee soporte para el lenguaje de generación de Código: [[Java]], [[PHP]], [[Python]], [[C++]] y [[CSharp]] ([[C#]])&lt;br /&gt;
* Permite la realización de ingeniería inversa&lt;br /&gt;
* Los diagramas pueden ser exportados a los siguientes formatos [[PNG]], [[GIF]], [[JPG]], [[SVG]], [[EPS]].&lt;br /&gt;
&lt;br /&gt;
==Conclusiones finales sobre el software==&lt;br /&gt;
El uso de herramientas como ArgoUML permite realizar un diseño de la aplicación empleando [[UML]], de manera que se puedan generar las clases del diagrama dibujado automáticamente. Así, el diagrama de clases no es sólo una ayuda al diseño de aplicaciones, sino que se convierte en un aporte interesante a la programación, lo cual puede ser un incentivo a tener en cuenta a la hora de realizar el proceso de análisis de sistemas informáticos.&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[StartUML]]&lt;br /&gt;
*[[CASE]]&lt;br /&gt;
==Fuentes==&lt;br /&gt;
*[http://revista.jovenclub.cu Revista Tino]&lt;br /&gt;
*[http://argouml.tigris.org Sitio Web oficial de ArgoUML]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software_Libre]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=CASE&amp;diff=732451</id>
		<title>CASE</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=CASE&amp;diff=732451"/>
		<updated>2011-07-11T18:25:04Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Herramientas&lt;br /&gt;
|nombre=CASE&lt;br /&gt;
|imagen=CASE.gif&lt;br /&gt;
|nombre_herramienta=Ingeniería de Software Asistida por Computadora.&lt;br /&gt;
|descripcion_herramienta=diversas aplicaciones [[informática]]s destinadas a aumentar la productividad en el desarrollo de [[software]] reduciendo los costes de las misma}}&lt;br /&gt;
&lt;br /&gt;
'''CASE'''(Cumputer Aided [[Software]] Engineering).Conjunto de programas y ayudas que dan asistencia a los analistas, ingenieros de Software y desarrolladores, durante todos los pasos del ciclo de vida de desarrollo de un software. Este puede ser generalmente aplicado a cualquier sistema o colección de herramientas que ayudan a automatizar el proceso de diseño y desarrollo de software. &lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
En la década del 70 un proyecto nombrado ISDOS diseñó un lenguaje denominado PSL que analizaba la relación existente entre los requisitos de un problema y las necesidades que éstos generaban. La aplicación que ayudaba a buscar las necesidades de los diseñadores se denominaba PSA. Este lenguaje y esta herramienta son consideradas como los inicios de  las herramientas informáticas que ayudan a crear nuevos proyectos informáticos.&lt;br /&gt;
&lt;br /&gt;
La primera herramienta CASE sale oficialmente a en el año [[1984]] nombrada  Excelerator y trabajaba bajo una plataforma PC.&lt;br /&gt;
&lt;br /&gt;
El máximo desarrollo de las herramientas CASE se alcanza a principios de los años 90. La [[IBM]] y la empresa de software AD/Cycle  habían conseguido una alianza para trabajabar con herramientas CASE que abarcaban todo el ciclo de vida del software utilizando mainframes. &lt;br /&gt;
&lt;br /&gt;
Los mainframes han ido siendo menos utilizados y el mercado de las Big CASE ha muerto completamente abriendo el mercado de diversas herramientas más específicas para cada fase del ciclo de vida del software.&lt;br /&gt;
&lt;br /&gt;
== Objetivos ==&lt;br /&gt;
* Mejorar la productividad en el desarrollo y mantenimiento del software.&lt;br /&gt;
* Aumentar la calidad del software.&lt;br /&gt;
* Reducir el tiempo y coste de desarrollo y mantenimiento de los sistemas informáticos.&lt;br /&gt;
*Mejorar la planificación de un proyecto&lt;br /&gt;
* Aumentar la biblioteca de conocimiento informático de una empresa ayudando a la búsqueda de soluciones para los requisitos.&lt;br /&gt;
* Automatizar el desarrollo del software, la documentación, la generación de código, las pruebas de errores y la gestión del proyecto.&lt;br /&gt;
*Ayuda a la reutilización del [[software]], portabilidad y estandarización de la documentación&lt;br /&gt;
* Gestión global en todas las fases de desarrollo de software con una misma herramienta.&lt;br /&gt;
*Facilitar el uso de las distintas metodologías propias de la ingeniería del software.&lt;br /&gt;
&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las herramientas CASE se pueden clasificar teniendo en cuenta los siguientes parámetros:&lt;br /&gt;
* Las plataformas que soportan.&lt;br /&gt;
* Las fases del ciclo de vida del desarrollo de sistemas que cubren.&lt;br /&gt;
* La arquitectura de las aplicaciones que producen.&lt;br /&gt;
* Su funcionalidad.&lt;br /&gt;
&lt;br /&gt;
También se pueden clasificar  basándose en las fases del ciclo de desarrollo que cubren:&lt;br /&gt;
* ''Upper CASE (U-CASE)'', herramientas que ayudan en las fases de planificación, análisis de requisitos y estrategia del desarrollo..&lt;br /&gt;
* ''Middle CASE (M-CASE)'', herramientas para automatizar tareas en el análisis y diseño de la aplicación.&lt;br /&gt;
* ''Lower CASE (L-CASE)'', herramientas que semi-automatizan la generación de código, crean programas de detección de errores, soportan la depuración de programas y pruebas,  además de  automatizar la documentación completa de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Tomando en consideración su funcionalidad se podrían identificar como:&lt;br /&gt;
* Herramientas de generación semiautomática de código.&lt;br /&gt;
* Editores [[UML]].&lt;br /&gt;
* Herramientas de Refactorización de código.&lt;br /&gt;
* Herramientas de mantenimiento como los sistemas de control de versiones.&lt;br /&gt;
==Algunas herramientas==&lt;br /&gt;
=== Visual Paradigm  ===&lt;br /&gt;
&lt;br /&gt;
Visual Paradigmas una de las herramientas UML CASE del mercado, considerada como muy completa y fácil de usar, con soporte multiplataforma y que proporciona excelente facilidades de interoperabilidad con otras aplicaciones. &lt;br /&gt;
&lt;br /&gt;
Fue creada para el ciclo vital completo del desarrollo de software que lo automatiza y acelera, permitiendo la captura de requisitos, análisis, diseño e implementación. Tiene la capacidad de crear el esquema de clases a partir de una base de datos y crear la definición de base de datos a partir del esquema de las clases. &lt;br /&gt;
&lt;br /&gt;
Permite invertir código fuente de programas, archivos ejecutables y binarios en modelos UML al instante, creando de manera simple toda la documentación. Está diseñada para usuarios interesados en sistemas de software de gran escala con el uso del acercamiento orientado a objeto, además apoya los estándares más recientes de las notaciones de Java y de UML. Incorpora el soporte para trabajo en equipo, que permite que varios desarrolladores trabajen a la vez en el mismo diagrama y vean en tiempo real los cambios hechos por sus compañeros. &lt;br /&gt;
&lt;br /&gt;
==== Características  ====&lt;br /&gt;
&lt;br /&gt;
* Producto de calidad&lt;br /&gt;
* Soporta aplicaciones [[Web]].&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
*Compatibilidad entre ediciones.&lt;br /&gt;
*Se integra con las siguientes herramientas Java:&lt;br /&gt;
** [[Eclipse]]/IBM WebSphere.&lt;br /&gt;
** Jbuilder.&lt;br /&gt;
** NetBeans IDE.&lt;br /&gt;
** [[Oracle]] Jdeveloper.&lt;br /&gt;
**BEA Weblogic. &lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Apoya todo lo básico en cuanto a artefactos generados en las etapas de definición de requerimientos y de especificación de componentes.&lt;br /&gt;
* Tiene apoyo adicional en cuanto a generación de artefactos automáticamente.&lt;br /&gt;
* Genera modelos VP-UML instantáneamente a partir de código binario .Net.&lt;br /&gt;
* Generación de documentación en formatos HTML y [[PDF]].&lt;br /&gt;
* Disponibilidad en múltiples plataformas: [[Microsoft Windows]] (98, 2000, XP, o Vista), [[Linux]], Mac OS X, [[Solaris]] o [[Java]].&lt;br /&gt;
* Brinda la posibilidad de intercambiar información mediante la importación y exportación de ficheros con aplicaciones como por ejemplo Visio y Rational Rose.&lt;br /&gt;
* Generación de código e ingeniería inversa: brinda la posibilidad de generar código a partir de los diagramas, para las plataformas como .Net, Java y [[PHP]], así como obtener los diagramas a partir del código.&lt;br /&gt;
* Generación de documentación: brinda la posibilidad de documentar todo el trabajo sin necesidad de utilizar herramientas externas. &lt;br /&gt;
&lt;br /&gt;
==== Desventajas  ====&lt;br /&gt;
&lt;br /&gt;
* Las imágenes y reportes generados, no son de muy buena calidad.&lt;br /&gt;
&lt;br /&gt;
===POSEIDON para UML===&lt;br /&gt;
&lt;br /&gt;
Es una herramienta para modelar cualquier clase de sistema que esté o no relacionada con programación. Poseidon para UML puede simplificar la compleja tarea de desarrollo de software ayudando a estructurar pensamientos, a clarificar la comunicación, y a encontrar la correcta abstracción. La incorrecta implantación de la herramienta UML, le sumergirá en detalles llenos de funciones extrañas y excesivamente complicadas, lo que le evitará el ahorro de tiempo y esfuerzo.&lt;br /&gt;
&lt;br /&gt;
La intuitiva interfaz hace de Poseidon una de las herramientas más rápidas de UML para dominar el análisis orientado a objetos, liberando al diseñador para centrase solamente en su modelo. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
* Soporta diagramas UML.&lt;br /&gt;
* Opciones avanzadas de impresión.&lt;br /&gt;
* Soporta gráficos en la mayoría de los formatos.&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
* Compatibilidad entre ediciones.&lt;br /&gt;
* Capacidades ampliables a través de plug-ins, es posible cargarlos en tiempo de ejecución&lt;br /&gt;
* Generación de documentación en HTML y formato Word 2003.&lt;br /&gt;
* Soporta los formatos gráficos gif, ps, eps, wmf, jpg y png.&lt;br /&gt;
&lt;br /&gt;
====Ventajas====&lt;br /&gt;
* Herramienta hecha completamente en Java, por lo que es independiente de la plataforma.&lt;br /&gt;
* Interfaz de usuario muy bien diseñada, fácil de aprender a usar e intuitiva.&lt;br /&gt;
&lt;br /&gt;
====Desventajas====&lt;br /&gt;
* En la versión Trial la grabación de proyectos está limitada a ocho diagramas.&lt;br /&gt;
&lt;br /&gt;
===ArgoUML===&lt;br /&gt;
Es una aplicación de diagramado de UML escrita en Java y publicada bajo la Licencia BSD ( Bekerley Software Distribution) open source. Dado que es una aplicación Java, está disponible en cualquier plataforma soportada por Java.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, desde la versión 0.20, ArgoUML está incompleto. No es conforme completamente a los estándares UML y carece de soporte completo para algunos tipos de diagramas de secuencia y los de colaboración. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
Nuevas características en V0.20:&lt;br /&gt;
* Características de extensibilidad mejoradas de UML 1.4.&lt;br /&gt;
* Diagramas de secuencia.&lt;br /&gt;
* Compatibilidad AndroMDA.&lt;br /&gt;
* Cientos de bugs han sido arreglados.&lt;br /&gt;
* La mayoría de las funciones ahora soportan la selección múltiple de los elementos del modelo.&lt;br /&gt;
* Se puede arrastrar y soltar desde el árbol de exploración al diagrama y dentro del árbol de exploración.&lt;br /&gt;
* Construido en diseños críticos, suministra una revisión no obstructiva del diseño y sugerencias para mejoras.&lt;br /&gt;
* Interfaz de módulos extensible.&lt;br /&gt;
* Soporte de internacionalización para inglés, alemán, francés, español y ruso.&lt;br /&gt;
* Restricciones OCL para clases.&lt;br /&gt;
* Soporte para el lenguaje de generación de código: Java, PHP, [[Python]], [[C++]] y [[CSharp]].&lt;br /&gt;
* Ingeniería inversa.&lt;br /&gt;
* Disposición (layout) automática del diagrama de clases.&lt;br /&gt;
* Generación de ficheros png, gif, jpg, svg, eps desde diagramas.&lt;br /&gt;
* Soporte para comentarios para múltiples elementos.&lt;br /&gt;
* Todos los diagramas 1.4 están soportados.&lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Genera código automáticamente.&lt;br /&gt;
* Propone soluciones a algunos errores.&lt;br /&gt;
* Panel de propiedades y de tareas pendientes bastante útil. &lt;br /&gt;
&lt;br /&gt;
====Desventajas ====&lt;br /&gt;
&lt;br /&gt;
* Instalación costosa.&lt;br /&gt;
* Poco amigable.&lt;br /&gt;
* Difícil de empezar.&lt;br /&gt;
* No tiene botón ¨deshacer¨.&lt;br /&gt;
* Los modelos a veces no pueden ser re-abiertos.&lt;br /&gt;
* No hay llamadas reflexivas en los diagramas de secuencia.&lt;br /&gt;
* Se debe seleccionar una clase para crear un diagrama de secuencia. &lt;br /&gt;
== Fuentes==&lt;br /&gt;
&lt;br /&gt;
* http://hugolopez.phi.com.co &lt;br /&gt;
&lt;br /&gt;
* http://users.dsic.upv.es &lt;br /&gt;
&lt;br /&gt;
[[Category:Ciencias_informáticas]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=CASE&amp;diff=732434</id>
		<title>CASE</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=CASE&amp;diff=732434"/>
		<updated>2011-07-11T18:23:09Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Características */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Herramientas&lt;br /&gt;
|nombre=CASE&lt;br /&gt;
|imagen=CASE.gif&lt;br /&gt;
|nombre_herramienta=Ingeniería de Software Asistida por Computadora.&lt;br /&gt;
|descripcion_herramienta=diversas aplicaciones [[informática]]s destinadas a aumentar la productividad en el desarrollo de [[software]] reduciendo los costes de las misma}}&lt;br /&gt;
&lt;br /&gt;
'''CASE'''(Cumputer Aided [[Software]] Engineering).Conjunto de programas y ayudas que dan asistencia a los analistas, ingenieros de Software y desarrolladores, durante todos los pasos del ciclo de vida de desarrollo de un software. Este puede ser generalmente aplicado a cualquier sistema o colección de herramientas que ayudan a automatizar el proceso de diseño y desarrollo de software. &lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
En la década del 70 un proyecto nombrado ISDOS diseñó un lenguaje denominado PSL que analizaba la relación existente entre los requisitos de un problema y las necesidades que éstos generaban. La aplicación que ayudaba a buscar las necesidades de los diseñadores se denominaba PSA. Este lenguaje y esta herramienta son consideradas como los inicios de  las herramientas informáticas que ayudan a crear nuevos proyectos informáticos.&lt;br /&gt;
&lt;br /&gt;
La primera herramienta CASE sale oficialmente a en el año [[1984]] nombrada  Excelerator y trabajaba bajo una plataforma PC.&lt;br /&gt;
&lt;br /&gt;
El máximo desarrollo de las herramientas CASE se alcanza a principios de los años 90. La [[IBM]] y la empresa de software AD/Cycle  habían conseguido una alianza para trabajabar con herramientas CASE que abarcaban todo el ciclo de vida del software utilizando mainframes. &lt;br /&gt;
&lt;br /&gt;
Los mainframes han ido siendo menos utilizados y el mercado de las Big CASE ha muerto completamente abriendo el mercado de diversas herramientas más específicas para cada fase del ciclo de vida del software.&lt;br /&gt;
&lt;br /&gt;
== Objetivos ==&lt;br /&gt;
* Mejorar la productividad en el desarrollo y mantenimiento del software.&lt;br /&gt;
* Aumentar la calidad del software.&lt;br /&gt;
* Reducir el tiempo y coste de desarrollo y mantenimiento de los sistemas informáticos.&lt;br /&gt;
*Mejorar la planificación de un proyecto&lt;br /&gt;
* Aumentar la biblioteca de conocimiento informático de una empresa ayudando a la búsqueda de soluciones para los requisitos.&lt;br /&gt;
* Automatizar el desarrollo del software, la documentación, la generación de código, las pruebas de errores y la gestión del proyecto.&lt;br /&gt;
*Ayuda a la reutilización del [[software]], portabilidad y estandarización de la documentación&lt;br /&gt;
* Gestión global en todas las fases de desarrollo de software con una misma herramienta.&lt;br /&gt;
*Facilitar el uso de las distintas metodologías propias de la ingeniería del software.&lt;br /&gt;
&lt;br /&gt;
== Clasificación ==&lt;br /&gt;
Las herramientas CASE se pueden clasificar teniendo en cuenta los siguientes parámetros:&lt;br /&gt;
* Las plataformas que soportan.&lt;br /&gt;
* Las fases del ciclo de vida del desarrollo de sistemas que cubren.&lt;br /&gt;
* La arquitectura de las aplicaciones que producen.&lt;br /&gt;
* Su funcionalidad.&lt;br /&gt;
&lt;br /&gt;
También se pueden clasificar  basándose en las fases del ciclo de desarrollo que cubren:&lt;br /&gt;
* ''Upper CASE (U-CASE)'', herramientas que ayudan en las fases de planificación, análisis de requisitos y estrategia del desarrollo..&lt;br /&gt;
* ''Middle CASE (M-CASE)'', herramientas para automatizar tareas en el análisis y diseño de la aplicación.&lt;br /&gt;
* ''Lower CASE (L-CASE)'', herramientas que semi-automatizan la generación de código, crean programas de detección de errores, soportan la depuración de programas y pruebas,  además de  automatizar la documentación completa de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Tomando en consideración su funcionalidad se podrían identificar como:&lt;br /&gt;
* Herramientas de generación semiautomática de código.&lt;br /&gt;
* Editores [[UML]].&lt;br /&gt;
* Herramientas de Refactorización de código.&lt;br /&gt;
* Herramientas de mantenimiento como los sistemas de control de versiones.&lt;br /&gt;
==Algunas herramientas==&lt;br /&gt;
=== Visual Paradigm  ===&lt;br /&gt;
&lt;br /&gt;
Visual Paradigmas una de las herramientas UML CASE del mercado, considerada como muy completa y fácil de usar, con soporte multiplataforma y que proporciona excelente facilidades de interoperabilidad con otras aplicaciones. &lt;br /&gt;
&lt;br /&gt;
Fue creada para el ciclo vital completo del desarrollo de software que lo automatiza y acelera, permitiendo la captura de requisitos, análisis, diseño e implementación. Tiene la capacidad de crear el esquema de clases a partir de una base de datos y crear la definición de base de datos a partir del esquema de las clases. &lt;br /&gt;
&lt;br /&gt;
Permite invertir código fuente de programas, archivos ejecutables y binarios en modelos UML al instante, creando de manera simple toda la documentación. Está diseñada para usuarios interesados en sistemas de software de gran escala con el uso del acercamiento orientado a objeto, además apoya los estándares más recientes de las notaciones de Java y de UML. Incorpora el soporte para trabajo en equipo, que permite que varios desarrolladores trabajen a la vez en el mismo diagrama y vean en tiempo real los cambios hechos por sus compañeros. &lt;br /&gt;
&lt;br /&gt;
==== Características  ====&lt;br /&gt;
&lt;br /&gt;
* Producto de calidad&lt;br /&gt;
* Soporta aplicaciones [[Web]].&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
*Compatibilidad entre ediciones.&lt;br /&gt;
*Se integra con las siguientes herramientas Java:&lt;br /&gt;
** [[Eclipse]]/IBM WebSphere.&lt;br /&gt;
** Jbuilder.&lt;br /&gt;
** NetBeans IDE.&lt;br /&gt;
** [[Oracle]] Jdeveloper.&lt;br /&gt;
**BEA Weblogic. &lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Apoya todo lo básico en cuanto a artefactos generados en las etapas de definición de requerimientos y de especificación de componentes.&lt;br /&gt;
* Tiene apoyo adicional en cuanto a generación de artefactos automáticamente.&lt;br /&gt;
* Genera modelos VP-UML instantáneamente a partir de código binario .Net.&lt;br /&gt;
* Generación de documentación en formatos HTML y [[PDF]].&lt;br /&gt;
* Disponibilidad en múltiples plataformas: [[Microsoft Windows]] (98, 2000, XP, o Vista), [[Linux]], Mac OS X, [[Solaris]] o [[Java]].&lt;br /&gt;
* Brinda la posibilidad de intercambiar información mediante la importación y exportación de ficheros con aplicaciones como por ejemplo Visio y Rational Rose.&lt;br /&gt;
* Generación de código e ingeniería inversa: brinda la posibilidad de generar código a partir de los diagramas, para las plataformas como .Net, Java y [[PHP]], así como obtener los diagramas a partir del código.&lt;br /&gt;
* Generación de documentación: brinda la posibilidad de documentar todo el trabajo sin necesidad de utilizar herramientas externas. &lt;br /&gt;
&lt;br /&gt;
==== Desventajas  ====&lt;br /&gt;
&lt;br /&gt;
* Las imágenes y reportes generados, no son de muy buena calidad.&lt;br /&gt;
&lt;br /&gt;
===POSEIDON para UML===&lt;br /&gt;
&lt;br /&gt;
Es una herramienta para modelar cualquier clase de sistema que esté o no relacionada con programación. Poseidon para UML puede simplificar la compleja tarea de desarrollo de software ayudando a estructurar pensamientos, a clarificar la comunicación, y a encontrar la correcta abstracción. La incorrecta implantación de la herramienta UML, le sumergirá en detalles llenos de funciones extrañas y excesivamente complicadas, lo que le evitará el ahorro de tiempo y esfuerzo.&lt;br /&gt;
&lt;br /&gt;
La intuitiva interfaz hace de Poseidon una de las herramientas más rápidas de UML para dominar el análisis orientado a objetos, liberando al diseñador para centrase solamente en su modelo. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
* Soporta diagramas UML.&lt;br /&gt;
* Opciones avanzadas de impresión.&lt;br /&gt;
* Soporta gráficos en la mayoría de los formatos.&lt;br /&gt;
* Varios idiomas.&lt;br /&gt;
* Generación de código para Java y exportación como HTML.&lt;br /&gt;
* Fácil de instalar y actualizar.&lt;br /&gt;
* Compatibilidad entre ediciones.&lt;br /&gt;
* Capacidades ampliables a través de plug-ins, es posible cargarlos en tiempo de ejecución&lt;br /&gt;
* Generación de documentación en HTML y formato Word 2003.&lt;br /&gt;
* Soporta los formatos gráficos gif, ps, eps, wmf, jpg y png.&lt;br /&gt;
&lt;br /&gt;
====Ventajas====&lt;br /&gt;
* Herramienta hecha completamente en Java, por lo que es independiente de la plataforma.&lt;br /&gt;
* Interfaz de usuario muy bien diseñada, fácil de aprender a usar e intuitiva.&lt;br /&gt;
&lt;br /&gt;
====Desventajas====&lt;br /&gt;
* En la versión Trial la grabación de proyectos está limitada a ocho diagramas.&lt;br /&gt;
&lt;br /&gt;
===ArgoUML===&lt;br /&gt;
Es una aplicación de diagramado de UML escrita en Java y publicada bajo la Licencia BSD ( Bekerley Software Distribution) open source. Dado que es una aplicación Java, está disponible en cualquier plataforma soportada por Java.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, desde la versión 0.20, ArgoUML está incompleto. No es conforme completamente a los estándares UML y carece de soporte completo para algunos tipos de diagramas de secuencia y los de colaboración. &lt;br /&gt;
&lt;br /&gt;
====Características ====&lt;br /&gt;
&lt;br /&gt;
Nuevas características en V0.20:&lt;br /&gt;
* Características de extensibilidad mejoradas de UML 1.4.&lt;br /&gt;
* Diagramas de secuencia.&lt;br /&gt;
* Compatibilidad AndroMDA.&lt;br /&gt;
* Cientos de bugs han sido arreglados.&lt;br /&gt;
* La mayoría de las funciones ahora soportan la selección múltiple de los elementos del modelo.&lt;br /&gt;
* Se puede arrastrar y soltar desde el árbol de exploración al diagrama y dentro del árbol de exploración.&lt;br /&gt;
* Construido en diseños críticos, suministra una revisión no obstructiva del diseño y sugerencias para mejoras.&lt;br /&gt;
* Interfaz de módulos extensible.&lt;br /&gt;
* Soporte de internacionalización para inglés, alemán, francés, español y ruso.&lt;br /&gt;
* Restricciones OCL para clases.&lt;br /&gt;
* Soporte para el lenguaje de generación de código: [[Java]], [[PHP]], [[Python]], [[C++]] y [[CSharp]].&lt;br /&gt;
* Ingeniería inversa.&lt;br /&gt;
* Disposición (layout) automática del diagrama de clases.&lt;br /&gt;
* Generación de ficheros png, gif, jpg, svg, eps desde diagramas.&lt;br /&gt;
* Soporte para comentarios para múltiples elementos.&lt;br /&gt;
* Todos los diagramas 1.4 están soportados.&lt;br /&gt;
&lt;br /&gt;
====Ventajas ====&lt;br /&gt;
&lt;br /&gt;
* Genera código automáticamente.&lt;br /&gt;
* Propone soluciones a algunos errores.&lt;br /&gt;
* Panel de propiedades y de tareas pendientes bastante útil. &lt;br /&gt;
&lt;br /&gt;
====Desventajas ====&lt;br /&gt;
&lt;br /&gt;
* Instalación costosa.&lt;br /&gt;
* Poco amigable.&lt;br /&gt;
* Difícil de empezar.&lt;br /&gt;
* No tiene botón ¨deshacer¨.&lt;br /&gt;
* Los modelos a veces no pueden ser re-abiertos.&lt;br /&gt;
* No hay llamadas reflexivas en los diagramas de secuencia.&lt;br /&gt;
* Se debe seleccionar una clase para crear un diagrama de secuencia. &lt;br /&gt;
== Fuentes==&lt;br /&gt;
&lt;br /&gt;
* http://hugolopez.phi.com.co &lt;br /&gt;
&lt;br /&gt;
* http://users.dsic.upv.es &lt;br /&gt;
&lt;br /&gt;
[[Category:Ciencias_informáticas]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=728868</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=728868"/>
		<updated>2011-07-09T16:53:36Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Véase también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ficha Software{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Erlang es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
    ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
    Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
    ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
    Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
    ''% Cuerpo de la función loop().''&lt;br /&gt;
    loop()-&amp;gt;&lt;br /&gt;
    ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
    receive Msg-&amp;gt;&lt;br /&gt;
        io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
    ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
    {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin importar cuál es el segundo.''&lt;br /&gt;
    {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
    -module(math).&lt;br /&gt;
    -export([factorial/1]).&lt;br /&gt;
    &lt;br /&gt;
    factorial(0) -&amp;gt; 1;&lt;br /&gt;
    factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
&lt;br /&gt;
    -module(list).&lt;br /&gt;
    -export([quick_sort/1]).&lt;br /&gt;
    &lt;br /&gt;
    quick_sort([])-&amp;gt; [];&lt;br /&gt;
    quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
        quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
        ++ [Pivot] ++&lt;br /&gt;
        quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
    pintar(Color)-&amp;gt;&lt;br /&gt;
        case Color of&lt;br /&gt;
            “rojo”-&amp;gt;&lt;br /&gt;
                pintar_de_rojo;&lt;br /&gt;
            4-&amp;gt;&lt;br /&gt;
                pintar_de_rojo;&lt;br /&gt;
            “amarillo”-&amp;gt;&lt;br /&gt;
                pintar_de_amarillo;&lt;br /&gt;
            6-&amp;gt;&lt;br /&gt;
                pintar_de_amarillo&lt;br /&gt;
        end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
    A = 5        ''% Válido.''&lt;br /&gt;
    A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
    A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
    [Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
    [X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
           &lt;br /&gt;
Ejemplo:&lt;br /&gt;
    [X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
    [{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
    pythag(N)-&amp;gt;&lt;br /&gt;
        [{A,B,C} || &lt;br /&gt;
            A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            A + B + C =&amp;lt; N,&lt;br /&gt;
            A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
     Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
                                  ''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
    Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
                                       ''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
    Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
    receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
        un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ExtendedVisualOtp]], Framework para el desarrollo de aplicaciones cliente-servidor en tiempo real.&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente.&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Leonela&amp;diff=722768</id>
		<title>Leonela</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Leonela&amp;diff=722768"/>
		<updated>2011-07-07T03:40:56Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Fuentes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Libro&lt;br /&gt;
|nombre=LEONELA&lt;br /&gt;
|nombre original=&lt;br /&gt;
|portada=leonela.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=&lt;br /&gt;
|autor(es)=[[Nicolás Heredia]]&lt;br /&gt;
|editorial=&lt;br /&gt;
|colección=&lt;br /&gt;
|genero=Novela&lt;br /&gt;
|imprenta=&lt;br /&gt;
|edición=&lt;br /&gt;
|diseño de cubierta=[[Cecilia Guerra]]&lt;br /&gt;
|ilustraciones=&lt;br /&gt;
|primera edición=&lt;br /&gt;
|ejemplares=&lt;br /&gt;
|isbn=&lt;br /&gt;
|país={{Bandera2|Cuba}}&lt;br /&gt;
|distribuidor(es)=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
|notas=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''LEONELA'''. Novela de Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Prólogo ==&lt;br /&gt;
La preocupación fundamental al estudiar Leonela, de [[Nicolás Heredia]], no debe ser únicamente buscar sus valores literarios, que indiscutiblemente tiene, sino más bien incitar a la investigación del movimiento intelectual que se desarrolló en nuestro país a finales del siglo XIX y principios del XX, y del que participó Heredia en lugar destacadísimo.&lt;br /&gt;
Esta generación se formó después de la [[gesta del 68]], tomó parte directa o indirectamente en la guerra emancipadora contra [[España]] en [[1895]] y vivió el desenvolvimiento e irrupción del imperialismo norteamericano en nuestro país.&lt;br /&gt;
&lt;br /&gt;
Al sacudir el polvo de mis recuerdos vi aparecer la historia de Leonela, tal como me la relató un viejo amigo hace un lustro o poco menos. Todo mi trabajo ha consistido en sacar el cuadro de un rincón de mi memoria, limpiarlo cuidadosamente para que bajo la húmeda esponja vaya surgiendo la antigua pintura con sus primeros colores y ponerle el marco de mi estilo.&lt;br /&gt;
Dicho esto, el publico puede juzgar como guste una obra en que la realidad ha colaborado de un modo tan directo que tras ella se oculta modestamente el narrador.&lt;br /&gt;
&lt;br /&gt;
Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Autor ==&lt;br /&gt;
El Sr. D. Nicolás Heredia pertenece a la ilustre familia que fundara Pedro de Heredia, el conquistador que echó los cimientos de Cartagena de Indias, familia que ha producido robustos y fecundos vástagos en la vecina isla de Santo Domingo y en nuestra Cuba, madre nodriza de José María Heredia, el insigne cantor del Niágara, de América, de la libertad de Severiano de Heredia, ex alcalde de París y ex ministro de Fomento en la República Francesa, y de José María de Heredia, artista exquisito, poeta cosmopolita, sonetista insuperable en lengua francesa.&lt;br /&gt;
&lt;br /&gt;
El autor de Leonela ha demostrado que en sus venas circula rica y caliente la savia de la ilustre familia, y que si no muestra con arrogancia la cuidad de plata que sombrea una palmera de oro, blasón del fundador de la Cartago americana, sabe crearse pergaminos imperecederos dando forma a las emociones de su alma de artista.&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
*Prólogo / 1&lt;br /&gt;
*Casi prólogo / 7&lt;br /&gt;
*I          A vista de pájaro / 9&lt;br /&gt;
*II         Don Cosme / 12&lt;br /&gt;
*III        Doña Luisa / 15&lt;br /&gt;
*IV         Las mellizas / 18&lt;br /&gt;
*V          Los piratas del Cuabillas / 21&lt;br /&gt;
*VI         El inglés / 28&lt;br /&gt;
*VII        La [[Virgen del Cobre]] / 37&lt;br /&gt;
*VIII       [[Capirro]] / 45&lt;br /&gt;
*IX         Mercurio y Apolo / 51&lt;br /&gt;
*X          Fiat / 61&lt;br /&gt;
*XI         John Valdespina / 63&lt;br /&gt;
*XII        De Jarabacoa a la Cotorra / 70&lt;br /&gt;
*XIII       Entre bocado y bocado / 81&lt;br /&gt;
*XIV        Ayer y mañana / 88&lt;br /&gt;
*XV         Fermentación / 102&lt;br /&gt;
*XVI        El baile de los Mendoza / 110&lt;br /&gt;
*XVII       Mantengo / 124&lt;br /&gt;
*XVIII      Idilio al natural / 128&lt;br /&gt;
*XIX        En Dos Jimaguas / 134&lt;br /&gt;
*XX         Tía y sobrina y sobrino y tío / 140&lt;br /&gt;
*XXI        Policarpo I / 146&lt;br /&gt;
*XXII       Realidad colonial / 154&lt;br /&gt;
*XXIII      Sombra y luz / 160&lt;br /&gt;
*XXIV       Venta de añojos / 167&lt;br /&gt;
*XXV        El cuervo y la paloma / 180&lt;br /&gt;
*XXVI       Las fiestas de Patrono / 185&lt;br /&gt;
*XXVII      [[Waterloo]] / 195&lt;br /&gt;
*XXVIII     La Iglesia y el Estado / 203&lt;br /&gt;
*XXIX       El velo roto / 210&lt;br /&gt;
*XXX        Nuevo mundo / 216&lt;br /&gt;
*XXXI       ¡Perdidos! / 227&lt;br /&gt;
*XXXII      Preludios / 234&lt;br /&gt;
*XXXIII     La piel de Esaú / 241&lt;br /&gt;
*XXXIV      Dos temporales / 250&lt;br /&gt;
*XXXV       El regreso / 255&lt;br /&gt;
*XXXVI      La jugada de don Carlos / 264&lt;br /&gt;
*XXXVII     El conflicto / 276&lt;br /&gt;
*XXXVIII    A solas / 282&lt;br /&gt;
*XXXIX      Frente a frente / 287&lt;br /&gt;
*XL         Ciencia y conciencia / 295&lt;br /&gt;
*XLI        Lasciate / 303&lt;br /&gt;
*XLII       Rotación de ideas / 314&lt;br /&gt;
*XLIII      El drama / 323&lt;br /&gt;
*Epílogo / 328&lt;br /&gt;
*Apéndice / 333 &lt;br /&gt;
&lt;br /&gt;
==Fuentes==&lt;br /&gt;
&lt;br /&gt;
[[Biblioteca Municipal de Guáimaro]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Literatura]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=722178</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=722178"/>
		<updated>2011-07-06T19:46:57Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ficha Software{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Erlang es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el [[código fuente]] de un programa o aplicación al vuelo ([[cambio en caliente de código]]), sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
En Erlang se pueden realizar toda clase de proyectos en especial proyectos que necesiten tráfico de información de [[respuesta en tiempo real]], donde para cada petición debe haber una respuesta inmediata dependiendo de si se pudo resolver o no la petición. Ejemplo si de hace una petición a un cajero automático de consultar el saldo y en ese momento la base de datos donde se encuentra la información está ocupada resolviendo otras peticiones y no puede dar una respuesta justo a tiempo, el sistema debe retornar al usuario e informar el suceso en un tiempo razonable, ejemplo 5 segundos y no esperar toda una eternidad a que se desbloquee el sistema o la base de datos pueda resolver la petición. Este comportamiento es implementado dentro de la plataforma OTP (''[[Open Telecom Plataform]]'') que es el núcleo del lenguaje Erlang; su máquina virtual está basada en esa arquitectura, donde los procesos sólo pueden comunicarse mediante el paso de mensajes. Debido a que es orientado a [[concurrencia]] y a procesos todo lo que se programa son procesos concurrentes y totalmente independientes, siendo así que si falla alguno no afecta el funcionamiento de los demás y también puede ser reiniciado instantáneamente por su proceso supervisor (comportamiento OTP árbol de supervisión de procesos).&lt;br /&gt;
&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
    ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
    Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
    ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
    Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
    ''% Cuerpo de la función loop().''&lt;br /&gt;
    loop()-&amp;gt;&lt;br /&gt;
    ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
    receive Msg-&amp;gt;&lt;br /&gt;
        io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones (''[[Pattern-Matching]]'')===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
    ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
    {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin importar cuál es el segundo.''&lt;br /&gt;
    {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
    -module(math).&lt;br /&gt;
    -export([factorial/1]).&lt;br /&gt;
    &lt;br /&gt;
    factorial(0) -&amp;gt; 1;&lt;br /&gt;
    factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
&lt;br /&gt;
    -module(list).&lt;br /&gt;
    -export([quick_sort/1]).&lt;br /&gt;
    &lt;br /&gt;
    quick_sort([])-&amp;gt; [];&lt;br /&gt;
    quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
        quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
        ++ [Pivot] ++&lt;br /&gt;
        quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
    pintar(Color)-&amp;gt;&lt;br /&gt;
        case Color of&lt;br /&gt;
            “rojo”-&amp;gt;&lt;br /&gt;
                pintar_de_rojo;&lt;br /&gt;
            4-&amp;gt;&lt;br /&gt;
                pintar_de_rojo;&lt;br /&gt;
            “amarillo”-&amp;gt;&lt;br /&gt;
                pintar_de_amarillo;&lt;br /&gt;
            6-&amp;gt;&lt;br /&gt;
                pintar_de_amarillo&lt;br /&gt;
        end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
    A = 5        ''% Válido.''&lt;br /&gt;
    A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
    A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la concurrencia, donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
    [Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
    [X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
           &lt;br /&gt;
Ejemplo:&lt;br /&gt;
    [X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
    [{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
    pythag(N)-&amp;gt;&lt;br /&gt;
        [{A,B,C} || &lt;br /&gt;
            A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            A + B + C =&amp;lt; N,&lt;br /&gt;
            A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
===Distribución de procesos===&lt;br /&gt;
La distribución de procesos es una de las mejores características de Erlang, este posee un conjunto de funciones y primitivas para la creación de procesos, los cuales pueden ser locales o distribuidos, sin existir ninguna diferencia para el sistema.&lt;br /&gt;
&lt;br /&gt;
     Pid = spawn(Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso''&lt;br /&gt;
                                  ''% en el nodo local.''&lt;br /&gt;
    &lt;br /&gt;
    Pid = spawn(Node, Mod, Func, Args) ''% ejecuta la función Func como un nuevo proceso&lt;br /&gt;
                                       ''% en un nodo remoto.&lt;br /&gt;
 &lt;br /&gt;
A la hora de enviar y recibir mensajes, no existe diferencia alguna entre remoto y local.&lt;br /&gt;
 &lt;br /&gt;
    Pid ! a_message      ''% envía un mensaje al proceso (asíncronamente)''&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
    receive       ''% recibe el mensaje enviado a este proceso''&lt;br /&gt;
        un_mensaje -&amp;gt; hacer_algo&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
Erlang también cuenta con un [[Sistema Gestor de Base de Datos]] llamado Mnesia, el cual tiene soporte para distribución.&lt;br /&gt;
&lt;br /&gt;
==Véase también==&lt;br /&gt;
*[[ejabberd]],  un servidor de mensajes instantáneos [[XMPP]]  escrito en Erlang.  &lt;br /&gt;
*[[Wings 3d]], Herramienta de modelado 3D en Erlang.  &lt;br /&gt;
*Yet  another web server ([[YAWS]], un servidor de aplicaciones web muy completo en  Erlang).  &lt;br /&gt;
*[[Tsung]],  una herramienta de análisis de rendimiento muy potente. &lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
*[http://www.erlang.org Sitio web  oficial del proyecto] &lt;br /&gt;
*[http://erlang.org/faq.html Listas de distribución y preguntas más frecuente]  &lt;br /&gt;
*[http://video.google.com/videoplay?docid=-5830318882717959520 Video documentando las características de Erlang] &lt;br /&gt;
*[http://comunidades.uci.cu/projects/erlang *Comunidad Cubana de Erlang* :)]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=721948</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=721948"/>
		<updated>2011-07-06T18:47:01Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ficha Software{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional y concurrente&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=Década del 80&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=[[Unix]], [[Windows]]&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=Sitio Oficial de Erlang: http://www.erlang.org, Comunidad Cubana de Erlang: http://comunidades.uci.cu/projects/erlang&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Erlang es un [[lenguaje]] de [[programación funcional]] de alto nivel, que se ubica también dentro del paradigma de [[Programación Declarativa]], diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el código fuente de un programa o aplicación al vuelo, sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca [[Ericsson]], como un intento de desarrollar un lenguaje de programación de alto nivel, y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
Para el diseño de Erlang se analizaron al rededor de 300 lenguajes de programación existentes, con el fin de buscar características sobre lo que deseaba la empresa, de estos lenguajes se seleccionaron: [[Lisp]], [[Haskell]], [[Prolog]], y otros, de los cuales se tomaron las características más relevantes.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
'''Entre sus características más relevantes se encuentran:'''&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
    ''% Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.''&lt;br /&gt;
    Pid = spawn(fun()-&amp;gt; loop() end),&lt;br /&gt;
    ''% Envía un mensaje al proceso apuntado por ‘Pid’.''&lt;br /&gt;
    Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
    ''% Cuerpo de la función loop().''&lt;br /&gt;
    loop()-&amp;gt;&lt;br /&gt;
    ''% Recibe el mensaje enviado al proceso.''&lt;br /&gt;
    receive Msg-&amp;gt;&lt;br /&gt;
        io:format(&amp;quot;~p&amp;quot;, [Msg]) ''% Imprime el mensaje en la consola.''&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones ([[Pattern-Matching]])===&lt;br /&gt;
El acoplamiento de patrones es una técnica básica de Erlang con la cual es posible hacer un balance entre las variables y valores a los dos lados del signo de igualdad o fallar si no es posible hacer un balance. Al lado izquierdo se le denomina lado de las variables y valores y al lado derecho lado de los valores.&lt;br /&gt;
    &lt;br /&gt;
    ''% Obtiene, en la variable 'Cual', el tercer valor sin importar cuales son los dos primeros.''&lt;br /&gt;
    {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
    &lt;br /&gt;
 &lt;br /&gt;
''% Obtiene, en la variable 'Cual', el tercer valor garantizando que el primero sea ‘perro’ y sin importar cuál es el segundo.''&lt;br /&gt;
    {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática (Recolector de Basura)===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo de limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
===Lenguaje funcional===&lt;br /&gt;
El código de programa se estructura en módulos que contienen funciones:&lt;br /&gt;
&lt;br /&gt;
    -module(math).&lt;br /&gt;
    -export([factorial/1]).&lt;br /&gt;
    &lt;br /&gt;
    factorial(0) -&amp;gt; 1;&lt;br /&gt;
    factorial(N) when N &amp;gt; 0 -&amp;gt; N * factorial(N-1).&lt;br /&gt;
&lt;br /&gt;
Función QuickSort, ordena una lista de elementos:&lt;br /&gt;
&lt;br /&gt;
    -module(list).&lt;br /&gt;
    -export([quick_sort/1]).&lt;br /&gt;
    &lt;br /&gt;
    quick_sort([])-&amp;gt; [];&lt;br /&gt;
    quick_sort([Pivot|Rest])-&amp;gt;&lt;br /&gt;
        quick_sort[X || X &amp;lt;- Rest, X &amp;lt; Pivot])&lt;br /&gt;
        ++ [Pivot] ++&lt;br /&gt;
        quick_sort[Y || Y &amp;lt;- Rest, Y &amp;gt;= Pivot].&lt;br /&gt;
&lt;br /&gt;
====Evaluación estricta, asignación única y tipado dinámico====&lt;br /&gt;
Sólo se cumple uno de los casos por ejecución de la función pintar(), ([[evaluación estricta]]).&lt;br /&gt;
&lt;br /&gt;
    pintar(Color)-&amp;gt;&lt;br /&gt;
        case Color of&lt;br /&gt;
            “rojo”-&amp;gt;&lt;br /&gt;
                pintar_de_rojo;&lt;br /&gt;
            4-&amp;gt;&lt;br /&gt;
                pintar_de_rojo;&lt;br /&gt;
            “amarillo”-&amp;gt;&lt;br /&gt;
                pintar_de_amarillo;&lt;br /&gt;
            6-&amp;gt;&lt;br /&gt;
                pintar_de_amarillo&lt;br /&gt;
        end.&lt;br /&gt;
&lt;br /&gt;
La variable Color puede tomar el tipo de datos dinámicamente, puede adquirir un valor numérico o un valor alfanumérico (cadena de caracteres) especificando el color, ([[tipado dinámico]]).&lt;br /&gt;
&lt;br /&gt;
La [[asignación única]] viene dada por que no se puede asignar un valor a una variable mas de una vez, ejemplo:&lt;br /&gt;
&lt;br /&gt;
Si dentro del mismo contexto hacemos:&lt;br /&gt;
&lt;br /&gt;
    A = 5        ''% Válido.''&lt;br /&gt;
    A = 6        ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Cosas como estas, que son válidas dentro de la [[Programación Imperativa]], no lo son dentro de la programación declarativa funcional.&lt;br /&gt;
&lt;br /&gt;
    A = A + 1    ''% No válido.''&lt;br /&gt;
&lt;br /&gt;
Una vez que una variable obtiene un valor, no puede ser modificado, si se desea incrementar el valor de una variable en cierto valor se hace B = A + 1, si y sólo si, la variable B nunca ha sido asignada (''unbound'') y la variable A ya ha sido previamente asignada (''bound''). Esta regla permite evitar los efectos colaterales de la [[concurrencia]], donde al acceder varios procesos a un mismo recurso pueda darse el caso de que se corrompa la información.&lt;br /&gt;
&lt;br /&gt;
====Listas por comprensión====&lt;br /&gt;
Las listas por compresión de Erlang es un mecanismo matemático que permite generar valores a partir de una sintaxis muy elegante y simple:&lt;br /&gt;
&lt;br /&gt;
    [Constructor || Generador, [Filtros...], Generador, [Filtros...]...].&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
    [X * 2 || X &amp;lt;-[1,2,3,4]].&lt;br /&gt;
&lt;br /&gt;
Esto retorna el doble de todos los elementos de la lista [1,2,3,4].&lt;br /&gt;
&lt;br /&gt;
Una lista por comprensión puede definirse como las Xs tales que las Xs que salgan de la lista L cumplan tal condición. &lt;br /&gt;
           &lt;br /&gt;
Ejemplo:&lt;br /&gt;
    [X || X &amp;lt;-L, X &amp;gt; 4].&lt;br /&gt;
&lt;br /&gt;
Cada generador trae sus propios filtros, por lo tanto es válido escribir:&lt;br /&gt;
    [{X, Y} || X &amp;lt;-[1,2,3,4], X &amp;gt; 2, Y &amp;lt;-[4,5,6,7], Y &amp;lt; 5].&lt;br /&gt;
&lt;br /&gt;
Algo interesante utilizando las listas por comprensión puede ser el cálculo del trío pitagórico:&lt;br /&gt;
    pythag(N)-&amp;gt;&lt;br /&gt;
        [{A,B,C} || &lt;br /&gt;
            A &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            B &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            C &amp;lt;-lists:seq(1,N),&lt;br /&gt;
            A + B + C =&amp;lt; N,&lt;br /&gt;
            A*A + B*B =:= C*C].&lt;br /&gt;
&lt;br /&gt;
Esto genera todos los tríos de números desde 1 hasta N que cumplen con el teorema de Pitágoras y que la suma de los tres no excede a N, son los llamados números &amp;quot;pitagóricos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Esto puede leerse como: todos los números {A, B, C} donde A es de 1 a N, B es de 1 a N, C es de 1 a N, cumplan que A + B + C =&amp;lt; N y además que A*A + B*B = C*C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTA: [[EN EDICION]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enlaces externos==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Archivo:Erlang-logo.jpg&amp;diff=720919</id>
		<title>Archivo:Erlang-logo.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Archivo:Erlang-logo.jpg&amp;diff=720919"/>
		<updated>2011-07-06T14:20:35Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sumario ==&lt;br /&gt;
&lt;br /&gt;
== Estado de copyright: ==&lt;br /&gt;
&lt;br /&gt;
== Fuente: ==&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Erlang&amp;diff=720916</id>
		<title>Erlang</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Erlang&amp;diff=720916"/>
		<updated>2011-07-06T14:19:54Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: Página creada con '{{Ficha Software |nombre=Erlang |familia= |imagen=erlang-logo.jpg |tamaño= |descripción=Lenguaje de programación funcional |imagen2= |tamaño2= |descripción2= |creador=[[Eri...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Software&lt;br /&gt;
|nombre=Erlang&lt;br /&gt;
|familia=&lt;br /&gt;
|imagen=erlang-logo.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=Lenguaje de programación funcional&lt;br /&gt;
|imagen2=&lt;br /&gt;
|tamaño2=&lt;br /&gt;
|descripción2=&lt;br /&gt;
|creador=[[Ericsson]]&lt;br /&gt;
|desarrollador=&lt;br /&gt;
|diseñador=&lt;br /&gt;
|modelo de desarrollo=&lt;br /&gt;
|fecha de creación=[[años 80]]&lt;br /&gt;
|lanzamiento inicial=&lt;br /&gt;
|versiones=&lt;br /&gt;
|última versión estable=&lt;br /&gt;
|núcleo=&lt;br /&gt;
|tipo de núcleo=&lt;br /&gt;
|plataformas soportadas=Unix,Windows&lt;br /&gt;
|género=&lt;br /&gt;
|sistemas operativos=&lt;br /&gt;
|idioma=&lt;br /&gt;
|licencia=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=[http://www.erlang.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Erlang es un [[lenguaje]] de [[programación funcional]] de alto nivel, diseñado para escribir [[aplicaciones concurrentes]] y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Los procesos Erlang son muy ligeros y pertenecen al propio lenguaje, no al sistema operativo. Erlang posee un mecanismo para cambiar el código fuente de un programa o aplicación al vuelo, sin tener que detener el programa. Este mecanismo facilita la implementación de sistemas indetenibles.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Historia==&lt;br /&gt;
Los inicios de Erlang toman lugar en los años 80 en los laboratorios de Ciencias de Computación de la Compañía de telefonía sueca “[[Ericsson]]”, como un intento de desarrollar un [[lenguaje de programación de alto nivel]], estructurado y con capacidad para afrontar el tipo de proyectos, especialmente de [[Telecomunicaciones]], que la empresa estaba desarrollando y que optimizara el uso de la tecnología emergente en [[Microelectrónica]], especialmente en [[Microinformática]].&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==Características==&lt;br /&gt;
Entre sus características más relevantes se encuentran&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Lenguaje de alto nivel basado en procesos===&lt;br /&gt;
Gran parte del código luce así:&lt;br /&gt;
&lt;br /&gt;
    % Ejecuta la función loop() como un nuevo proceso y guarda el id del proceso en ‘Pid’.&lt;br /&gt;
    Pid = spawn(fun()-&amp;gt; loop() end)&lt;br /&gt;
    % Envía un mensaje al proceso apuntado por ‘Pid’.&lt;br /&gt;
    Pid ! “Hola Mundo en Erlang!”.&lt;br /&gt;
 &lt;br /&gt;
    % Cuerpo de la función loop()&lt;br /&gt;
    loop()-&amp;gt;&lt;br /&gt;
        % Recibe el mensaje enviado al proceso.&lt;br /&gt;
        receive Msg-&amp;gt;&lt;br /&gt;
            hacer_algo&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
===Acoplamiento de patrones ([[Pattern-Matching]])===&lt;br /&gt;
    % Obtiene el tercer valor sin importar cuales son los dos primeros.&lt;br /&gt;
    {_, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
 &lt;br /&gt;
    % Obtiene el tercer valor garantizando que el primero sea ‘perro’ y sin importar cuál es el segundo.&lt;br /&gt;
    {perro, _, Cual} = {perro, gato, vaca}.&lt;br /&gt;
&lt;br /&gt;
===Organización de memoria automática mediante el Colector de Basura ([[Garbage Collector]])===&lt;br /&gt;
Erlang posee al igual que [[.Net]] y [[Java]] un mecanismo limpieza de la memoria que permite al programador olvidarse de manejar la destrucción de las variables una vez creadas y fuera de contexto. Este mecanismo se encarga automáticamente de destruir todos los objetos y procesos que ya no se estén utilizando ya sea porque están fuera de contexto o porque muere su objeto o proceso padre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Enlaces Externos==&lt;br /&gt;
&lt;br /&gt;
NOTA: [[EN EDICION]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Informática]][[Category:Lenguajes_de_programación]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Leonela&amp;diff=719135</id>
		<title>Leonela</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Leonela&amp;diff=719135"/>
		<updated>2011-07-05T18:06:36Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Libro&lt;br /&gt;
|nombre=LEONELA&lt;br /&gt;
|nombre original=&lt;br /&gt;
|portada=leonela.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=&lt;br /&gt;
|autor(es)=[[Nicolás Heredia]]&lt;br /&gt;
|editorial=&lt;br /&gt;
|colección=&lt;br /&gt;
|genero=Novela&lt;br /&gt;
|imprenta=&lt;br /&gt;
|edición=&lt;br /&gt;
|diseño de cubierta=[[Cecilia Guerra]]&lt;br /&gt;
|ilustraciones=&lt;br /&gt;
|primera edición=&lt;br /&gt;
|ejemplares=&lt;br /&gt;
|isbn=&lt;br /&gt;
|país={{Bandera2|Cuba}}&lt;br /&gt;
|distribuidor(es)=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
|notas=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''LEONELA'''. Novela de Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Prólogo ==&lt;br /&gt;
La preocupación fundamental al estudiar Leonela, de [[Nicolás Heredia]], no debe ser únicamente buscar sus valores literarios, que indiscutiblemente tiene, sino más bien incitar a la investigación del movimiento intelectual que se desarrolló en nuestro país a finales del siglo XIX y principios del XX, y del que participó Heredia en lugar destacadísimo.&lt;br /&gt;
Esta generación se formó después de la [[gesta del 68]], tomó parte directa o indirectamente en la guerra emancipadora contra [[España]] en [[1895]] y vivió el desenvolvimiento e irrupción del imperialismo norteamericano en nuestro país.&lt;br /&gt;
&lt;br /&gt;
Al sacudir el polvo de mis recuerdos vi aparecer la historia de Leonela, tal como me la relató un viejo amigo hace un lustro o poco menos. Todo mi trabajo ha consistido en sacar el cuadro de un rincón de mi memoria, limpiarlo cuidadosamente para que bajo la húmeda esponja vaya surgiendo la antigua pintura con sus primeros colores y ponerle el marco de mi estilo.&lt;br /&gt;
Dicho esto, el publico puede juzgar como guste una obra en que la realidad ha colaborado de un modo tan directo que tras ella se oculta modestamente el narrador.&lt;br /&gt;
&lt;br /&gt;
Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Autor ==&lt;br /&gt;
El Sr. D. Nicolás Heredia pertenece a la ilustre familia que fundara Pedro de Heredia, el conquistador que echó los cimientos de Cartagena de Indias, familia que ha producido robustos y fecundos vástagos en la vecina isla de Santo Domingo y en nuestra Cuba, madre nodriza de José María Heredia, el insigne cantor del Niágara, de América, de la libertad de Severiano de Heredia, ex alcalde de París y ex ministro de Fomento en la República Francesa, y de José María de Heredia, artista exquisito, poeta cosmopolita, sonetista insuperable en lengua francesa.&lt;br /&gt;
&lt;br /&gt;
El autor de Leonela ha demostrado que en sus venas circula rica y caliente la savia de la ilustre familia, y que si no muestra con arrogancia la cuidad de plata que sombrea una palmera de oro, blasón del fundador de la Cartago americana, sabe crearse pergaminos imperecederos dando forma a las emociones de su alma de artista.&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
*Prólogo / 1&lt;br /&gt;
*Casi prólogo / 7&lt;br /&gt;
*I          A vista de pájaro / 9&lt;br /&gt;
*II         Don Cosme / 12&lt;br /&gt;
*III        Doña Luisa / 15&lt;br /&gt;
*IV         Las mellizas / 18&lt;br /&gt;
*V          Los piratas del Cuabillas / 21&lt;br /&gt;
*VI         El inglés / 28&lt;br /&gt;
*VII        La [[Virgen del Cobre]] / 37&lt;br /&gt;
*VIII       [[Capirro]] / 45&lt;br /&gt;
*IX         Mercurio y Apolo / 51&lt;br /&gt;
*X          Fiat / 61&lt;br /&gt;
*XI         John Valdespina / 63&lt;br /&gt;
*XII        De Jarabacoa a la Cotorra / 70&lt;br /&gt;
*XIII       Entre bocado y bocado / 81&lt;br /&gt;
*XIV        Ayer y mañana / 88&lt;br /&gt;
*XV         Fermentación / 102&lt;br /&gt;
*XVI        El baile de los Mendoza / 110&lt;br /&gt;
*XVII       Mantengo / 124&lt;br /&gt;
*XVIII      Idilio al natural / 128&lt;br /&gt;
*XIX        En Dos Jimaguas / 134&lt;br /&gt;
*XX         Tía y sobrina y sobrino y tío / 140&lt;br /&gt;
*XXI        Policarpo I / 146&lt;br /&gt;
*XXII       Realidad colonial / 154&lt;br /&gt;
*XXIII      Sombra y luz / 160&lt;br /&gt;
*XXIV       Venta de añojos / 167&lt;br /&gt;
*XXV        El cuervo y la paloma / 180&lt;br /&gt;
*XXVI       Las fiestas de Patrono / 185&lt;br /&gt;
*XXVII      [[Waterloo]] / 195&lt;br /&gt;
*XXVIII     La Iglesia y el Estado / 203&lt;br /&gt;
*XXIX       El velo roto / 210&lt;br /&gt;
*XXX        Nuevo mundo / 216&lt;br /&gt;
*XXXI       ¡Perdidos! / 227&lt;br /&gt;
*XXXII      Preludios / 234&lt;br /&gt;
*XXXIII     La piel de Esaú / 241&lt;br /&gt;
*XXXIV      Dos temporales / 250&lt;br /&gt;
*XXXV       El regreso / 255&lt;br /&gt;
*XXXVI      La jugada de don Carlos / 264&lt;br /&gt;
*XXXVII     El conflicto / 276&lt;br /&gt;
*XXXVIII    A solas / 282&lt;br /&gt;
*XXXIX      Frente a frente / 287&lt;br /&gt;
*XL         Ciencia y conciencia / 295&lt;br /&gt;
*XLI        Lasciate / 303&lt;br /&gt;
*XLII       Rotación de ideas / 314&lt;br /&gt;
*XLIII      El drama / 323&lt;br /&gt;
*Epílogo / 328&lt;br /&gt;
*Apéndice / 333 &lt;br /&gt;
&lt;br /&gt;
==Fuentes==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Agradecimientos a la [[Biblioteca Municipal de Guáimaro]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category: Literatura]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Leonela&amp;diff=719109</id>
		<title>Leonela</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Leonela&amp;diff=719109"/>
		<updated>2011-07-05T18:02:48Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Autor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Libro&lt;br /&gt;
|nombre=LEONELA&lt;br /&gt;
|nombre original=&lt;br /&gt;
|portada=leonela.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=&lt;br /&gt;
|autor(es)=[[Nicolás Heredia]]&lt;br /&gt;
|editorial=&lt;br /&gt;
|colección=&lt;br /&gt;
|genero=Novela&lt;br /&gt;
|imprenta=&lt;br /&gt;
|edición=&lt;br /&gt;
|diseño de cubierta=[[Cecilia Guerra]]&lt;br /&gt;
|ilustraciones=&lt;br /&gt;
|primera edición=&lt;br /&gt;
|ejemplares=&lt;br /&gt;
|isbn=&lt;br /&gt;
|país={{Bandera2|Cuba}}&lt;br /&gt;
|distribuidor(es)=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
|notas=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''LEONELA'''. Novela de Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Autor ==&lt;br /&gt;
El Sr. D. Nicolás Heredia pertenece a la ilustre familia que fundara Pedro de Heredia, el conquistador que echó los cimientos de Cartagena de Indias, familia que ha producido robustos y fecundos vástagos en la vecina isla de Santo Domingo y en nuestra Cuba, madre nodriza de José María Heredia, el insigne cantor del Niágara, de América, de la libertad de Severiano de Heredia, ex alcalde de París y ex ministro de Fomento en la República Francesa, y de José María de Heredia, artista exquisito, poeta cosmopolita, sonetista insuperable en lengua francesa.&lt;br /&gt;
&lt;br /&gt;
El autor de Leonela ha demostrado que en sus venas circula rica y caliente la savia de la ilustre familia, y que si no muestra con arrogancia la cuidad de plata que sombrea una palmera de oro, blasón del fundador de la Cartago americana, sabe crearse pergaminos imperecederos dando forma a las emociones de su alma de artista.&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
*Prólogo / 1&lt;br /&gt;
*Casi prólogo / 7&lt;br /&gt;
*I          A vista de pájaro / 9&lt;br /&gt;
*II         Don Cosme / 12&lt;br /&gt;
*III        Doña Luisa / 15&lt;br /&gt;
*IV         Las mellizas / 18&lt;br /&gt;
*V          Los piratas del Cuabillas / 21&lt;br /&gt;
*VI         El inglés / 28&lt;br /&gt;
*VII        La [[Virgen del Cobre]] / 37&lt;br /&gt;
*VIII       [[Capirro]] / 45&lt;br /&gt;
*IX         Mercurio y Apolo / 51&lt;br /&gt;
*X          Fiat / 61&lt;br /&gt;
*XI         John Valdespina / 63&lt;br /&gt;
*XII        De Jarabacoa a la Cotorra / 70&lt;br /&gt;
*XIII       Entre bocado y bocado / 81&lt;br /&gt;
*XIV        Ayer y mañana / 88&lt;br /&gt;
*XV         Fermentación / 102&lt;br /&gt;
*XVI        El baile de los Mendoza / 110&lt;br /&gt;
*XVII       Mantengo / 124&lt;br /&gt;
*XVIII      Idilio al natural / 128&lt;br /&gt;
*XIX        En Dos Jimaguas / 134&lt;br /&gt;
*XX         Tía y sobrina y sobrino y tío / 140&lt;br /&gt;
*XXI        Policarpo I / 146&lt;br /&gt;
*XXII       Realidad colonial / 154&lt;br /&gt;
*XXIII      Sombra y luz / 160&lt;br /&gt;
*XXIV       Venta de añojos / 167&lt;br /&gt;
*XXV        El cuervo y la paloma / 180&lt;br /&gt;
*XXVI       Las fiestas de Patrono / 185&lt;br /&gt;
*XXVII      [[Waterloo]] / 195&lt;br /&gt;
*XXVIII     La Iglesia y el Estado / 203&lt;br /&gt;
*XXIX       El velo roto / 210&lt;br /&gt;
*XXX        Nuevo mundo / 216&lt;br /&gt;
*XXXI       ¡Perdidos! / 227&lt;br /&gt;
*XXXII      Preludios / 234&lt;br /&gt;
*XXXIII     La piel de Esaú / 241&lt;br /&gt;
*XXXIV      Dos temporales / 250&lt;br /&gt;
*XXXV       El regreso / 255&lt;br /&gt;
*XXXVI      La jugada de don Carlos / 264&lt;br /&gt;
*XXXVII     El conflicto / 276&lt;br /&gt;
*XXXVIII    A solas / 282&lt;br /&gt;
*XXXIX      Frente a frente / 287&lt;br /&gt;
*XL         Ciencia y conciencia / 295&lt;br /&gt;
*XLI        Lasciate / 303&lt;br /&gt;
*XLII       Rotación de ideas / 314&lt;br /&gt;
*XLIII      El drama / 323&lt;br /&gt;
*Epílogo / 328&lt;br /&gt;
*Apéndice / 333 &lt;br /&gt;
&lt;br /&gt;
==Fuentes==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Agradecimientos a la [[Biblioteca Municipal de Guáimaro]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category: Literatura]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Leonela&amp;diff=719107</id>
		<title>Leonela</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Leonela&amp;diff=719107"/>
		<updated>2011-07-05T18:02:44Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: /* Prólogo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Libro&lt;br /&gt;
|nombre=LEONELA&lt;br /&gt;
|nombre original=&lt;br /&gt;
|portada=leonela.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=&lt;br /&gt;
|autor(es)=[[Nicolás Heredia]]&lt;br /&gt;
|editorial=&lt;br /&gt;
|colección=&lt;br /&gt;
|genero=Novela&lt;br /&gt;
|imprenta=&lt;br /&gt;
|edición=&lt;br /&gt;
|diseño de cubierta=[[Cecilia Guerra]]&lt;br /&gt;
|ilustraciones=&lt;br /&gt;
|primera edición=&lt;br /&gt;
|ejemplares=&lt;br /&gt;
|isbn=&lt;br /&gt;
|país={{Bandera2|Cuba}}&lt;br /&gt;
|distribuidor(es)=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
|notas=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''LEONELA'''. Novela de Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Autor ==&lt;br /&gt;
El Sr. D. Nicolás Heredia pertenece a la ilustre familia que fundara Pedro de Heredia, el conquistador que echó los cimientos de Cartagena de Indias, familia que ha producido robustos y fecundos vástagos en la vecina isla de Santo Domingo y en nuestra Cuba, madre nodriza de José María Heredia, el insigne cantor del Niágara, de América, de la libertad de Severiano de Heredia, ex alcalde de París y ex ministro de Fomento en la República Francesa, y de José María de Heredia, artista exquisito, poeta cosmopolita, sonetista insuperable en lengua francesa.&lt;br /&gt;
El autor de Leonela ha demostrado que en sus venas circula rica y caliente la savia de la ilustre familia, y que si no muestra con arrogancia la cuidad de plata que sombrea una palmera de oro, blasón del fundador de la Cartago americana, sabe crearse pergaminos imperecederos dando forma a las emociones de su alma de artista.&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
*Prólogo / 1&lt;br /&gt;
*Casi prólogo / 7&lt;br /&gt;
*I          A vista de pájaro / 9&lt;br /&gt;
*II         Don Cosme / 12&lt;br /&gt;
*III        Doña Luisa / 15&lt;br /&gt;
*IV         Las mellizas / 18&lt;br /&gt;
*V          Los piratas del Cuabillas / 21&lt;br /&gt;
*VI         El inglés / 28&lt;br /&gt;
*VII        La [[Virgen del Cobre]] / 37&lt;br /&gt;
*VIII       [[Capirro]] / 45&lt;br /&gt;
*IX         Mercurio y Apolo / 51&lt;br /&gt;
*X          Fiat / 61&lt;br /&gt;
*XI         John Valdespina / 63&lt;br /&gt;
*XII        De Jarabacoa a la Cotorra / 70&lt;br /&gt;
*XIII       Entre bocado y bocado / 81&lt;br /&gt;
*XIV        Ayer y mañana / 88&lt;br /&gt;
*XV         Fermentación / 102&lt;br /&gt;
*XVI        El baile de los Mendoza / 110&lt;br /&gt;
*XVII       Mantengo / 124&lt;br /&gt;
*XVIII      Idilio al natural / 128&lt;br /&gt;
*XIX        En Dos Jimaguas / 134&lt;br /&gt;
*XX         Tía y sobrina y sobrino y tío / 140&lt;br /&gt;
*XXI        Policarpo I / 146&lt;br /&gt;
*XXII       Realidad colonial / 154&lt;br /&gt;
*XXIII      Sombra y luz / 160&lt;br /&gt;
*XXIV       Venta de añojos / 167&lt;br /&gt;
*XXV        El cuervo y la paloma / 180&lt;br /&gt;
*XXVI       Las fiestas de Patrono / 185&lt;br /&gt;
*XXVII      [[Waterloo]] / 195&lt;br /&gt;
*XXVIII     La Iglesia y el Estado / 203&lt;br /&gt;
*XXIX       El velo roto / 210&lt;br /&gt;
*XXX        Nuevo mundo / 216&lt;br /&gt;
*XXXI       ¡Perdidos! / 227&lt;br /&gt;
*XXXII      Preludios / 234&lt;br /&gt;
*XXXIII     La piel de Esaú / 241&lt;br /&gt;
*XXXIV      Dos temporales / 250&lt;br /&gt;
*XXXV       El regreso / 255&lt;br /&gt;
*XXXVI      La jugada de don Carlos / 264&lt;br /&gt;
*XXXVII     El conflicto / 276&lt;br /&gt;
*XXXVIII    A solas / 282&lt;br /&gt;
*XXXIX      Frente a frente / 287&lt;br /&gt;
*XL         Ciencia y conciencia / 295&lt;br /&gt;
*XLI        Lasciate / 303&lt;br /&gt;
*XLII       Rotación de ideas / 314&lt;br /&gt;
*XLIII      El drama / 323&lt;br /&gt;
*Epílogo / 328&lt;br /&gt;
*Apéndice / 333 &lt;br /&gt;
&lt;br /&gt;
==Fuentes==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Agradecimientos a la [[Biblioteca Municipal de Guáimaro]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category: Literatura]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Leonela&amp;diff=719090</id>
		<title>Leonela</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Leonela&amp;diff=719090"/>
		<updated>2011-07-05T18:00:25Z</updated>

		<summary type="html">&lt;p&gt;Goldfields: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ficha Libro&lt;br /&gt;
|nombre=LEONELA&lt;br /&gt;
|nombre original=&lt;br /&gt;
|portada=leonela.jpg&lt;br /&gt;
|tamaño=&lt;br /&gt;
|descripción=&lt;br /&gt;
|autor(es)=[[Nicolás Heredia]]&lt;br /&gt;
|editorial=&lt;br /&gt;
|colección=&lt;br /&gt;
|genero=Novela&lt;br /&gt;
|imprenta=&lt;br /&gt;
|edición=&lt;br /&gt;
|diseño de cubierta=[[Cecilia Guerra]]&lt;br /&gt;
|ilustraciones=&lt;br /&gt;
|primera edición=&lt;br /&gt;
|ejemplares=&lt;br /&gt;
|isbn=&lt;br /&gt;
|país={{Bandera2|Cuba}}&lt;br /&gt;
|distribuidor(es)=&lt;br /&gt;
|premios=&lt;br /&gt;
|web=&lt;br /&gt;
|notas=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''LEONELA'''. Novela de Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Prólogo ==&lt;br /&gt;
La preocupación fundamental al estudiar Leonela, de [[Nicolás Heredia]], no debe ser únicamente buscar sus valores literarios, que indiscutiblemente tiene, sino más bien incitar a la investigación del movimiento intelectual que se desarrolló en nuestro país a finales del siglo XIX y principios del XX, y del que participó Heredia en lugar destacadísimo.&lt;br /&gt;
Esta generación se formó después de la [[gesta del 68]], tomó parte directa o indirectamente en la guerra emancipadora contra [[España]] en [[1895]] y vivió el desenvolvimiento e irrupción del imperialismo norteamericano en nuestro país.&lt;br /&gt;
Al sacudir el polvo de mis recuerdos vi aparecer la historia de Leonela, tal como me la relató un viejo amigo hace un lustro o poco menos. Todo mi trabajo ha consistido en sacar el cuadro de un rincón de mi memoria, limpiarlo cuidadosamente para que bajo la húmeda esponja vaya surgiendo la antigua pintura con sus primeros colores y ponerle el marco de mi estilo.&lt;br /&gt;
Dicho esto, el publico puede juzgar como guste una obra en que la realidad ha colaborado de un modo tan directo que tras ella se oculta modestamente el narrador.&lt;br /&gt;
Nicolás Heredia.&lt;br /&gt;
&lt;br /&gt;
== Autor ==&lt;br /&gt;
El Sr. D. Nicolás Heredia pertenece a la ilustre familia que fundara Pedro de Heredia, el conquistador que echó los cimientos de Cartagena de Indias, familia que ha producido robustos y fecundos vástagos en la vecina isla de Santo Domingo y en nuestra Cuba, madre nodriza de José María Heredia, el insigne cantor del Niágara, de América, de la libertad de Severiano de Heredia, ex alcalde de París y ex ministro de Fomento en la República Francesa, y de José María de Heredia, artista exquisito, poeta cosmopolita, sonetista insuperable en lengua francesa.&lt;br /&gt;
El autor de Leonela ha demostrado que en sus venas circula rica y caliente la savia de la ilustre familia, y que si no muestra con arrogancia la cuidad de plata que sombrea una palmera de oro, blasón del fundador de la Cartago americana, sabe crearse pergaminos imperecederos dando forma a las emociones de su alma de artista.&lt;br /&gt;
&lt;br /&gt;
== Índice ==&lt;br /&gt;
*Prólogo / 1&lt;br /&gt;
*Casi prólogo / 7&lt;br /&gt;
*I          A vista de pájaro / 9&lt;br /&gt;
*II         Don Cosme / 12&lt;br /&gt;
*III        Doña Luisa / 15&lt;br /&gt;
*IV         Las mellizas / 18&lt;br /&gt;
*V          Los piratas del Cuabillas / 21&lt;br /&gt;
*VI         El inglés / 28&lt;br /&gt;
*VII        La [[Virgen del Cobre]] / 37&lt;br /&gt;
*VIII       [[Capirro]] / 45&lt;br /&gt;
*IX         Mercurio y Apolo / 51&lt;br /&gt;
*X          Fiat / 61&lt;br /&gt;
*XI         John Valdespina / 63&lt;br /&gt;
*XII        De Jarabacoa a la Cotorra / 70&lt;br /&gt;
*XIII       Entre bocado y bocado / 81&lt;br /&gt;
*XIV        Ayer y mañana / 88&lt;br /&gt;
*XV         Fermentación / 102&lt;br /&gt;
*XVI        El baile de los Mendoza / 110&lt;br /&gt;
*XVII       Mantengo / 124&lt;br /&gt;
*XVIII      Idilio al natural / 128&lt;br /&gt;
*XIX        En Dos Jimaguas / 134&lt;br /&gt;
*XX         Tía y sobrina y sobrino y tío / 140&lt;br /&gt;
*XXI        Policarpo I / 146&lt;br /&gt;
*XXII       Realidad colonial / 154&lt;br /&gt;
*XXIII      Sombra y luz / 160&lt;br /&gt;
*XXIV       Venta de añojos / 167&lt;br /&gt;
*XXV        El cuervo y la paloma / 180&lt;br /&gt;
*XXVI       Las fiestas de Patrono / 185&lt;br /&gt;
*XXVII      [[Waterloo]] / 195&lt;br /&gt;
*XXVIII     La Iglesia y el Estado / 203&lt;br /&gt;
*XXIX       El velo roto / 210&lt;br /&gt;
*XXX        Nuevo mundo / 216&lt;br /&gt;
*XXXI       ¡Perdidos! / 227&lt;br /&gt;
*XXXII      Preludios / 234&lt;br /&gt;
*XXXIII     La piel de Esaú / 241&lt;br /&gt;
*XXXIV      Dos temporales / 250&lt;br /&gt;
*XXXV       El regreso / 255&lt;br /&gt;
*XXXVI      La jugada de don Carlos / 264&lt;br /&gt;
*XXXVII     El conflicto / 276&lt;br /&gt;
*XXXVIII    A solas / 282&lt;br /&gt;
*XXXIX      Frente a frente / 287&lt;br /&gt;
*XL         Ciencia y conciencia / 295&lt;br /&gt;
*XLI        Lasciate / 303&lt;br /&gt;
*XLII       Rotación de ideas / 314&lt;br /&gt;
*XLIII      El drama / 323&lt;br /&gt;
*Epílogo / 328&lt;br /&gt;
*Apéndice / 333 &lt;br /&gt;
&lt;br /&gt;
==Fuentes==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Agradecimientos a la [[Biblioteca Municipal de Guáimaro]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category: Literatura]]&lt;/div&gt;</summary>
		<author><name>Goldfields</name></author>
		
	</entry>
</feed>