<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1508641164923412783</id><updated>2012-01-17T07:12:20.174-08:00</updated><category term='proyecto'/><category term='LabVIEW'/><category term='jade'/><category term='java'/><category term='cSharp'/><category term='carrera'/><category term='ide'/><category term='pgAdminIII'/><category term='master'/><category term='porqué'/><title type='text'>... delirios de aprendizaje ...</title><subtitle type='html'>...aprendiz de todo, maestro de nada... ya que algún dia vamos a morir, dejemos que la gente nos conozca y nos recuerde por lo que hemos hecho.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-7498170266991936743</id><published>2012-01-17T07:11:00.001-08:00</published><updated>2012-01-17T07:12:20.181-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='master'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><title type='text'>Herramienta para Interficies Web</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Y para poder "consumir" los servicios web, una herramienta que, en un primer vistazo, parece que va a dar mucho juego:&amp;nbsp;&lt;a href="http://www.ni.com/uibuilder/" target="_blank"&gt;UI Builder para consumir Web Services&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-7498170266991936743?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/7498170266991936743/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=7498170266991936743' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/7498170266991936743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/7498170266991936743'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2012/01/herramienta-para-interficies-web.html' title='Herramienta para Interficies Web'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-4951319682518194470</id><published>2012-01-17T07:08:00.000-08:00</published><updated>2012-01-17T07:10:04.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='master'/><category scheme='http://www.blogger.com/atom/ns#' term='LabVIEW'/><title type='text'>Tutorial de Web Services</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;He aquí un enlace bastante útil: &lt;a href="http://zone.ni.com/wv/app/doc/p/id/wv-2509" target="_blank"&gt;Web Cast de creación de servicios Web&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-4951319682518194470?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/4951319682518194470/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=4951319682518194470' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/4951319682518194470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/4951319682518194470'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2012/01/tutorial-de-web-services.html' title='Tutorial de Web Services'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-558352308819141403</id><published>2008-01-25T04:39:00.000-08:00</published><updated>2008-01-25T04:53:57.563-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='porqué'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: redactar en XP</title><content type='html'>&lt;div style="text-align: justify;"&gt;No he escrito hasta ahora porque estaba centrado en la programación de la aplicación.&lt;br /&gt;Aunque se tenga que seguir un diseño o un análisis o unas especificaciones, me temo que he estado siguiendo un modelo de implementación extrema o &lt;span style="font-style: italic;"&gt;E&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;x&lt;/span&gt;&lt;span style="font-style: italic;"&gt;treme &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;rogramming, XP, para los entendidos en diseño y análisis. Así que, siguiendo este modelo, se piensan las funcionalidades, se implementan y se prueban para que todo funcione correctamente.&lt;br /&gt;Al acabar es cuando uno para a documentar lo que se ha hecho. Ha habido pocos quebraderos de cabeza, siempre antes de la programación de cualquier funcionalidad, pero no se ha detenido lo suficiente para pensar en ello detenidamente; se ha hecho.&lt;br /&gt;&lt;br /&gt;Y ya con un 75% del total del proyecto acabado, queda un 5% que corresponde a una ultima funcionalidad de la aplicación y un 20% que corresponde a escribir la documentación.&lt;br /&gt;&lt;br /&gt;Ahora queda... quizá una parte difícil del PFC que es la de organizar las ideas, los hechos, la teoría empleada y plasmar lo que se ha aprendido y lo que se ha construido a partir de los conocimientos; plasmar cómo debe ser utilizado; plasmar los resultados obtenidos e identificar por dónde se puede mejorar o ampliar la aplicación.&lt;br /&gt;Hay que tenerlo listo para la presentación final.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-558352308819141403?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/558352308819141403/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=558352308819141403' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/558352308819141403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/558352308819141403'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2008/01/redactar-en-xp.html' title='PFC: redactar en XP'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-3486441464641324612</id><published>2007-12-18T07:44:00.000-08:00</published><updated>2007-12-18T08:15:01.233-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='pgAdminIII'/><title type='text'>PFC: nombres, "entre comillas"</title><content type='html'>&lt;div style="text-align: justify;"&gt;Uso &lt;span style="font-weight: bold;"&gt;pgAdminIII&lt;/span&gt; para administrar la base de datos de mi proyecto. Y la gestión que hago de los datos almacenados en ella esta programada en código &lt;span style="font-weight: bold;"&gt;JAVA&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En alguna ocasión tengo que recurrir al uso de alguna función o procedimiento para la gestión de estos datos. Así que usando &lt;span style="font-style: italic;"&gt;pgAdminIII&lt;/span&gt; y su asistente para la creación de funciones o procedimientos es bastante sencillo crearlas.&lt;br /&gt;¿Cómo accedo a la creación de éstas? Lee con atención: de la jerarquía de objetos que cuelgan de una base de datos, &lt;a href="http://www.pgadmin.org/images/screenshots/pgadmin3_win32.png"&gt;en el marco dónde cuelgan las base de datos que administrar&lt;/a&gt;, encuentra los objetos &lt;span style="font-weight: bold;"&gt;Funciones&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Procedimientos&lt;/span&gt; (o &lt;span style="font-weight: bold;"&gt;Functions&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Procedures&lt;/span&gt;). Al clicar con el botón derecho encima de estas... llamémoslas entradas, seleccionar la opción &lt;span style="font-weight: bold;"&gt;Nueva Función&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Nuevo Procedimiento&lt;/span&gt; - la diferencia entre estas dos es que la primera devuelve un valor o conjunto de valores con parámetros de entrada, mientras que la segunda no devuelve nada pero trabaja con parámetros de entrada i salida -.&lt;br /&gt;&lt;br /&gt;Al clicar sobre el nombre de la función o procedimiento, en el marco de abajo se puede ver la instrucción &lt;span style="font-weight: bold;"&gt;SQL&lt;/span&gt; que las crea. Observa que el nombre se halla entre comillas dobles; e aquí el problema. Porque desde &lt;span style="font-style: italic;"&gt;JAVA&lt;/span&gt; no hay manera de crear un &lt;span style="font-weight: bold;"&gt;String&lt;/span&gt; con comillas dobles en su interior, ya que un &lt;span style="font-style: italic;"&gt;String&lt;/span&gt; se delimita por comillas dobles (lector, si hay una manera de hacerlo, ¡dímelo!). Entonces ¿no se puede llamar a un procedimiento/función desde &lt;span style="font-style: italic;"&gt;JAVA&lt;/span&gt;? Si se puede. Ese código &lt;span style="font-style: italic;"&gt;SQL&lt;/span&gt; se puede editar, basta con copiarlo en el editor &lt;span style="font-style: italic;"&gt;SQL&lt;/span&gt; (el icono de una hoja con un lápiz) de &lt;span style="font-style: italic;"&gt;pgAdminIII&lt;/span&gt; y ejecutarlo desde el mismo editor - se puede crear una &lt;span style="font-style: italic;"&gt;Función&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;Procedimiento&lt;/span&gt; sin necesidad de asistente -. En el editor le quitamos las comillas dobles al nombre y tenemos creada la función con un nombre accesible desde &lt;span style="font-style: italic;"&gt;JAVA&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-3486441464641324612?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/3486441464641324612/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=3486441464641324612' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/3486441464641324612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/3486441464641324612'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/12/pfc-nombres-entre-comillas.html' title='PFC: nombres, &quot;entre comillas&quot;'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-8794235964696947452</id><published>2007-12-18T07:22:00.000-08:00</published><updated>2007-12-18T07:48:18.654-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='cSharp'/><title type='text'>PFC: hint o tooltip</title><content type='html'>&lt;div style="text-align: justify;"&gt;Quiero que, para cada componente contenido en los formularios de la aplicación de mi proyecto, se muestre el típico mensaje de ayuda, que aparece cuando se pasa el ratón por encima.&lt;br /&gt;Bueno, he tenido que encontrar en la red, y más concretamente en &lt;a href="http://dn.codegear.com/article/32345"&gt;este artículo&lt;/a&gt; que no existe una propiedad &lt;span style="font-weight: bold;"&gt;Hint&lt;/span&gt; en para los componentes de los formularios en las nuevas versiones de &lt;span style="font-weight: bold;"&gt;.NET&lt;/span&gt;.&lt;br /&gt;Lo que si que existe es un componente llamado &lt;span style="font-weight: bold;"&gt;ToolTip&lt;/span&gt; que se añade a cada formulario. Este componente no es más que el componente que codifica el mensaje que queremos que aparezca cómo ayuda. Lo que en versiones viejas de &lt;span style="font-weight: bold;"&gt;Visual Studio&lt;/span&gt;, el &lt;span style="font-weight: bold;"&gt;Visual Basic&lt;/span&gt; antepasado de &lt;span style="font-style: italic;"&gt;.NET&lt;/span&gt;, se hacia directamente con darle valor a la propiedad &lt;span style="font-style: italic;"&gt;Hint&lt;/span&gt; de los componentes, ahora se hace con el componente &lt;span style="font-style: italic;"&gt;ToolTip&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Y ¿cómo añado yo ese comentario de ayuda? Nada más sencillo que añadir un componente &lt;span style="font-style: italic;"&gt;ToolTip &lt;/span&gt;al formulario y, automáticamente, aparece para cada componente una propiedad llamada &lt;span style="font-weight: bold;"&gt;ToolTip in tooltip1&lt;/span&gt; (o cómo llamemos al componente).&lt;br /&gt;En esta propiedad se escribe el mensaje que queremos mostrar, mientras que en las propiedades del componente &lt;span style="font-style: italic;"&gt;ToolTip&lt;/span&gt; se cambian valores cómo &lt;span style="font-weight: bold;"&gt;AutomaticDelay&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;BackColor&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;IsBalloon&lt;/span&gt;, ... (ya sabes que dejo para ti, estimado lector/aprendiz, divagar por ti solo, y si tienes dudas, no tienes que hacer más que preguntar.)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-8794235964696947452?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/8794235964696947452/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=8794235964696947452' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/8794235964696947452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/8794235964696947452'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/12/pfc-hint-o-tooltip.html' title='PFC: hint o tooltip'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-1414152711481015124</id><published>2007-11-27T03:38:00.000-08:00</published><updated>2007-11-27T07:34:27.121-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: proceso con estados</title><content type='html'>&lt;div style="text-align: justify;"&gt;El ciclo de vida de un agente se pude entender como una sucesión de estados. El comportamiento de un agente se puede programar con varios comportamientos o con un comportamiento compuesto continente de otros.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FSMBehaviour&lt;/span&gt; es uno de estos comportamientos compuestos. De manera secuencial, y definiendo transiciones entre estados, se implementa la acción que debe realizar el comportamiento. Pero &lt;span style="font-style: italic;"&gt;FSMBehaviour&lt;/span&gt; carece de método &lt;span style="font-weight: bold;"&gt;action()&lt;/span&gt;, con lo que la implementación de estados y transiciones debe realizarse en el constructor o en su método &lt;span style="font-weight: bold;"&gt;onStart()&lt;/span&gt; o justo después de añadir el comportamiento en el &lt;a href="http://cuartoderrota.blogspot.com/2007/10/pfc-poa.html"&gt;nacimiento &lt;/a&gt;del agente.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;MaquinaEstados &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;extends &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;FSMBehaviour&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;private static final&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;String &lt;/span&gt;&lt;span style="font-style: italic;"&gt;STATE_1&lt;/span&gt; = "1";&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;private static final&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;String &lt;/span&gt;&lt;span style="font-style: italic;"&gt;STATE_2&lt;/span&gt; = "2";&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;private static final&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;String &lt;/span&gt;&lt;span style="font-style: italic;"&gt;STATE_3&lt;/span&gt; = "3";&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;MaquinaEstados&lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;Agent &lt;/span&gt;_agente)&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;super&lt;/span&gt;(_agente);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;onStart&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;registerFirstState&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;OneShotBehaviour1&lt;/span&gt;(agente));&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;registerState&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;OneShotBehaviour2&lt;/span&gt;(agente));&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;registerLastState&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;OneShotBehaviour3&lt;/span&gt;(agente));&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Los estados de un agente, con &lt;span style="font-style: italic;"&gt;FSMBehaviour&lt;/span&gt;, son los distintos comportamientos que forman parte de este comportamiento compuesto.&lt;br /&gt;Se definen unas constantes cómo etiquetas para identificar los estados. Hay que registrar los distintos comportamientos que componen &lt;span style="font-style: italic;"&gt;FSMBehaviour&lt;/span&gt; a modo de estados, registrando cada cual cómo primer estado, último estado y estado intermedio.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;registerDefaultTransition&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;STATE_1, STATE_2&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;registerTransition&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;STATE_2, STATE_1&lt;/span&gt;, 0);&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;registerTransition&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;STATE_2, STATE_3&lt;/span&gt;, 1);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para controlar el flujo de ejecución, basta con definir varias transiciones entre los estados registrados. Las transiciones puede ser por defecto - el flujo de ejecución siempre va del estado/comportamiento origen al estado/comportamiento destino - o teniendo en cuenta un valor de salida del comportamiento origen, que será devuelto por el método &lt;span style="font-weight: bold;"&gt;onEnd() &lt;/span&gt;de cada comportamiento. Este valor va a depender de las condiciones de ejecución que se implementen en cada estado/comportamiento.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;public class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;OneShotBehaviour2 &lt;span style="color: rgb(0, 0, 102);"&gt;extends &lt;/span&gt;OneShotBehaviour&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;private int&lt;/span&gt; exitValue;&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;action&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;if&lt;/span&gt; (true)&lt;br /&gt;exitValue= 1;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;else&lt;/span&gt;&lt;br /&gt;exitValue= 0;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public int&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;onEnd&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;return&lt;/span&gt; exitValue;&lt;br /&gt;}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-1414152711481015124?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/1414152711481015124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=1414152711481015124' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/1414152711481015124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/1414152711481015124'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/11/pfc-proceso-con-estados.html' title='PFC: proceso con estados'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-6939669486431843575</id><published>2007-11-17T07:15:00.000-08:00</published><updated>2007-11-27T07:39:01.227-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: nacer y morir</title><content type='html'>&lt;div style="text-align: justify;"&gt;En la &lt;span style="font-weight: bold;"&gt;POA&lt;/span&gt; con &lt;span style="font-weight: bold;"&gt;JADE&lt;/span&gt;, existe un agente llamado &lt;span style="font-weight: bold;"&gt;DF&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;D&lt;/span&gt;irectory &lt;span style="font-weight: bold;"&gt;F&lt;/span&gt;acilitator) . Dicho agente se encarga de guardar la descripción y dirección de los agentes que viven en un mismo sistema. Proporciona un servicio de páginas amarillas al cual los demás agentes acceden para saber la dirección de otros y poder comunicarse entre ellos.&lt;br /&gt;&lt;br /&gt;Cuando se crea un agente, la primera tarea que debe hacerse en su nacimiento, en su método &lt;span style="font-weight: bold;"&gt;setup()&lt;/span&gt;, es la de registrarse en el DF.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Jane &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;extends &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Agent&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;setup&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DFAgentDescription &lt;/span&gt;dfd = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;DFAgentDescription&lt;/span&gt;();&lt;br /&gt;dfd.&lt;span style="color: rgb(51, 102, 255);"&gt;setName&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getAID&lt;/span&gt;()); &lt;span style="color: rgb(0, 102, 0);"&gt;//una descripción con su identificador&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ServiceDescription &lt;/span&gt;sd = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ServiceDescription&lt;/span&gt;();&lt;br /&gt;sd.&lt;span style="color: rgb(51, 102, 255);"&gt;setType&lt;/span&gt;("agente_recomendador");&lt;br /&gt;sd.&lt;span style="color: rgb(51, 102, 255);"&gt;setName&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getName&lt;/span&gt;());&lt;br /&gt;dfd.&lt;span style="color: rgb(51, 102, 255);"&gt;addServices&lt;/span&gt;(sd);&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DFService&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;register&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;this&lt;/span&gt;, dfd);&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para registrarlo, utilizamos el método estático&lt;span style="font-weight: bold;"&gt; register(Agent, DFAgentDescription)&lt;/span&gt; del &lt;span style="font-style: italic;"&gt;DF&lt;/span&gt;, pasándole por parámetros el tipo de agente que es (instancia de la clase que implementa) y su descripción. Y aquí ya tenemos listo al agente para ser localizado dentro del sistema.&lt;br /&gt;Al terminar la aplicación, todos los agentes mueren al mismo tiempo que se cierra la &lt;span style="font-weight: bold;"&gt;JVM&lt;/span&gt; dónde residen todos los agentes. Pero ¿si queremos dar por terminado un agente sin tener que cerrar la &lt;span style="font-style: italic;"&gt;JVM&lt;/span&gt;?&lt;br /&gt;Cuando un agente termina su actividad, pasa de estado &lt;span style="font-weight: bold;"&gt;ACTIVE &lt;/span&gt;a &lt;span style="font-weight: bold;"&gt;DELETED&lt;/span&gt;, ejecuta su método interno &lt;span style="font-weight: bold;"&gt;takeDown()&lt;/span&gt;. En este método tenemos que quitar el agente del &lt;span style="font-style: italic;"&gt;DF&lt;/span&gt; para que ningún otro se pueda comunicar con él.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;takeDown&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DFAgentDescription &lt;/span&gt;dfd = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;DFAgentDescription&lt;/span&gt;();&lt;br /&gt;dfd.&lt;span style="color: rgb(51, 102, 255);"&gt;setName&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getAID&lt;/span&gt;());&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ServiceDescription &lt;/span&gt;sd = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ServiceDescription&lt;/span&gt;();&lt;br /&gt;sd.&lt;span style="color: rgb(51, 102, 255);"&gt;setType&lt;/span&gt;("agente_recomendador");&lt;br /&gt;sd.&lt;span style="color: rgb(51, 102, 255);"&gt;setName&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getName&lt;/span&gt;());&lt;br /&gt;dfd.&lt;span style="color: rgb(51, 102, 255);"&gt;addServices&lt;/span&gt;(sd);&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DFService&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;deregister&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;, dfd);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Basta con llamar al método estático &lt;span style="font-weight: bold;"&gt;deregister(Agent, DFAgentDescription)&lt;/span&gt; para acabar con él. La &lt;span style="font-weight: bold;"&gt;API&lt;/span&gt; de este método permite varias maneras de quitar del &lt;span style="font-style: italic;"&gt;DF&lt;/span&gt; a un agente. Fijaros que he incluido la misma descripción para registrarlo que para quitarlo del registro. Así me aseguro que sólo ese agente va a ser eliminado.&lt;br /&gt;Pero, ¿porqué no llamar a &lt;span style="font-style: italic;"&gt;DFService.deregister()&lt;/span&gt;, sin parámetros? Con esta última solución eliminaría a todos los agentes que implementan la misma clase, cosa que para mi proyecto no me interesa, porque en el sistema tengo varios agentes de la misma clase y se puede dar el caso que un agente recomendador tenga que hacer cálculos mientras que otro ya ha acabado.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-6939669486431843575?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/6939669486431843575/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=6939669486431843575' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/6939669486431843575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/6939669486431843575'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/11/pfc-nacer-y-morir.html' title='PFC: nacer y morir'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-724955390650666637</id><published>2007-11-10T10:17:00.000-08:00</published><updated>2007-11-17T07:53:24.550-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: entender un mensaje</title><content type='html'>&lt;div style="text-align: justify;"&gt;Cómo un agente puede tener varios comportamientos, cada uno de ellos va a actuar según el tipo de mensajes que reciba.&lt;br /&gt;Habéis leído ( o decido de la lectura) que un mensaje se lo identifica por un tipo o &lt;span style="font-weight: bold; font-style: italic;"&gt;performativa&lt;/span&gt;. Con el envío y recepción de mensajes de &lt;span style="font-style: italic;"&gt;performativas&lt;/span&gt; relacionadas se puede identificar una conversación entre agentes, con la cual se maneja el flujo de datos y la ejecución de algoritmos entre ellos. Por ejemplo,&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;CFP&lt;/span&gt; &lt;span style="color: rgb(102, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;C&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;all &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;F&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;or &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;P&lt;/span&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;roposal)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;ACCEPT-PROPOSAL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;REJECT-PROPOSAL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;PROPOSE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;son &lt;span style="font-style: italic;"&gt;performativas&lt;/span&gt; que pueden ayudarnos a crear una comunicación de negociación entre agentes. Pero, ¿cómo se sabe que mensaje ha de recibir un comportamiento? Basta con declarar una variable de tipo &lt;span style="font-weight: bold;"&gt;jade.lang.acl.MessageTemplate&lt;/span&gt; e indicarle que patrón debe tener el mensaje que tiene que recibir. Siguiendo el ejemplo visto en el mini artículo anterior:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;template= &lt;span style="font-weight: bold;"&gt;MessageTemplate&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;and&lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;MessageTemplate&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;MatchConversationId&lt;/span&gt;("consulta_bd"),&lt;br /&gt;             &lt;span style="font-weight: bold;"&gt;MessageTemplate&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;MatchInReplyTo&lt;/span&gt;(mensaje.&lt;span style="color: rgb(51, 102, 255);"&gt;getReplyWith&lt;/span&gt;()));&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;indico al agente que el mensaje que tiene que identificar y tratar debe contener un &lt;span style="font-weight: bold;"&gt;conversationId&lt;/span&gt; = "consulta_bd" y que debe ser una respuesta o réplica del mensaje que le he enviado. Mirad la documentación de &lt;span style="font-style: italic;"&gt;jade.lang.acl.MessageTemplate&lt;/span&gt; para más detalles.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-724955390650666637?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/724955390650666637/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=724955390650666637' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/724955390650666637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/724955390650666637'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/11/pfc-entender-un-mensaje.html' title='PFC: entender un mensaje'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-15650511641415900</id><published>2007-11-10T07:26:00.000-08:00</published><updated>2007-11-10T10:30:47.702-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: comunicacion interagente</title><content type='html'>&lt;div style="text-align: justify;"&gt;Uno de los puntos fuertes de la &lt;span style="font-weight: bold;"&gt;POA&lt;/span&gt; es la programación de mensajes. Con éstos, se establece comunicación entre agentes que estan en ejecución. A modo de conversación entre ellos, en una &lt;span style="font-style: italic;"&gt;POA&lt;/span&gt; tiene que haber mensajes que se envian o se reciben por uno u otro agente, a modo de ejecución de órdenes y devolver respuestas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Un primer agente crea un mensaje :&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ACLMessage &lt;/span&gt;mensaje = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ACLMessage&lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;ACLMessage&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;REQUEST&lt;/span&gt;);&lt;br /&gt;mensaje.&lt;span style="color: rgb(51, 102, 255);"&gt;addReceiver&lt;/span&gt;(agente); &lt;span style="color: rgb(0, 102, 0);"&gt;//destinatario del mensaje&lt;/span&gt;&lt;br /&gt;mensaje.&lt;span style="color: rgb(51, 102, 255);"&gt;setConversationId&lt;/span&gt;("consulta_bd"); &lt;span style="color: rgb(0, 102, 0);"&gt;//un identificador de la conversación&lt;/span&gt;&lt;br /&gt;mensaje.&lt;span style="color: rgb(51, 102, 255);"&gt;setReplyWith&lt;/span&gt;("consulta_bd"+System.currentTimeMillis());&lt;br /&gt;mensaje.&lt;span style="color: rgb(51, 102, 255);"&gt;setContent&lt;/span&gt;("te envio un mensaje"); &lt;span style="color: rgb(0, 102, 0);"&gt;//contenido del mensaje&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;myAgent&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;send&lt;/span&gt;(mensaje);&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El mensaje es de tipo &lt;span style="font-weight: bold;"&gt;jade.lang.acl.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ACLMessage&lt;/span&gt;. El destinatario de éste se define mediante la variable &lt;span style="font-weight: bold;"&gt;jade.core.AID&lt;/span&gt; agente, y con &lt;span style="font-weight: bold;"&gt;setContent(String msg)&lt;/span&gt; se indica el qué va a contener el mensaje. Los otros métodos sirven para identificar el mensaje, para quién hay que responderlo, etc.&lt;br /&gt;&lt;br /&gt;Y para contestar a este mensaje, otro agente crea una réplica del mensaje recibido por el primer agente:&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;ACLMessage &lt;/span&gt;recibido = &lt;span style="color: rgb(0, 0, 102);"&gt;myAgent&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;receive&lt;/span&gt;(template); &lt;span style="color: rgb(0, 102, 0);"&gt;//recibe un tipo de mensaje&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ACLMessage &lt;/span&gt;replica= recibido.&lt;span style="color: rgb(51, 102, 255);"&gt;createReply&lt;/span&gt;();&lt;br /&gt;replica.&lt;span style="color: rgb(51, 102, 255);"&gt;setPerformative&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;ACLMessage&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;INFORM&lt;/span&gt;); &lt;span style="color: rgb(0, 102, 0);"&gt;//tipo de mensaje&lt;/span&gt;&lt;br /&gt;replica.&lt;span style="color: rgb(51, 102, 255);"&gt;setContent&lt;/span&gt;("te envio una respuesta");&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;myAgent&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;send&lt;/span&gt;(replica);&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Un punto a destacar de la comunicación es cómo definir el tipo de mensaje empleado.  Existen varios actos comunicativos que permiten distinguir una comunicación de otra, pudiendo ser procesados, en paralelo, por varios comportamientos de un agente.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-15650511641415900?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/15650511641415900/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=15650511641415900' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/15650511641415900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/15650511641415900'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/11/pfc-comunicacion-interagente.html' title='PFC: comunicacion interagente'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-1438906567972076757</id><published>2007-10-31T05:15:00.000-07:00</published><updated>2007-11-17T07:54:28.134-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><title type='text'>sumar valor a una fecha</title><content type='html'>&lt;div style="text-align: justify;"&gt;Una de las muchas complicaciones de la programación en &lt;span style="font-weight: bold;"&gt;JAVA &lt;/span&gt;es la programación de fechas. En mi proyecto necesito incrementar el valor de una fecha para trabajar con periodos de tiempo.&lt;br /&gt;El uso de fechas no es trivial, requiere mirar mucha documentación y aprender de ejemplos para no cometer fallos. Y mirando por la red, esta vez si, he encontrado una solución.&lt;br /&gt;&lt;br /&gt;Basta con crear un objeto &lt;span style="font-weight: bold;"&gt;jade.util.Calendar &lt;/span&gt;y añadirle valores posteriormente, para luego añadirle un incremento, más o menos siguiendo estas lineas:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;String []&lt;/span&gt; dataTemp;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DateFormat&lt;/span&gt; df= &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;SimpleDateFormat&lt;/span&gt;("dd/MM/yyyy");&lt;br /&gt; &lt;br /&gt;dataTemp= _data.&lt;span style="color: rgb(51, 102, 255);"&gt;split&lt;/span&gt;("/");&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Calendar&lt;/span&gt; c= &lt;span style="font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;getInstance&lt;/span&gt;();&lt;br /&gt;c.&lt;span style="color: rgb(51, 102, 255);"&gt;set&lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;parseInt&lt;/span&gt;(dataTemp[2]), &lt;span style="font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;parseInt&lt;/span&gt;(dataTemp[1])- 1, &lt;span style="font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;parseInt&lt;/span&gt;(dataTemp[0]));&lt;br /&gt;c.&lt;span style="color: rgb(51, 102, 255);"&gt;add&lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;DATE&lt;/span&gt;, incremento);&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;siendo incremento el valor que quiero sumar, en este caso, al día de la fecha (se indica o &lt;span style="font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;MONTH&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;YEAR&lt;/span&gt; si se incrementa el valor del mes o del año, respectivamente).&lt;br /&gt;Con el método &lt;span style="font-weight: bold;"&gt;set(int, int, int)&lt;/span&gt;, introduzco al &lt;span style="font-style: italic;"&gt;Calendar &lt;/span&gt;los valores de año, mes y día, por este orden (fijaros que al valor del mes lo decremento en uno, porque &lt;span style="font-style: italic;"&gt;Calendar &lt;/span&gt;trata los meses desde 0 a 11).&lt;br /&gt;He podido comprobar, también, que al sumar un incremento que pueda dar un valor superior al valor máximo de un mes, el valor del mes también se incrementa, por sí solo, dando lugar a una fecha correcta.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-1438906567972076757?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/1438906567972076757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=1438906567972076757' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/1438906567972076757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/1438906567972076757'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/sumar-valor-una-fecha.html' title='sumar valor a una fecha'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-7047104995707209934</id><published>2007-10-25T05:48:00.000-07:00</published><updated>2007-10-26T01:38:58.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='cSharp'/><title type='text'>... y manejar componentes a la vez</title><content type='html'>&lt;div style="text-align: justify;"&gt;El uso de &lt;span style="font-weight: bold;"&gt;Thread&lt;/span&gt;, del que hablo en el anterior mini artículo, lo aplico a controlar algoritmos que se ejecutan en los formularios de la aplicación cliente. Y al crear un hilo distinto, y toquetear componentes del formulario lleva a un conflicto.&lt;br /&gt;Existe un primer hilo de ejecución (¡supongo que anda por ahí!, o al menos eso dice el compilador) que retiene el funcionamiento de los componentes y no deja que otros hilos modifiquen el estado de éstos. P.ej. desde un segundo hilo quiero escribir cosas a un &lt;span style="font-weight: bold;"&gt;listBox&lt;/span&gt; que tiene el formulario, la ejecución falla.&lt;br /&gt;Y para subsanar está pequeña herida hay que utilizar el código siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//en los atributos del formulario&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;delegate void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;metodoCallback&lt;/span&gt;(parámetros);&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public void&lt;/span&gt; recomendation()&lt;br /&gt;{&lt;br /&gt;metodo(parámetros)&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public void&lt;/span&gt; metodo(parámetros)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;if&lt;/span&gt; (&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.listBox1.&lt;span style="color: rgb(51, 102, 255);"&gt;InvokeRequired&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;metodoCallback&lt;/span&gt; process = &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;metodoCallback&lt;/span&gt;(metodo);&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;Invoke&lt;/span&gt;(process, &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;object[]&lt;/span&gt; { parámetros });&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.listBox1.&lt;span style="color: rgb(51, 102, 255);"&gt;Add&lt;/span&gt;(parámetros) &lt;span style="color: rgb(0, 102, 0);"&gt;//por ejemplo&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Aquí, yo quiero llenar una lista, así que la lleno en la condición &lt;span style="font-weight: bold;"&gt;else&lt;/span&gt; del método. Todo lo demás es para hacer que este método manipule el contenido del &lt;span style="font-style: italic;"&gt;listBox&lt;/span&gt;.&lt;br /&gt;Cómo no he investigado más a fondo para entenderlo; sólo he buscado resultados, no puedo ofreceros una explicación más detallada. No es parte fundamental de mi proyecto así que esto ya sirve.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-7047104995707209934?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/7047104995707209934/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=7047104995707209934' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/7047104995707209934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/7047104995707209934'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/thread-y-manejar-componentes-la-vez.html' title='... y manejar componentes a la vez'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-8715770631953025529</id><published>2007-10-24T03:34:00.000-07:00</published><updated>2007-10-24T03:56:56.450-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='cSharp'/><title type='text'>varias tareas... (usando Threads)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Parte de la programación del proyecto se centra en seguir un diseño cliente/servidor. La parte cliente, implementada en c#, es la encargada de enviar peticiones y recibir resultados. Las peticiones son mensajes para obtener datos de una base de datos.&lt;br /&gt;El proceso que debe ejecutar el cliente es largo: incluye varios envíos y recibimientos, por lo que no quiero que se quede bloqueado a la espera de que acabe dicho proceso (no es un requerimiento indispensable para el proyecto, pero ¡me picaba el gusanillo!)&lt;br /&gt;&lt;br /&gt;He estado probando implementaciones, consultando de aquí para allá para utilizar &lt;span style="font-weight: bold;"&gt;Thread&lt;/span&gt; en &lt;span style="font-weight: bold;"&gt;c#&lt;/span&gt;, y quiero dejar parte de lo que he estado aprendiendo.&lt;br /&gt;Cuando se inicia el proceso, el código del botón que lo pone en marcha ejecuta lo siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;using&lt;/span&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;System.Threading&lt;/span&gt;;&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Thread&lt;/span&gt; hilo =&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Thread&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;ThreadStart&lt;/span&gt;(recomendation));&lt;br /&gt;hilo.name = "hilo";&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;if&lt;/span&gt; (!hilo.&lt;span style="color: rgb(51, 102, 255);"&gt;IsAlive&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;hilo.&lt;span style="color: rgb(51, 102, 255);"&gt;Start&lt;/span&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Al constructor del &lt;span style="font-style: italic;"&gt;Thread&lt;/span&gt; se le pasa un parámetro, que es el nombre del método que&lt;span style="font-style: italic;"&gt;&lt;/span&gt; ejecutará, siendo:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;private void&lt;/span&gt; recomendacion()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//lógica del algoritmo&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;hilo.&lt;span style="color: rgb(51, 102, 255);"&gt;Abort&lt;/span&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;un método que ni lleva parámetros ni devuelve ningún valor. El código de este método será el que ejecute el hilo recientemente creado.&lt;br /&gt;Y así puedo toquetear otras tareas de la aplicación, mientras el proceso está en marcha. Fijaros que añado el método &lt;span style="font-weight: bold;"&gt;Abort&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;()&lt;/span&gt;. Lo llamo nada más acabar el proceso que ejecuta el método, para terminar el Thread. Este método lanza una excepción &lt;span style="font-weight: bold;"&gt;System.Threading.ThreadAbortException&lt;/span&gt; que no &lt;span style="font-style: italic;"&gt;cojo&lt;/span&gt; porque no es necesario.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-8715770631953025529?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/8715770631953025529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=8715770631953025529' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/8715770631953025529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/8715770631953025529'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-varias-tareas-usando-threads.html' title='varias tareas... (usando Threads)'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-6620101193569918154</id><published>2007-10-23T06:24:00.000-07:00</published><updated>2007-10-23T06:43:49.240-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: seguimiento de la comunicación</title><content type='html'>&lt;div style="text-align: justify;"&gt;El agente software se comporta a modo de hilo de ejecución o &lt;span style="font-weight: bold;"&gt;Thread&lt;/span&gt;. Sabiendo esto, uno se puede imaginar que seguir el camino por dónde pasa el código es un poco difícil, debido a su carácter concurrente, que no se sabe si ha pasado por aquí, si está interrumpido... y más si aportas al &lt;span style="font-style: italic;"&gt;Thread&lt;/span&gt; una autonomía a base de estados, que si &lt;span style="font-weight: bold;"&gt;active&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;wait&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;suspended&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;running&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;blocked &lt;/span&gt;- los tres primeros estados pertenece a la clase &lt;span style="font-weight: bold;"&gt;Agent&lt;/span&gt; y los dos últimos a la clase &lt;span style="font-weight: bold;"&gt;Behaviour &lt;/span&gt;-.&lt;br /&gt;&lt;br /&gt;Habéis leído que para ejecutar código java con agentes hay que escribir en el intérprete de comandos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(102, 0, 0); font-style: italic;"&gt;java &lt;/span&gt;&lt;span style="font-style: italic;"&gt;jade.Boot &lt;/span&gt;&lt;span style="color: rgb(102, 0, 0); font-style: italic;"&gt;-gui&lt;/span&gt;&lt;span style="font-style: italic;"&gt; "nombre_agente_1":"clase_java_agente_1"(parámetros)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Fijaros que utilizo la opción -gui. Ésta lanza el agente &lt;span style="font-weight: bold;"&gt;&lt;a href="http://jade.tilab.com/images/rma.gif"&gt;RMA&lt;/a&gt;&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;gente de &lt;span style="font-weight: bold;"&gt;M&lt;/span&gt;onitorización &lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;emota o &lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;emote &lt;span style="font-weight: bold;"&gt;M&lt;/span&gt;onitoring &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;gent para los cultos) que permite ver que agentes están activos dentro de la JVM. (&lt;span style="font-style: italic;"&gt;RMA &lt;/span&gt;es un agente con una pantalla gráfica asociada). Desde el &lt;span style="font-style: italic;"&gt;RMA&lt;/span&gt; se pueden lanzar otro agentes que ayudan a controlar la existéncia de los nuestros.&lt;br /&gt;Uno de mucha utilidad (y que utilizo bastante) es el agente &lt;span style="font-weight: bold;"&gt;&lt;a href="http://jade.tilab.com/images/Sniffer.jpg"&gt;Sniffer&lt;/a&gt;&lt;/span&gt;. Dicho agente permite monitorizar la comunicación que existe entre los nuestros y el contenido de dicha comunicación. Se puede ver el paso de mensajes de unos a otros aún estando creados y en ejecución, porque el agente mostrará cómo ha sido la comunicación entre ellos; en que dirección se han enviado los mensajes.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-6620101193569918154?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/6620101193569918154/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=6620101193569918154' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/6620101193569918154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/6620101193569918154'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-seguimiento-del-ciclo-de-vida.html' title='PFC: seguimiento de la comunicación'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-3984992263221013754</id><published>2007-10-19T02:56:00.000-07:00</published><updated>2007-10-19T03:23:17.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: ... digo main</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ya os hablé que en POA&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;no hay un método main&lt;span style="font-weight: bold;"&gt;, &lt;/span&gt;ni nos hace falta una clase main&lt;span style="font-style: italic;"&gt; &lt;/span&gt;porque JADE tiene su manera de arrancar una aplicación. Pero ha surgido una cuestión que era necesaria utilizar en mi proyecto fin de carrera. Me he visto en la obligación de implementar unas líneas de código para crear agentes en tiempo de ejecución; es decir, que debo crear agentes por código y no sólo tener varios agentes creados inicialmente, al lanzar la aplicación.&lt;br /&gt;&lt;br /&gt;El trozo de código que me permite crear agentes dinámicamente es:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Object[]&lt;/span&gt; arguments = &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Object[]&lt;/span&gt;{"a", "b"};&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PlatformController &lt;/span&gt;plataforma = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getContainerController&lt;/span&gt;();&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AgentController &lt;/span&gt;control =&lt;br /&gt;plataforma.&lt;span style="color: rgb(51, 102, 255);"&gt;createNewAgent&lt;/span&gt;("nombre_agente"+ _numero, "paquete.claseAgente", arguments);&lt;br /&gt;control.&lt;span style="color: rgb(51, 102, 255);"&gt;start&lt;/span&gt;();&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Cómo parámetros hay que pasar un nombre para el agente (yo añado el parámetro &lt;span style="font-weight: bold;"&gt;_numero&lt;/span&gt; para distinguir a los diferentes agentes que voy a crear), la clase que implementa el código del agente y los argumentos del agente.&lt;br /&gt;&lt;br /&gt;Los agentes viven en un &lt;span style="font-style: italic;"&gt;contenedor&lt;/span&gt; ubicado en la &lt;span style="font-weight: bold;"&gt;JVM&lt;/span&gt;. Con este código se obtiene dicho &lt;span style="font-style: italic;"&gt;contenedor&lt;/span&gt;, que está creado debido a que al lanzar la aplicación, lanzo también varios agentes que sí quiero que estén siempre activos, mientras el código servidor esté funcionando (esto ya prepara a la &lt;span style="font-style: italic;"&gt;JVM&lt;/span&gt; para acoger a agentes). Tiene que existir otra solución para poder crear dicho contenedor en la &lt;span style="font-style: italic;"&gt;JVM&lt;/span&gt; y poder crear agentes desde código. Sospecho que las clases &lt;span style="font-weight: bold;"&gt;PlatformController&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;AgentController&lt;/span&gt; tiene algo que ver.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-3984992263221013754?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/3984992263221013754/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=3984992263221013754' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/3984992263221013754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/3984992263221013754'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-digo-main.html' title='PFC: ... digo main'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-7927426806693510504</id><published>2007-10-18T05:08:00.000-07:00</published><updated>2007-10-24T03:09:07.837-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='porqué'/><title type='text'>sin imágenes</title><content type='html'>&lt;div style="text-align: justify;"&gt;No darlo todo mascado. Los que leáis este blog se supone que tenéis conocimientos suficientes para entenderlo todo. Y si no lo entendéis se supone que sois lo suficiente despiertos - ¡culos inquietos! - para preguntar, buscar, moveros por la red de conocimiento que existe vía internet para entenderlo todo.&lt;br /&gt;&lt;br /&gt;No voy a acompañar ningún mini artículo con imágenes. Me gusta la plantilla utilizada para el blog y creo que incluir imágenes le va a quitar el encanto. Sin embargo, si que voy a enlazar imágenes. Que no quiera incluir dibujos en los escritos no significa que no se puedan ver, a razón de ayuda visual para cada escrito.&lt;br /&gt;Dejémoslo así entonces, cómo si cada mini artículo estuviera escrito como si de un manuscrito se tratara; tiene un toque antiguo que favorece la lectura y el interés.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-7927426806693510504?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/7927426806693510504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=7927426806693510504' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/7927426806693510504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/7927426806693510504'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/sin-imgenes.html' title='sin imágenes'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-5873704768398216899</id><published>2007-10-18T04:45:00.001-07:00</published><updated>2007-10-19T03:18:48.516-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: dónde digo Boot ... (con Eclipse)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Sin irme del proyecto que tengo entre manos, cómo escribo en &lt;span style="font-weight: bold;"&gt;JAVA &lt;/span&gt;gracias al editor &lt;span style="font-weight: bold;"&gt;Eclipse&lt;/span&gt;&lt;span&gt;, deciros que no puedo (o no quiero) ejecutar los agentes desde intérprete de comandos tal y como describo en el mini artículo anterior. Surge la pregunta: ¿cómo ejecuto mis agentes desde &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt;?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Abrid las propiedades de &lt;span style="font-weight: bold;"&gt;Run&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Debug&lt;/span&gt; desde &lt;span style="font-weight: bold;"&gt;Run&gt;Run&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;Run&gt;Debug&lt;/span&gt;, o desde los iconos correspondientes. Cread una nueva configuración a modo de &lt;span style="font-weight: bold;"&gt;Java Application&lt;/span&gt;. En la pestaña &lt;span style="font-weight: bold;"&gt;Main&lt;/span&gt;, opción &lt;span style="font-weight: bold;"&gt;Main class&lt;/span&gt; escribid &lt;span style="font-weight: bold;"&gt;jade.Boot&lt;/span&gt; y activad la casilla que activa (valga la redundancia) la opción de incluir librerías cuando se busque la clase main.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Id a la pestaña &lt;span style="font-weight: bold;"&gt;Arguments&lt;/span&gt;. En la casilla &lt;span style="font-weight: bold;"&gt;Program arguments&lt;/span&gt; escribid los agentes que deseéis que se ejecuten, de igual modo que habéis leído en el mini artículo anterior.&lt;br /&gt;&lt;br /&gt;Con estas instrucciones tenemos una configuración de &lt;span style="font-style: italic;"&gt;Run&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;Debug&lt;/span&gt; lista para ejecutar y lanzar nuestro código con agentes.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-5873704768398216899?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/5873704768398216899/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=5873704768398216899' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/5873704768398216899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/5873704768398216899'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-dnde-dije-boot-con-eclipse.html' title='PFC: dónde digo Boot ... (con Eclipse)'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-784807903853345539</id><published>2007-10-18T04:19:00.000-07:00</published><updated>2007-10-19T03:18:28.763-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: dónde digo Boot ...</title><content type='html'>&lt;div style="text-align: justify;"&gt;En una &lt;span style="font-weight: bold;"&gt;POA&lt;/span&gt;, uno debe de olvidarse del &lt;span style="font-weight: bold;"&gt;main&lt;/span&gt;. No existe el tratamiento secuencial de una aplicación: ahora creo la clase, luego hago el cálculo y sigo. ¡No! Nos encontramos ante un tratamiento concurrente, una ejecución en paralelo de algoritmos - algoritmos secuenciales o concurrentes, dependiendo de la lógica de cada aplicación - y cada agente se comporta como un programa independiente que se comunica con otros programas independientes. Aún así, &lt;span style="font-style: italic;"&gt;JADE &lt;/span&gt;nos proporciona una clase que lleva un método &lt;span style="font-style: italic;"&gt;main&lt;/span&gt; encargado de dar vida a los agentes: &lt;span style="font-weight: bold;"&gt;jade.Boot&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Con esto, me ha surgido una duda. ¿Si debo tener varias tareas ejecutándose (cada agente tiene una tarea diferente) cómo ejecuto la aplicación si no hay una clase con un &lt;span style="font-style: italic;"&gt;main&lt;/span&gt;?&lt;br /&gt;La respuesta es tan sencilla como escribir el nombre de todos los agentes que se haya implementado, a razón de parámetros de la instrucción &lt;span style="font-weight: bold;"&gt;java&lt;/span&gt;, en el intérprete de comandos . Algo cómo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(102, 0, 0); font-style: italic;"&gt;java &lt;/span&gt;&lt;span style="font-style: italic;"&gt;jade.Boot &lt;/span&gt;&lt;span style="color: rgb(102, 0, 0); font-style: italic;"&gt;-gui&lt;/span&gt;&lt;span style="font-style: italic;"&gt; "nombre_agente_1":"clase_java_agente_1"(parámetros)  "nombre_agente_n":"clase_java_agente_n"(parámetros)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Lo que va entre paréntesis son los parámetros que se le puede pasar a un agente, separados por un espacio en blanco. Desde código se recogen con el método:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Object&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;[]&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;getArguments&lt;/span&gt;()&lt;br /&gt;&lt;br /&gt;de la clase &lt;span style="font-weight: bold;"&gt;jade.core.Agent&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-784807903853345539?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/784807903853345539/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=784807903853345539' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/784807903853345539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/784807903853345539'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-dnde-dije-boot.html' title='PFC: dónde digo Boot ...'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-797675182711005710</id><published>2007-10-17T09:10:00.000-07:00</published><updated>2007-10-17T14:41:28.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: para usar JADE</title><content type='html'>&lt;div style="text-align: justify;"&gt;Antes de seguir con el mundillo de la implementación de agentes, seguro que preguntais qué IDE utilizo para desarrollar en &lt;span style="font-style: italic;"&gt;JAVA&lt;/span&gt;. Deciros que utilizo &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; cómo editor de código. A otra posible pregunta que se os pasa por la cabeza, que responde al título de este mini artículo, deciros, de manera resumida, que basta con añadir las librerias de &lt;a href="http://jade.tilab.com/"&gt;JADE&lt;/a&gt; al proyecto. &lt;span style="font-size:85%;"&gt;(No hay enlace directo a la página de descarga. Debeis registraros con e-mail y contraseña y se os permitirá descargar todo el paquete de .jar; descargar la última versión. Yo trabajo con la 3.5 del 25/06/2007)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Eclipse &lt;/span&gt;permite gestionar carpetas del proyecto creado, así que es recomendable crear una carpeta &lt;span style="font-weight: bold;"&gt;lib&lt;/span&gt;, como subcarpeta del proyecto, para guadar ahí los .jar adicionales que se utilizen para el proyecto. Descomprimir el .zip que acabis de descargar y guardar los .jar dentro de esa carpeta &lt;span style="font-style: italic;"&gt;lib &lt;/span&gt;- los .jar que se necesitan son: &lt;span style="font-weight: bold;"&gt;http.jar&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;iiop.jar&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;jade.jar&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;jadeTools.jar&lt;/span&gt; -&lt;br /&gt;&lt;br /&gt;Luego, id al menú &lt;span style="font-weight: bold;"&gt;Project&gt;Properties&lt;/span&gt;, elegid la opción &lt;span style="font-weight: bold;"&gt;Java Build Path&lt;/span&gt; y, en la pestaña &lt;span style="font-weight: bold;"&gt;Libraries&lt;/span&gt;, hay la opción de añadir .jar locales o .jar externos. Cómo los tenemos en la propia carpeta &lt;span style="font-style: italic;"&gt;lib &lt;/span&gt;del proyecto, nos basta con la primera opción (si los quereis agregar desde otra ubicación, ningún problema). Buscadlos y se puede hacer una selección multiple para no tener que añadirlos uno por uno.&lt;br /&gt;&lt;br /&gt;Ya tenemos los .jar de &lt;span style="font-style: italic;"&gt;JADE &lt;/span&gt;listos para utilizar. Ahora toca leer las &lt;span style="font-weight: bold;"&gt;API &lt;/span&gt;que acompañan al .zip antes descargado y escribir los &lt;span style="font-weight: bold;"&gt;import &lt;/span&gt;pertinentes en cada clase agente a implementar.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-797675182711005710?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/797675182711005710/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=797675182711005710' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/797675182711005710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/797675182711005710'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-para-usar-jade.html' title='PFC: para usar JADE'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-9107663776245389848</id><published>2007-10-17T01:50:00.000-07:00</published><updated>2007-11-17T07:55:35.432-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='jade'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>PFC: POA</title><content type='html'>&lt;div style="text-align: justify;"&gt;De lo que he podido entender de la documentación que he leído acerca de agentes, y acerca de &lt;span style="font-style: italic;"&gt;JADE&lt;/span&gt;, un &lt;span style="font-style: italic;"&gt;agente &lt;/span&gt;es un objeto que actúa siguiendo uno o varios comportamientos. A un objeto &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Agent&lt;/span&gt; se le añaden objetos &lt;span style="font-weight: bold;"&gt;Behaviour&lt;/span&gt; los cuales llevan programado la lógica de un algoritmo concreto.&lt;br /&gt;El agente, cuando nace - los vamos a tratar como seres - llevan a cabo una... puesta a punto con la cual se registran en un directorio virtual de nombres y recogen información del entorno para llevar a cabo su funcionamiento&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Jane &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;extends &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Agent&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;    protected void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;setup&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        Object&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;[]&lt;/span&gt; args = &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255);"&gt;getArguments&lt;/span&gt;();&lt;br /&gt;   ...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        DFService&lt;/span&gt;.&lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;register&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;this&lt;/span&gt;, &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;DFAgentDescription&lt;/span&gt;());&lt;br /&gt;  ...&lt;br /&gt;  &lt;span style="color: rgb(51, 102, 255);"&gt;addBehaviour&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;new &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Smart&lt;/span&gt;(&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;this&lt;/span&gt;));&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Por si sólo, el agente no hace nada, solamente existe en la &lt;span style="font-weight: bold;"&gt;JVM&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;J&lt;/span&gt;ava &lt;span style="font-weight: bold;"&gt;V&lt;/span&gt;irtual &lt;span style="font-weight: bold;"&gt;M&lt;/span&gt;achine). Para que haga algo debe llevar asociado algún comportamiento como un &lt;span style="font-weight: bold;"&gt;SimpleBehaviour &lt;/span&gt;&lt;em style="font-weight: bold;"&gt;&lt;/em&gt;o un &lt;span style="font-weight: bold;"&gt;CyclicBehaviour&lt;/span&gt;&lt;em style="font-weight: bold;"&gt;&lt;/em&gt;&lt;span style="font-weight: bold;"&gt;: &lt;/span&gt;ejecutándose una sola vez durante la vida del agente o ejecutándose repetidamente, respectivamente. En código, y de manera esquemática seria algo cómo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;public class&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Smart &lt;span style="color: rgb(0, 0, 102);"&gt;extends &lt;/span&gt;SimpleBehaviour&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;    public void&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;action&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        //lógica del algoritmo que se debe ejecutar&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;    public&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;boolean &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;done&lt;/span&gt;()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;        //¿ha terminado?&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Como un agente lleva asociados comportamientos que debe utilizar - la clase &lt;span style="font-weight: bold;"&gt;Agent &lt;/span&gt;puede tener varios &lt;span style="font-weight: bold;"&gt;Behaviours&lt;/span&gt;, en la jerga se dice que contiene un &lt;span style="font-weight: bold; font-style: italic;"&gt;pool&lt;/span&gt; de Behaviour- se pueden implementar dentro de la clase &lt;span style="font-style: italic;"&gt;Agent &lt;/span&gt;que hayamos creado, o cómo clase externa, en su correspondiente fichero&lt;br /&gt;El método &lt;span style="font-weight: bold;"&gt;action()&lt;/span&gt; es el encargado de ejecutar los pasos del comportamiento del agente, mientras que el método &lt;span style="font-weight: bold;"&gt;setup()&lt;/span&gt; se encarga de inicializar variables de estado que pueda usar un agente.&lt;br /&gt;&lt;br /&gt;Con esto, y sabiendo que un agente se comporta como un &lt;span style="font-weight: bold;"&gt;Thread &lt;/span&gt;- siempre está ahí hasta que lo matas o muere por algún fallo - el estilo de programación cambia bastante. De usar simples clases controladoras, por las que pueda pasar el flujo importante de una aplicación y se ejecutan de manera secuencial, podemos tener varios objetos &lt;span style="font-style: italic;"&gt;Agent &lt;/span&gt;y ejerciendo el control de la aplicación o código servidor o como gusten. Pasamos a desarrollar una &lt;span style="font-weight: bold;"&gt;POA&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;rogramación &lt;span style="font-weight: bold;"&gt;O&lt;/span&gt;rientada a &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;gentes.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-9107663776245389848?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/9107663776245389848/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=9107663776245389848' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/9107663776245389848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/9107663776245389848'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/pfc-poa.html' title='PFC: POA'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-2583903904771256592</id><published>2007-10-16T05:36:00.000-07:00</published><updated>2007-10-16T11:58:36.549-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyecto'/><category scheme='http://www.blogger.com/atom/ns#' term='carrera'/><title type='text'>primer objetivo: PFC</title><content type='html'>&lt;div style="text-align: justify;"&gt;Empiezo una serie de breves artículos/escritos acerca de mi &lt;span style="font-weight: bold;"&gt;PFC&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;royecto &lt;span style="font-weight: bold;"&gt;F&lt;/span&gt;in de &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;arrera).&lt;br /&gt;Para los que leáis &lt;a href="http://noalarutina.blogspot.com/"&gt;mis delirios psicológicos&lt;/a&gt;, el viaje que ahí describo se basa en el transcurso de mi vida diaria desde el punto de vista de este proyecto.&lt;br /&gt;&lt;br /&gt;Toca investigar y desarrollar la parte con más chicha del proyecto. Y para empezar debo aprender cómo utilizar agentes software y aplicarlos en él.&lt;br /&gt;De bote pronto podría decir que, con aprender la teoría de threads, tener conocimientos en &lt;span style="font-weight: bold;"&gt;POO&lt;/span&gt; (&lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;rogramación &lt;span style="font-weight: bold;"&gt;O&lt;/span&gt;rientada a &lt;span style="font-weight: bold;"&gt;O&lt;/span&gt;bjetos) y saber utilizar el lenguaje de programación &lt;a href="http://java.sun.com/"&gt;JAVA&lt;/a&gt;, uno podría implementar su particular sistema de agentes. Pero cómo no hace falta indagar tanto en este mundillo, voy a utilizar &lt;a href="http://jade.tilab.com/"&gt;JADE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De lo que he leído hasta ahora sobre &lt;span style="font-style: italic;"&gt;JADE&lt;/span&gt;, puedo decir que el uso de agentes software se basa en &lt;a href="http://jade.tilab.com/doc/programmersguide.pdf"&gt;utilizar clases programadas en JAVA&lt;/a&gt;.&lt;br /&gt;Un agente no es más que un objeto, que lleva programado unas operaciones que ayudan a comprender, mediante su uso, el comportamiento de un agente. Ya empecé a escribir algo en la terraza de un club de programación, pero por motivos técnicos (vamos a llamarlos obras en la terraza) voy a continuar el trabajo en este cuarto de derrota, que iré llenando también de otros conceptos.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-2583903904771256592?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/2583903904771256592/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=2583903904771256592' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/2583903904771256592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/2583903904771256592'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/primer-objetivo-pfc.html' title='primer objetivo: PFC'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1508641164923412783.post-6277907261664165696</id><published>2007-10-16T04:20:00.000-07:00</published><updated>2007-10-16T05:53:29.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='porqué'/><title type='text'>sitio de trabajo</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:georgia;"&gt;Existe un espacio reservado para lo personal, &lt;a href="http://noalarutina.blogspot.com/"&gt; un camarote&lt;/a&gt; dónde hay espacio para todos los aspectos personales de uno, pensar sobre la vida en sí. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Existe otro espacio reservado para el trabajo. Espacio dónde se experimenta, se estudia, se investiga, se obtienen resultados o productos acabados. Y en todo trabajo de investigación hay una parte de estudio &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;previa&lt;/span&gt;, para adquirir conocimientos; hay una parte de desarrollo, para aplicar dichos conocimientos; y hay una parte de documentación, para reflejar qué se ha aprendido y que se ha elaborado.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Toda persona debe trabajar para vivir. El trabajo es lo que nos aporta los beneficios económicos personales que luego emplearemos en gastarlos cómo nos convenga.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Abro este blog para ir escribiendo todo aquello que voy aprendiendo relacionado con el estudio personal. Iré publicando lo que aprendo, para tener un lugar de consulta tanto para mi cómo para la persona que esté interesada.&lt;br /&gt;No sólo con ejemplos se aprende, una explicación acompañante hace mejor su lectura y entendimiento.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1508641164923412783-6277907261664165696?l=cuartoderrota.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cuartoderrota.blogspot.com/feeds/6277907261664165696/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1508641164923412783&amp;postID=6277907261664165696' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/6277907261664165696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1508641164923412783/posts/default/6277907261664165696'/><link rel='alternate' type='text/html' href='http://cuartoderrota.blogspot.com/2007/10/sitio-de-trabajo.html' title='sitio de trabajo'/><author><name>Jose</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://bp3.blogger.com/_30lqzMKbqh0/RvwFlaMUAjI/AAAAAAAAACw/IOS_EsyE9Qg/s320/avatar_blog.jpg'/></author><thr:total>0</thr:total></entry></feed>
