<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkQNR388cCp7ImA9WhRUFE0.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267</id><updated>2012-01-24T02:19:56.178-08:00</updated><category term="ensamblador" /><category term="Redes" /><category term="off-topics" /><category term="problemas" /><category term="MySQL" /><category term="Internet" /><category term="software libre" /><category term="DSP" /><category term="C/C++" /><category term="Modelación" /><category term="UML" /><category term="Ingeniería de Sistemas" /><category term="Windows" /><category term="Arquitectura Software" /><category term="Java" /><category term="Blogger" /><category term="SOA" /><category term="Dirvers" /><category term="netbeans" /><category term="Curiosidades" /><category term="Electronica" /><category term="C#" /><category term="AspectJ" /><category term="Access" /><category term="Comunicaciones" /><category term="ActiveX" /><category term="cneisi" /><category term="Linux" /><category term="Notebook" /><category term="POA" /><category term="inteligencia artificial" /><category term="Matemática" /><category term="algoritmos" /><category term="ODBC" /><category term="Patrones" /><category term="Casos de Uso" /><category term="programacion paralela" /><category term=".NET" /><category term="analisis de sistemas" /><title>&lt; BLOG.H &gt;:</title><subtitle type="html">Un blog sobre Desarrollo de Software en general y en particular, más el agregado de algunos tópicos que nada que ver pero me resultan de interés.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://includeblogh.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/fGwM" /><feedburner:info uri="blogspot/fgwm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blogspot/fGwM</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DkIDQ3s6fSp7ImA9WhdTEUg.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-5131625398859963020</id><published>2011-07-08T12:37:00.000-07:00</published><updated>2011-07-08T12:49:32.515-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-08T12:49:32.515-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="problemas" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Error: Clase No Registrada.</title><content type="html">Tenía un proyecto en .NET que en una máquina compilaba y corría sin problemas. Pero al querer pasar el proyecto a otra máquina, luego de compilar, me aparecía la siguiente excepción:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold; font-style: italic;font-size:85%;" &gt;Clase no registrada (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold; font-style: italic;font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La solución es simple: además de agregar las referencias al proyecto, debemos hacer click derecho (desde un adminsitrador de archivos) en los archivos DLLs que hemos referenciado, y luego click en "Registrar".&lt;br /&gt;&lt;br /&gt;Con eso se soluciona el problema.&lt;br /&gt;&lt;br /&gt;S2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-5131625398859963020?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/fUFAM8GECfU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/5131625398859963020/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=5131625398859963020" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/5131625398859963020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/5131625398859963020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/fUFAM8GECfU/error-clase-no-registrad.html" title="Error: Clase No Registrada." /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/07/error-clase-no-registrad.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcFSHo4eip7ImA9WhZQF0g.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-6277366543135023192</id><published>2011-04-22T17:22:00.000-07:00</published><updated>2011-04-25T10:53:39.432-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-25T10:53:39.432-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AspectJ" /><category scheme="http://www.blogger.com/atom/ns#" term="POA" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Programación Orientada a Aspectos. Implementando un Aspecto. (Parte 3)</title><content type="html">En la &lt;a href="http://includeblogh.blogspot.com/2011/04/programacion-orientada-aspectos-por-que.html"&gt;parte 2&lt;/a&gt; planteamos una situación utópica: que una clase realizara algo sin indicarle que lo hiciera. Bueno, sí, eso es utópico. Pero, podemos pensar en otra "entidad" que se encargue de realizar esa tarea (en nuestro caso es registrar un movimiento) detectando el momento preciso en el que debe realizarla. Es decir, tener "algo" que sepa cuando registrar un movimiento, pero que ese "algo" no tenga nada que ver con la clase &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt;. Ese algo, es lo que llamamos aspecto. Un aspecto, entonces, es algo que entrecruza una o más clases. Dicho de otra forma, un aspecto es un concepto que ofrece &lt;span style="font-weight: bold;"&gt;funcionalidad transversal&lt;/span&gt; a los objetos del negocio.&lt;br /&gt;&lt;br /&gt;Imaginémoslo como algo que vigila un programa a medida que este se ejecuta; y a partir de ciertas acciones que se producen en el programa, este algo realiza acciones propias de él. Llamemos a este algo "aspecto". Podemos decirle a un aspecto, que cuando se termine de ejecutar cualquier método que comience con la palabra "hacer" realice un registro de movimiento. La clase &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt; de nuestro ejemplo, no se enteraría jamás de la existencia de este aspecto, pero este aspecto está atento a las ejecuciones &lt;span style="font-style: italic;"&gt;hacerAlgo...() &lt;/span&gt;de esa clase.&lt;br /&gt;&lt;br /&gt;Vamos a definir rápidamente este aspecto para poder visualizar mejor lo que estamos tratando de decir. Para poder escribir un aspecto y compilar el programa con este aspecto, es necesario tener instalado el plugin de AspectJ en el editor de Java que estemos usando, o poder compilar configurando el editor. Bueno, pasemos a definir el aspecto de una vez. Agregamos un nuevo archivo con extensión .aj (por "&lt;span style="font-style: italic;"&gt;AspectJ&lt;/span&gt;") al proyecto:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public aspect RegistroDeMovimientos {&lt;br /&gt;&lt;br /&gt;   after():execution (public * hacer*(..)) {&lt;br /&gt;       Date hora = new Date();           &lt;br /&gt;       SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss");&lt;br /&gt;       System.out.println("Movimiento realizado a las " + formatoDeFecha.format(hora)) ;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Observemos este código. Lo primero que vemos, es la declaración del aspecto bajo el nombre de &lt;span style="font-style: italic;"&gt;RegistroDeMovimientos&lt;/span&gt;. Por ende, al igual que las clases de Java, el archivo del aspecto debe llamarse &lt;span style="font-style: italic;"&gt;RegistroDeMovimientos.aj&lt;/span&gt;. Si seguimos vemos la linea que dice:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;after():execution (public * hacer*(..)) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta línea es clave para definir unos conceptos que explicaré más adelante. Pero por el momento, analizaremos de manera simple qué significa. Si tuviera que decirlo en lenguaje informal, la describiría asi: "&lt;span style="font-style: italic;"&gt;Después de la ejecución de cualquier método público, sin importar el tipo que retorne, que comience con hacer, y sin importar la cantidad y tipo de parámetros que requiera, hacer lo siguiente:&lt;/span&gt;". Eso significaría mas o menos. Ahora examinemos lo que significa cada parte:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;after()&lt;/span&gt;: Esto indica que el cuerpo se ejecutará después de algo. Ahora veamos ese algo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;execution ( )&lt;/span&gt;: esto significa que se toma como referencia una ejecución de lo que sigue:&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;public * hacer*(..)&lt;/span&gt;: &lt;span style="font-style: italic;"&gt;public&lt;/span&gt; nos indica que se buscará un método público cualquiera. El asterisco que sigue, indica que ademas no importa el tipo que retorna el método. &lt;span style="font-style: italic;"&gt;hacer*&lt;/span&gt; significa que el nombre del método debe comenzar con la palabra "&lt;span style="font-style: italic;"&gt;hacer&lt;/span&gt;" y no importa cómo termine (para eso está el asterisco luego de "hacer"). Y finalmente, los dos puntos entre paréntesis significa que no importa ni el tipo ni la cantidad de parámetros del método. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Entonces, revisemos la descripción informal del método: "&lt;span style="font-style: italic;"&gt;Después dela ejecución de cualquier método que sea público, que retorne cualquier tipo de dato, que comience con "hacer" y sin importar el tipo y cantidad de parámetros&lt;/span&gt;", se debe ejecutar lo que se indica en el cuerpo. El cuerpo es muy simple: no es mas que aquello que hacía el método &lt;span style="font-style: italic;"&gt;RegistrarMovimiento()&lt;/span&gt; que hicimos antes. Esto es un aspecto. Simple, ¿no? El aspecto, se encargará de ejecutar ese cuerpo de código cada vez que ocurra esa descripción informal.&lt;br /&gt;&lt;br /&gt;Con esto, hemos solucionado el problema del apartado anterior. ¿Por qué? Porque hemos logrado aislar el comportamiento de registrar un movimiento, de forma tal que la clase &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt; no conoce de su existencia. Por lo tanto, no hemos tenido que repetir ningún código dentro de la clase, y además, al aislar ese comportamiento en un sólo aspecto, este se hace más fácilmente mantenible, ya que si queremos modificar la forma en que se registran los movimientos sólo debemos modificar el cuerpo de ejecución del aspecto, y no preocuparnos por las clases del negocio.&lt;br /&gt;&lt;br /&gt;Por supuesto, para compilar aspectos, no podemos usar el compilador de java, para eso usamos el compilador &lt;span style="font-style: italic;"&gt;AspectJ&lt;/span&gt; que lo que hace es armar un código complementando el código base con el código de aspectos. Una vez que esta herramienta genera el código final, ahí si se puede correr sobre la máquina virtual de java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-6277366543135023192?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/5um-zKXojkw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/6277366543135023192/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=6277366543135023192" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6277366543135023192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6277366543135023192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/5um-zKXojkw/programacion-orientada-aspectos.html" title="Programación Orientada a Aspectos. Implementando un Aspecto. (Parte 3)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>2</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/programacion-orientada-aspectos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMMRX05eyp7ImA9WhZQE00.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-6420864164875244008</id><published>2011-04-20T06:28:00.000-07:00</published><updated>2011-04-20T06:34:44.323-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-20T06:34:44.323-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AspectJ" /><category scheme="http://www.blogger.com/atom/ns#" term="POA" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Programación Orientada a Aspectos. ¿Por qué usar POA? (Parte 2)</title><content type="html">En la &lt;a href="http://includeblogh.blogspot.com/2011/04/programacion-orientada-aspectos-que-es.html"&gt;parte 1&lt;/a&gt;, di una introducción a lo que es la programación orientada a aspectos de una forma bastante teórica. En esta segunda parte, voy a mostrar un ejemplo práctico muy simplificado para poder asentar un poco más el concepto. Para el ejemplo utilicé el lenguaje Java, y la extensión del lenguaje Java que implementa aspectos AspectJ. Ya he contado &lt;a href="http://includeblogh.blogspot.com/2011/04/instalar-aspectj-en-netbeans-691.html"&gt;como compilar con AspectJ en NetBeans&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bueno, ¿en qué consiste la POA? Voy a poner un ejemplo muy fácil que ilustra el potencial que nos ofrece la POA Supongamos una aplicación de transacciones bancarias. (Este es el típico ejemplo que se menciona en todos lados, y lo voy a poner en mi versión porque es muy ilustrativo).&lt;br /&gt;&lt;br /&gt;Vamos a tener una clase cuyo nombre es &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt; y es una versión muy simplificada de una cuenta de un banco. Esta clase, tiene un atributo llamado &lt;span style="font-style: italic;"&gt;saldo&lt;/span&gt; de tipo &lt;span style="font-style: italic;"&gt;Double&lt;/span&gt; que indica el saldo en la cuenta. Y vamos a tener tres métodos: Uno que llamado &lt;span style="font-style: italic;"&gt;hacerDeposito()&lt;/span&gt; con un único parámetro de tipo &lt;span style="font-style: italic;"&gt;Double&lt;/span&gt; que indica la cantidad a depositar en la cuenta. Otro llamado &lt;span style="font-style: italic;"&gt;hacerExtraccion()&lt;/span&gt; que cuenta con un solo parámetro que indica la cantidad de dinero que se quiere extraer de la cuenta. El método restante se llama &lt;span style="font-style: italic;"&gt;hacerTransferencia()&lt;/span&gt; y tiene dos parámetros: uno indica la cantidad de dinero y el otro es la cuenta a la que se quiere hacer la transferencia. Además tendremos una típica -y muy simplificada- clase que representa un cliente del supuesto "banco" llamada &lt;span style="font-style: italic;"&gt;Cliente&lt;/span&gt;. Para seguir simplificando (cosa que se me está haciendo mala costumbre ya) un cliente sólo puede tener una cuenta. Ilustremos con UML:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.conocimiento-libre.org/wiki/images/1/16/Poa_diagrama_clases_1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 573px; height: 145px;" src="http://www.conocimiento-libre.org/wiki/images/1/16/Poa_diagrama_clases_1.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A continuación, les muestro un ejemplo en java bien simple. Lo que haré en el método &lt;span style="font-style: italic;"&gt;Main()&lt;/span&gt; será crear dos clientes (Pepe y Juan) y crear una cuenta para cada uno. Después, le asignaré a Pepe una cuenta y a Juan la otra. Finalmente, haré una extracción de la cuenta de Pepe; y -felizmente para Juan- terminaré con una transferencia de dinero de la cuenta de Pepe a la de Juan. Aunque lo que realiza el método &lt;span style="font-style: italic;"&gt;Main()&lt;/span&gt;, por el momento no nos interesa. Veamos el código de ambas clases (sin los &lt;span style="font-style: italic;"&gt;getter&lt;/span&gt; y los &lt;span style="font-style: italic;"&gt;setters&lt;/span&gt; porque son muy triviales).&lt;br /&gt;&lt;br /&gt;Veamos la definición de los métodos &lt;span style="font-style: italic;"&gt;hacer...()&lt;/span&gt;  de la clase &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public void hacerDeposito(Double cantidad) {&lt;br /&gt; if(cantidad &amp;lt;= 0) {&lt;br /&gt;     System.out.println("No hay dinero suficiente para hacer el depósito");&lt;br /&gt; }&lt;br /&gt; else {         &lt;br /&gt;     Date hora = new Date();         &lt;br /&gt;     SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss");         &lt;br /&gt;     //Realizamos el depósito&lt;br /&gt;     this.saldo += cantidad;         &lt;br /&gt;     //Registramos el movmiento&lt;br /&gt;     System.out.println("Movimiento realizado a las " + formatoDeFecha.format(hora)) ;         &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void hacerTransferencia(Double cantidad, Cuenta cuentaDestino)&lt;br /&gt;{&lt;br /&gt; if(this.saldo &amp;lt; cantidad) {&lt;br /&gt;     System.out.println("No hay fondos suficientes para la transferencia.");         &lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;     Date hora = new Date();         &lt;br /&gt;     SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss");        &lt;br /&gt;     cuentaDestino.hacerDeposito(cantidad);&lt;br /&gt;     this.saldo -= cantidad;&lt;br /&gt;     //Registramos el movmiento&lt;br /&gt;     System.out.println("Movimiento realizado a las " + formatoDeFecha.format(hora)) ;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void hacerExtraccion(Double cantidad) {&lt;br /&gt;&lt;br /&gt; if(this.saldo &amp;lt; cantidad) {&lt;br /&gt;     System.out.println("No hay fondos suficientes para la extracción.");         &lt;br /&gt; }&lt;br /&gt; else {         &lt;br /&gt;     Date hora = new Date();         &lt;br /&gt;     SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss");         &lt;br /&gt;     //Extraemos la cantidad del saldode la cuenta.&lt;br /&gt;     this.saldo -= cantidad;         &lt;br /&gt;     //Registramos el movmiento&lt;br /&gt;     System.out.println("Movimiento realizado a las " + formatoDeFecha.format(hora)) ;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Examinemos un poco el código: en todos métodos comenzamos con una verificación de la cantidad que se quiere extraer, depositar o transferir. Esta verificación es necesaria, ya que ciertamente sería un error, por ejemplo, depositar una cantidad negativa de dinero de una cuenta; también sería un error permitir una extracción de más cantidad de dinero de la que se dispone. Estas situaciones deben evitarse si o si.&lt;br /&gt;&lt;br /&gt;Por otra parte, vemos que una vez que se comprueban las cantidades y que esta todo bien, se procede a realizar el deposito o la extracción o la transferencia (según sea el caso). Pero para esto, he supuesto (a modo de regla de negocio) que el banco necesita tener un registro (&lt;span style="font-style: italic;"&gt;logging&lt;/span&gt;) de cada movimiento realizado en cada cuenta. Por eso es que creé una variable llamada hora y la mostré en pantalla. Lo más común no es mostrarlo en pantalla sino almacenarlo en un archivo de logs, pero lo hice así por practicidad.&lt;br /&gt;&lt;br /&gt;Lo interesante, curioso, y que tenemos que tener en cuenta de estos métodos, es que los tres repiten el proceso de registrar un movimiento. Y no solo eso, sino que además se hace en los tres métodos de la misma forma! Lo cual es una muy mala práctica. Nunca debería repetirse código, eso lo sabemos bien. Entonces, he aquí un problema. ¿Cómo lo solucionamos?...&lt;br /&gt;&lt;br /&gt;Algún iluminado podría indicar hacer lo siguiente: Creamos un cuarto método dentro de la clase al que podríamos llamar &lt;span style="font-style: italic;"&gt;registrarMovimiento()&lt;/span&gt;. Este método se encargaría sólo de la parte del registro del movimiento; y cada uno de los anteriores tres métodos lo llama cuando ha concluido un movimiento. Genial. Veamos cómo quedaría &lt;span style="font-style: italic;"&gt;registrarMovimiento()&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;private void registrarMovimiento()&lt;br /&gt;{&lt;br /&gt; Date hora = new Date();         &lt;br /&gt; SimpleDateFormat formatoDeFecha = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss");         &lt;br /&gt; System.out.println("Movimiento realizado a las " + formatoDeFecha.format(hora)) ;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y ahora, el código de los otros tres métodos se modifica para llamar a &lt;span style="font-style: italic;"&gt;registrarMovimiento()&lt;/span&gt; quedando así (sólo mostramos dos, pero el tercero seguiría la misma lógica que éstos):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public void hacerTransferencia(Double cantidad, Cuenta cuentaDestino)&lt;br /&gt;{&lt;br /&gt; if(this.saldo &amp;lt; cantidad) {&lt;br /&gt;     System.out.println("No hay fondos suficientes para la transferencia.");         &lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;     cuentaDestino.hacerDeposito(cantidad);&lt;br /&gt;     this.saldo -= cantidad;&lt;br /&gt;     //Registramos el movmiento&lt;br /&gt;     registrarMovimiento();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void hacerExtraccion(Double cantidad) {&lt;br /&gt;&lt;br /&gt; if(this.saldo &amp;lt; cantidad) {&lt;br /&gt;     System.out.println("No hay fondos suficientes para la extracción.");         &lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;     //Extraemos la cantidad del saldode la cuenta.&lt;br /&gt;     this.saldo -= cantidad;         &lt;br /&gt;     //Registramos el movmiento&lt;br /&gt;     registrarMovimiento();         &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Pero lo malo de esta solución, es que si se efectuara otro movimiento que no fuera "dentro" de la clase &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt; sino "dentro" de otra clase, esta clase tendría que tener su propio método &lt;span style="font-style: italic;"&gt;registrarMovimiento()&lt;/span&gt;, y nuevamente estaríamos repitiendo código, pero entre clases. Ante este nuevo problema, podemos proponer otra solución: creamos una clase que se encargue específicamente de registrar movimientos; y cualquier método de cualquier clase puede instanciarla y llamar al método que registra movimientos. Podríamos, por ejemplo, crear una clase llamada &lt;span style="font-style: italic;"&gt;RegistroDeMovimientos&lt;/span&gt; con un método público llamado &lt;span style="font-style: italic;"&gt;registrarMovimiento()&lt;/span&gt;. Parece que esta es la mejor solución. Sin embargo no es así. Sigue habiendo "algo malo". ¿Qué es?...&lt;br /&gt;&lt;br /&gt;Está claro: aunque tengamos una clase aparte que registre los movimientos, cada clase debe instanciar y llamar al método de esa clase. Es decir, seguimos repitiendo código. Cada método que deba registrar un movimiento, debe repetir el mismo código que los otros métodos que también deban registrar un movimiento. ¡Que feo! ¡Y no solo eso! Además, el hecho de registrar un movimiento -ya sea dentro del mismo método o llamando a &lt;span style="font-style: italic;"&gt;RegistroDeMovimientos.registrarMovimiento()&lt;/span&gt;- significa introducir código que no pertenece exclusivamente al movimiento. El movimiento sólo debería realizar el movimiento y nada más. El registro debería hacerse aparte, no debería ser responsabilidad de un depósito, o una extracción o una transferencia. Esta forma de registrar un movimiento, ensucia el código que se refiere a los métodos de la clase &lt;span style="font-style: italic;"&gt;Cuenta&lt;/span&gt;. Es decir, lo ideal sería que estos métodos se vieran así:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;public void hacerDeposito(Double cantidad) {&lt;br /&gt; if(cantidad &amp;lt;= 0) {&lt;br /&gt;     System.out.println("No hay dinero suficiente para hacer el depósito");&lt;br /&gt; }&lt;br /&gt; else { &lt;br /&gt;     this.saldo += cantidad;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void hacerTransferencia(Double cantidad, Cuenta cuentaDestino)&lt;br /&gt;{&lt;br /&gt; if(this.saldo &amp;lt; cantidad) {&lt;br /&gt;     System.out.println("No hay fondos suficientes para la transferencia.");         &lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;     cuentaDestino.hacerDeposito(cantidad);&lt;br /&gt;     this.saldo -= cantidad;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void hacerExtraccion(Double cantidad) {&lt;br /&gt;&lt;br /&gt; if(this.saldo &amp;lt; cantidad) {&lt;br /&gt;     System.out.println("No hay fondos suficientes para la extracción.");         &lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;     this.saldo -= cantidad;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Como dije, sería ideal que a pesar de no llamar a &lt;span style="font-style: italic;"&gt;registrarMevimiento()&lt;/span&gt;, el movimiento se registrara igual. Eso sería ideal, ¿no? No ensuciaríamos código y tampoco lo repetiríamos. La clase sería tremendamente cohesiva. Parece utópico ¿verdad? Bueno, para nuestra felicidad, esto es realizable y es acá donde entran en juego los "&lt;span style="font-style: italic;"&gt;aspectos&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;En la tercer parte, voy a mostrar cómo implementar un aspecto que solucione el problema planteado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-6420864164875244008?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/EipPl7tAaAA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/6420864164875244008/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=6420864164875244008" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6420864164875244008?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6420864164875244008?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/EipPl7tAaAA/programacion-orientada-aspectos-por-que.html" title="Programación Orientada a Aspectos. ¿Por qué usar POA? (Parte 2)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/programacion-orientada-aspectos-por-que.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UMRXs6fSp7ImA9WhZQEEU.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-1721042698877865908</id><published>2011-04-15T06:58:00.000-07:00</published><updated>2011-04-17T16:01:24.515-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-17T16:01:24.515-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AspectJ" /><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="POA" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Programación Orientada a Aspectos. ¿Qué es? (Parte 1)</title><content type="html">Para explicar la programación orientada a aspectos, quizás lo ideal sería comenzar con una breve descripción de la historia de la ingeniería de software, como lo hacen la mayoría de los artículos o PDFs que podemos encontrar en la web, pero como justamente la mayoría lo hace así, yo no. Quien quiera verlo así, busque en la web el tema y ahí van a tener mucho para leer (y no está demás). Pero yo prefiero comenzar yendo al grano.&lt;br /&gt;&lt;br /&gt;La programación orientada a objetos trata la manera de &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-0lOTe0_Gq3s/TatE1C7FCyI/AAAAAAAABIE/tpta0IRlJjo/s1600/poa2.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 153px; height: 320px;" src="http://3.bp.blogspot.com/-0lOTe0_Gq3s/TatE1C7FCyI/AAAAAAAABIE/tpta0IRlJjo/s320/poa2.JPG" alt="" id="BLOGGER_PHOTO_ID_5596642640046394146" border="0" /&gt;&lt;/a&gt;modularizar "conceptos comunes" de software. Sin embargo, existen otros conceptos o asuntos que se extienden a lo largo de estos "conceptos comunes" y que no pueden ser modularizados con el diseño orientado a objetos. En un intento más de subsanar lo que la orientación a objetos no puede, aparece una nueva solución: la Programación Orientada a Aspectos (y su consecuente Diseño Orientado a Aspectos).&lt;br /&gt;&lt;br /&gt;La programación orientada a aspectos se ha planteado como un nuevo paradigma de programación (con lo que no estoy de acuerdo), el cual consiste en separar los conceptos que entrecruzan varias clases y se extienden a lo largo de éstas, pero que no pertenecen a esas clase en sí mismas. Incluso, los conceptos pueden aparecer no sólo en varias clases, sino de una sola. Ahora la pregunta: ¿de qué tipo de conceptos hablamos? Pensemos como ejemplo, en una aplicación que requiere del registro (logging) de las acciones que realiza. Bien, estos registros "alguien" tiene que llevarlos a cabo, y es normal cargar a muchas clases con la responsabilidad de hacerlo cuando, seguramente, no sea la función principal de esas clases hacer dicha tarea. Como vemos, se trata de una misma funcionalidad (registrar acciones) que se encuentra entrecruzada en varias clases, pero que a la vez no es parte de ninguna.&lt;br /&gt;&lt;br /&gt;Otro ejemplo, simple de entender, es el manejo de errores. Los errores hay que tratarlos sí o si en una aplicación. Pero, desde un punto de vista "purista" de objetos, no tenemos clases que traten los errores por sí solos. Siempre las clases que definen la funcionalidad de la aplicación van a tener que lidiar con los errores, y esa no es su función principal. En cierta forma, esto hace a dichas clases menos cohesivas. Un tercer ejemplo puede ser el manejo de la sincronización. Nuevamente, los objetos del negocio deben tratar la sincronización además de su función principal.&lt;br /&gt;&lt;br /&gt;En todo los ejemplos estam&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-KPr3lQ2BMgE/TatFHX8DzbI/AAAAAAAABIM/wFV0h4M1gbY/s1600/poa3.JPG"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 311px; height: 205px;" src="http://2.bp.blogspot.com/-KPr3lQ2BMgE/TatFHX8DzbI/AAAAAAAABIM/wFV0h4M1gbY/s400/poa3.JPG" alt="" id="BLOGGER_PHOTO_ID_5596642954925297074" border="0" /&gt;&lt;/a&gt;os viendo que hay ciertos asuntos que no pertenecen al negocio pero que sin embargo, deben ser tratados. Y lo negativo de esto, es que según el paradigma de objetos, son los objetos del negocio quienes deben tratar estos asuntos y, como si fura poco que hagan tareas que no les corresponden, estas tareas se esparcen a lo largo de toda la aplicación, llevando a dispersar código y enredarlo por la misma (a esto último se llama Code Tangling y Code Scattering).&lt;br /&gt;&lt;br /&gt;Entonces, para darle más sentido a la POA, veamos en qué se afecta el desarrollo de aplicaciones cuando surgen estos asuntos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Baja cohesión&lt;/span&gt;: las clases realizan tareas que no le corresponden específicamente a ellas.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Baja reusabilidad&lt;/span&gt;: Cuando una clase trata un asunto que no le corresponde, esta clase probablemente sea difícil de re usar en otro sistema.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Peor calidad de código&lt;/span&gt;: El código se complica, y cuesta más entenderlo y mantenerlo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Evolución dificultosa&lt;/span&gt;: Se vuelve más costoso que el sistema evoluciones al tener código disperso y enredado por toda la aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Estos asuntos son denominados "conceptos transversales". La POA viene para tratar de separar y encapsularlos en una aplicación y aislarlos para independizar a los objetos del negocio de éstos conceptos. Este aislamiento se encapsula en "aspectos".&lt;br /&gt;&lt;br /&gt;Por lo tanto, la POA permite la separación de conceptos transversales a través de mecanismos que permiten abstraer y encapsular estos conceptos en un sistema. Un &lt;span style="font-weight: bold;"&gt;aspecto&lt;/span&gt; es la unidad que encapsula uno o más conceptos transversales, y que con la programación orientada a objetos no es posible diferenciarlo de forma clara.&lt;br /&gt;&lt;br /&gt;La definición actual de &lt;span style="font-weight: bold;"&gt;aspecto&lt;/span&gt; dice: "&lt;span style="font-style: italic;"&gt;Un aspecto es una unidad modular que se disemina por la estructura de otras unidades funcionales. Los aspectos existen tanto en la etapa de diseño como en la de implementación. Un aspecto de diseño es una unidad modular del diseño que se entremezcla en la estructura de otras partes del diseño. Un aspecto de programa o de código es una unidad modular del programa que aparece en otras unidades modulares del programa.&lt;/span&gt;”&lt;br /&gt;&lt;br /&gt;La principal ventaja de la POA es que permite tratar la funcionalidad pura por un lado, y los aspectos por otro, de forma separada. Luego ambos se combinan  con un tipo de programa llamado '&lt;span style="font-style: italic;"&gt;Weaver&lt;/span&gt;') para dar por resultado el sistema final.&lt;br /&gt;&lt;br /&gt;Hay mucho más por hablar de POA aún. En la próxima parte (parte 2), voy a mostrar un ejemplo muy claro, para asentar toda esta teoría en algo más palpable, así que a no abandonar si esta pequeña introducción a resultado medio difícil de entender, en el ejemplo de la Parte 2 quedará muy claro de que se trata.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-1721042698877865908?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/oD5w7CnBC6I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/1721042698877865908/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=1721042698877865908" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/1721042698877865908?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/1721042698877865908?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/oD5w7CnBC6I/programacion-orientada-aspectos-que-es.html" title="Programación Orientada a Aspectos. ¿Qué es? (Parte 1)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-0lOTe0_Gq3s/TatE1C7FCyI/AAAAAAAABIE/tpta0IRlJjo/s72-c/poa2.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/programacion-orientada-aspectos-que-es.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUFRn4_fCp7ImA9WhZRFkk.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-4652212665724952001</id><published>2011-04-12T14:13:00.000-07:00</published><updated>2011-04-12T14:20:17.044-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-12T14:20:17.044-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="problemas" /><category scheme="http://www.blogger.com/atom/ns#" term="AspectJ" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Instalar AspectJ en NetBeans 6.9.1</title><content type="html">&lt;a href="http://includeblogh.blogspot.com/2011/04/install-aspectj-in-netbeans-691.html"&gt;English version&lt;/a&gt;&lt;br&gt;&lt;br /&gt;Hola. Finalmene, después de horas de intentos, logré copilar AspectJ en NetBeans 6.9.1.&lt;br /&gt;Ahora les muestro la forma de hacerlo. Pero quiero aclarar que no voy a instalar un plug-in de netbeans, sino que voy a mostrar la forma de compilar aspectos en netbeans con AspectJ. Veamos los pasos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1)&lt;/span&gt; Descargar la última versión estable de AspectJ &lt;a href="http://www.eclipse.org/aspectj/downloads.php"&gt;en este sitio&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2)&lt;/span&gt; Descomprimir el archivo ".jar" en algún directorio donde pongan librerías. No debería ser en el directorio de librerías del proyecto, ya que quizás quieras usar esta librería en otros proyectos.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3)&lt;/span&gt; Crear un proyecto en netbeans, basta con un simple "Java Project".&lt;br /&gt;&lt;br /&gt;Ahora, los próximos pasos deben seguirlos en cada nuevo proyecto que hagan:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4)&lt;/span&gt; Ir a las propiedades del proyecto, y en el panel de "librerias", seleccionar "Add Jar/Folder". Ahora, seleccionar los siguientes archivos del archivo descomprimido:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;aspectjrt.jar&lt;/li&gt;&lt;li&gt;aspectjtools.jar&lt;/li&gt;&lt;li&gt;org.aspectj.matcher.jar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5)&lt;/span&gt;Una vez que se agregaron estos archivos, hay que editar el archivo &lt;span style="font-style: italic;"&gt;build.xml&lt;/span&gt; creado en el directorio del proyecto.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6)&lt;/span&gt; Entre los tags &lt;span style="font-style: italic;"&gt;&amp;lt;project&amp;gt;&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt; pegar el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;taskdef classpath="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjtools.jar"&lt;br /&gt;     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="aspectj"&amp;gt;&lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- aspectj (start) ---&amp;lt;/echo&amp;gt;  &lt;br /&gt;  &amp;lt;iajc destDir="${build.classes.dir}"&amp;gt;&lt;br /&gt;      &amp;lt;inpath&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjrt.jar"/&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="${build.classes.dir}" /&amp;gt;&lt;br /&gt;      &amp;lt;/inpath&amp;gt;&lt;br /&gt; &amp;lt;sourceroots&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${src.dir}"/&amp;gt;&lt;br /&gt; &amp;lt;/sourceroots&amp;gt;&lt;br /&gt; &amp;lt;classpath&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${javac.classpath}"/&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${j2ee.platform.classpath}"/&amp;gt;&lt;br /&gt; &amp;lt;/classpath&amp;gt;&lt;br /&gt;  &amp;lt;/iajc&amp;gt; &lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- build.xml by Ignacio Rigoni email: {name}.{lastname}@gmail.com ---&amp;lt;/echo&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="-post-compile" depends="aspectj"&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De forma tal que el archivo build.xml les quede así:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;project name="pruebaAspectJ_nb6.9.1" default="default" basedir="."&amp;gt;&lt;br /&gt;    &amp;lt;description&amp;gt;Builds, tests, and runs the project pruebaAspectJ_nb6.9.1.&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;import file="nbproject/build-impl.xml"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;taskdef classpath="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjtools.jar"&lt;br /&gt;     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="aspectj"&amp;gt;&lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- aspectj (start) ---&amp;lt;/echo&amp;gt;  &lt;br /&gt;  &amp;lt;iajc destDir="${build.classes.dir}"&amp;gt;&lt;br /&gt;      &amp;lt;inpath&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjrt.jar"/&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="${build.classes.dir}" /&amp;gt;&lt;br /&gt;      &amp;lt;/inpath&amp;gt;&lt;br /&gt; &amp;lt;sourceroots&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${src.dir}"/&amp;gt;&lt;br /&gt; &amp;lt;/sourceroots&amp;gt;&lt;br /&gt; &amp;lt;classpath&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${javac.classpath}"/&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${j2ee.platform.classpath}"/&amp;gt;&lt;br /&gt; &amp;lt;/classpath&amp;gt;&lt;br /&gt;  &amp;lt;/iajc&amp;gt; &lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- build.xml by Ignacio Rigoni email: {name}.{lastname}@gmail.com ---&amp;lt;/echo&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="-post-compile" depends="aspectj"&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7)&lt;/span&gt; Ahora, modificar las lineas 7 y 14. En la línea 7 hay que especificar la ruta completa del archivo "&lt;span style="font-style: italic;"&gt;aspectjtools&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;jar&lt;/span&gt;". Esto se hace donde descomprimiste aspectj. En la línea 14 hay que hacer lo mismo, pero apuntando al archivo "&lt;span style="font-style: italic;"&gt;aspectjrt&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;jar&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8)&lt;/span&gt; Eso es todo!&lt;br /&gt;&lt;br /&gt;Consideraciones&lt;br /&gt;&lt;br /&gt;1) Bajar el archivo &lt;span style="font-style: italic;"&gt;aspect{version}.jar&lt;/span&gt;, no el archivo &lt;span style="font-style: italic;"&gt;aspectj{version}-src.jar&lt;/span&gt;.&lt;br /&gt;2) Tener cuidado con las rutas de los archivos, siempre causan problemas!&lt;br /&gt;3) No estoy seguro, pero es posible que las otras lineas que agregaron en &lt;span style="font-style: italic;"&gt;build.xml&lt;/span&gt; tengan errores. A mi me funcionaron bien, pero puede que esto dependa del proyecto creado, así que si esto les causa problemas, hay que chequear los directorios a los que apunta el resto del archivo, y otras causas posibles de errores.&lt;br /&gt;&lt;br /&gt;Espero que esto te ayude. Vuelvan a comentar si anduvo y/o si tienen sugerencias que crean que puede mejorar esto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-4652212665724952001?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/sveBWybHe0I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/4652212665724952001/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=4652212665724952001" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4652212665724952001?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4652212665724952001?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/sveBWybHe0I/instalar-aspectj-en-netbeans-691.html" title="Instalar AspectJ en NetBeans 6.9.1" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/instalar-aspectj-en-netbeans-691.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUCRX84cSp7ImA9WhZRFkk.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-8541373239000338898</id><published>2011-04-11T23:15:00.000-07:00</published><updated>2011-04-12T14:21:04.139-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-12T14:21:04.139-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="problemas" /><category scheme="http://www.blogger.com/atom/ns#" term="AspectJ" /><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="netbeans" /><title>Install AspectJ in NetBeans 6.9.1</title><content type="html">&lt;a href="http://includeblogh.blogspot.com/2011/04/instalar-aspectj-en-netbeans-691.html"&gt;Versión en español&lt;/a&gt;&lt;br&gt;&lt;br /&gt;Hi. First, sorry my English, it's not my native languaje.&lt;br /&gt;Second, after hours trying, I managed to compile with AspectJ in NetBeans 6.9.1&lt;br /&gt;Now I'll show the way to make it possible. But I want to clarify that I wont install a NetBeans's plugin, but it is the way to make it possible to compile aspects in netbeans with AspectJ. Now, let's go on the steps:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1)&lt;/span&gt; Download the AspectJ Latest Stable Release, &lt;a href="http://www.eclipse.org/aspectj/downloads.php"&gt;on this page&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2)&lt;/span&gt; Unzip de "&lt;span style="font-weight: bold; font-style: italic;"&gt;.jar&lt;/span&gt;" file in the directory you like to put your libraries. It should not be in the proyect's lib directory, because you may want to use it in other projects too. You will unzip about 4 "&lt;span style="font-style: italic;"&gt;.jar&lt;/span&gt;" files.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3)&lt;/span&gt; Create a project in netbeans, just a simple "&lt;span style="font-style: italic;"&gt;Java Project&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Now listen, you have to follow the next steps in every new project you make:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4)&lt;/span&gt; Go to the project's propierties and in the libraries panel, select the "&lt;span style="font-style: italic;"&gt;Add Jar/Folder&lt;/span&gt;". Now, select this files from the unzipped file:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;aspectjrt.jar&lt;/li&gt;&lt;li&gt;aspectjtools.jar&lt;/li&gt;&lt;li&gt;org.aspectj.matcher.jar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5)&lt;/span&gt; Once this files were added, you must edit the&lt;span style="font-weight: bold; font-style: italic;"&gt; build.xml&lt;/span&gt; file created inside you project directory.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6)&lt;/span&gt; Between the tags &lt;span style="font-style: italic;"&gt;&amp;lt;project&amp;gt;&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt; paste this code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;taskdef classpath="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjtools.jar"&lt;br /&gt;     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="aspectj"&amp;gt;&lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- aspectj (start) ---&amp;lt;/echo&amp;gt;  &lt;br /&gt;  &amp;lt;iajc destDir="${build.classes.dir}"&amp;gt;&lt;br /&gt;      &amp;lt;inpath&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjrt.jar"/&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="${build.classes.dir}" /&amp;gt;&lt;br /&gt;      &amp;lt;/inpath&amp;gt;&lt;br /&gt; &amp;lt;sourceroots&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${src.dir}"/&amp;gt;&lt;br /&gt; &amp;lt;/sourceroots&amp;gt;&lt;br /&gt; &amp;lt;classpath&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${javac.classpath}"/&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${j2ee.platform.classpath}"/&amp;gt;&lt;br /&gt; &amp;lt;/classpath&amp;gt;&lt;br /&gt;  &amp;lt;/iajc&amp;gt; &lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- build.xml by Ignacio Rigoni email: {name}.{lastname}@gmail.com ---&amp;lt;/echo&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="-post-compile" depends="aspectj"&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So the complete build.xml file can be like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;project name="pruebaAspectJ_nb6.9.1" default="default" basedir="."&amp;gt;&lt;br /&gt;    &amp;lt;description&amp;gt;Builds, tests, and runs the project pruebaAspectJ_nb6.9.1.&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;import file="nbproject/build-impl.xml"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;taskdef classpath="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjtools.jar"&lt;br /&gt;     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="aspectj"&amp;gt;&lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- aspectj (start) ---&amp;lt;/echo&amp;gt;  &lt;br /&gt;  &amp;lt;iajc destDir="${build.classes.dir}"&amp;gt;&lt;br /&gt;      &amp;lt;inpath&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="/home/ignacio/NetBeansProjects/lib/aspectj/aspectjrt.jar"/&amp;gt;&lt;br /&gt;        &amp;lt;pathelement location="${build.classes.dir}" /&amp;gt;&lt;br /&gt;      &amp;lt;/inpath&amp;gt;&lt;br /&gt; &amp;lt;sourceroots&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${src.dir}"/&amp;gt;&lt;br /&gt; &amp;lt;/sourceroots&amp;gt;&lt;br /&gt; &amp;lt;classpath&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${javac.classpath}"/&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${j2ee.platform.classpath}"/&amp;gt;&lt;br /&gt; &amp;lt;/classpath&amp;gt;&lt;br /&gt;  &amp;lt;/iajc&amp;gt; &lt;br /&gt;  &amp;lt;echo level="info"&amp;gt;--- build.xml by Ignacio Rigoni email: {name}.{lastname}@gmail.com ---&amp;lt;/echo&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="-post-compile" depends="aspectj"&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7)&lt;/span&gt; Now, modify the lines 7 and 14. In line 7 you must specify the "&lt;span style="font-style: italic;"&gt;aspectjtools.jar&lt;/span&gt;" with the full path. This is where you unzipped aspectj. In line 14 you must do the same, but pointing to the "&lt;span style="font-style: italic;"&gt;aspectjrt.jar&lt;/span&gt;" file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8)&lt;/span&gt; That's all.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Considerations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1)&lt;/span&gt; Use the &lt;span style="font-style: italic;"&gt;aspect{version}.jar&lt;/span&gt; file, no the &lt;span style="font-style: italic;"&gt;aspectj{version}-src.jar&lt;/span&gt; file.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2)&lt;/span&gt; Be careful with the paths, it always cause problems!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3)&lt;/span&gt; I'm not shure, but may be possible that the other lines you added in build.xml could have errors. It worked fine for me, but may be it depends on the project, so if that causes a problem, you should check the dirs, and other possible error sources.&lt;br /&gt;&lt;br /&gt;I wish this helps you! Please, come back and comment or suggest if you think this could be improved in any way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-8541373239000338898?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/EiwZHvl9zYg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/8541373239000338898/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=8541373239000338898" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/8541373239000338898?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/8541373239000338898?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/EiwZHvl9zYg/install-aspectj-in-netbeans-691.html" title="Install AspectJ in NetBeans 6.9.1" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/install-aspectj-in-netbeans-691.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UEQnYzeyp7ImA9WhZRE0o.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-6401254068490776105</id><published>2011-04-09T11:23:00.000-07:00</published><updated>2011-04-09T11:53:23.883-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-09T11:53:23.883-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="problemas" /><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><title>Colorear código fuente en Bolgger con "Syntax HighLighter"</title><content type="html">Esto si que me costo encontrarlo, y mas aun hacerlo funcionar. ¿Por que? Porque en la mayoria de las web esta mal explicado, como en &lt;a href="http://2webfacil.com/publicar-codigo-fuente-en-blogger/"&gt;esta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Luego encontré cómo se configura blogger para que realmente funcione esto: es muy facil. Lo pasos son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1º) Modificamos la plantilla de Blogger.&lt;/span&gt;&lt;br /&gt;Para esto vamos a Diseño -&amp;gt; Edición de HTML. Ahi buscamos la etiqueta &amp;lt;/head&amp;gt;. Y justo una linea encima de esta agregamos el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;!--SYNTAX HIGHLIGHTER BEGINS--&amp;gt;&lt;br /&gt;&amp;lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/&amp;gt;&lt;br /&gt;&amp;lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language='javascript'&amp;gt;&lt;br /&gt;SyntaxHighlighter.config.bloggerMode = true;&lt;br /&gt;SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';&lt;br /&gt;SyntaxHighlighter.all();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;!--SYNTAX HIGHLIGHTER ENDS--&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2º) Verificar si todo anduvo bien haciendo click en "Ver Blog"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3º) Agregar el código fuente que quieras.&lt;/span&gt;&lt;br /&gt;Para esto, cuando estamos editando una entrada, tenemos que hacer click en la pestaña que dice "Edicion de HTML" y ahi agregar las siguientes líneas:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;pre class="brush:java"&amp;gt;&lt;br /&gt;Aca va tu codigo en java&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Donde dice &lt;span style="font-style: italic;"&gt;java&lt;/span&gt;, ponen el lenguaje que esten usando. Para ver una lista de lenguajes disponibles y como se nombran, vean este &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por ultimo, me gustaria recalcar algo. Conviene formatear el codigo fuente, al final de la edición del post, ya que si se hace cambiando el tipo de edición (de "Edicion de HTML" a "Redactar") se pierde el formato de saltos de lineas y espaciados del codigo fuente. Por lo tanto, recomiendo escribir el post completo, y al final poner todo el código fuente que se quiera.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-6401254068490776105?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/bLCS-zZyl9o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/6401254068490776105/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=6401254068490776105" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6401254068490776105?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6401254068490776105?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/bLCS-zZyl9o/colorear-codigo-fuente-en-bolgger-con.html" title="Colorear código fuente en Bolgger con &quot;Syntax HighLighter&quot;" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>3</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/colorear-codigo-fuente-en-bolgger-con.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04AQ3o5cSp7ImA9WhZRGE0.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-4554238837929890089</id><published>2011-04-07T21:27:00.000-07:00</published><updated>2011-04-14T11:32:22.429-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T11:32:22.429-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="problemas" /><category scheme="http://www.blogger.com/atom/ns#" term="AspectJ" /><category scheme="http://www.blogger.com/atom/ns#" term="POA" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Instalar AspectJ en NetBeans</title><content type="html">&lt;p&gt;&lt;span style="color: rgb(204, 0, 0); font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;UPDATE 1&lt;/span&gt;: Para compilar AspectJ en NB 6.9.1, leer &lt;/span&gt;&lt;a style="color: rgb(204, 0, 0); font-style: italic;" href="http://includeblogh.blogspot.com/2011/04/instalar-aspectj-en-netbeans-691.html"&gt;esta entrada.&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Bueno, este es un punto que me tenía un poco molesto porque no encontraba una buena página que describiera cómo hacerlo. Resultó mucho más fácil de lo que imaginé. La instalación no es  precisamente difícil, pero creo que nunca está demás mostrar como hace,  sobre todo porque lamentablemente el plugin de AspectJ para NetBeans  dejó de desarrollarse oficialmente. &lt;a href="http://www.jroller.com/ramlog/entry/using_the_aspectj_plug_in1"&gt;Ramón Ramos&lt;/a&gt; hizo una nueva versión  compatible con está versión del IDE, y es ésta versión del plugin la que  instalaremos. Bien, vamos:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);" class=" down" style="display: block;" id="formatbar_CreateLink" title="Enlace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1º) &lt;/strong&gt;&lt;span style="font-weight: bold;"&gt;Instalar &lt;/span&gt;&lt;strong&gt;el IDE NetBeans 6.1&lt;/strong&gt;.  Probé de instalarlo en Netbeans 6.9.1 pero no me reconocía algunas  partes del plugin, y no las instalaba por un problema de versiones. Como  no soy muy ducho con esos temas, opté por directamente instalarlo en la  versión 6.1. Ahora, si alguien puede instalarlo en una versión más  reciente, que comente y lo agregamos a este pequeño tutorial.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2º) &lt;/strong&gt;&lt;strong&gt;Descargar los plugins de AspectJ&lt;/strong&gt;. Desde la misma página de NetBeans, vamos a la sección de plugins y buscamos en el catálogo todos los plugins que coincidan con "aspectj". Descargamos el más nuevo.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3º)&lt;/strong&gt; &lt;strong&gt;Agregar los plugins a NetBeans&lt;/strong&gt;.  Descomprimimos el archivo descargado del paso anterior en una carpeta  temporal. Luego vamos a NetBeans, y al menú "Herramientas |  Complementos". Allí seleccionamos la pestaña "Descargados" y agregamos  todos los archivos que salieron de la extracción del archivo comprimido.  Luego los instalamos y listo.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;En este punto ya tenemos instalado el plugin de AspectJ, es decir, ya podemos agregar aspectos a nuestros proyectos. Ahora queda un últimp paso, que es configurar el proyecto que al que queremos añadir aspectos. Esto es muy simple:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1º) &lt;span _fcktemp="1"&gt;&lt;/span&gt;Añadir la librería "AspectJ-Runtime"&lt;/strong&gt;.  Para esto vamos a las propiedades del proyecto, y en Librerías  seleccionamos la pestaña "Compilación". Le damos click a "Añadir  librería" y seleccionamos la que se llama AspectJ-Runtime.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Listo, con esto ya podemos empezar a hacer uso de los aspectos en Java bajo NetBeans. Simple, ¿no? A mi me costó al no encontrar una buena página que describiera los pasos. Al final recién di con la que mencioné al principio.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;S2!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-4554238837929890089?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/oE7eaJ4bORw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/4554238837929890089/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=4554238837929890089" title="6 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4554238837929890089?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4554238837929890089?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/oE7eaJ4bORw/instalar-aspectj-en-netbeans.html" title="Instalar AspectJ en NetBeans" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>6</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/04/instalar-aspectj-en-netbeans.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEEQXoyfSp7ImA9WhZRFEs.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-5313147623827596966</id><published>2011-01-07T10:31:00.001-08:00</published><updated>2011-04-10T13:33:20.495-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-10T13:33:20.495-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algoritmos" /><category scheme="http://www.blogger.com/atom/ns#" term="DSP" /><category scheme="http://www.blogger.com/atom/ns#" term="Electronica" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>¿Convolución? ¡Pero si es muy fácil! (Parte 3/3)</title><content type="html">&lt;span style="font-family: georgia;"&gt;Buenas. Hoy voy a terminar con la última parte que había comentado sobre el tema de convolución. Básicamente voy a presentar un pequeño código que hice en C, y que muestra dos formas de realizar la convolución. En la primera de ellas, llamada &lt;span style="font-style: italic;"&gt;(Input Side Algorithm&lt;/span&gt;) y denominada como &lt;span style="font-style: italic;"&gt;input_side_conv()&lt;/span&gt; en el código, se puede observar que se obtiene la convolución de una forma muy simple: se recorren todos los puntos de la señal &lt;span style="font-weight: bold;"&gt;x[n]&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;h[n]&lt;/span&gt;, y en base a esto se calcula el &lt;span style="font-weight: bold;"&gt;y[n] &lt;/span&gt;correspondiente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;La segunda función, llamada &lt;span style="font-style: italic;"&gt;output_side_conv()&lt;/span&gt;, obtiene la convolución con el &lt;span style="font-style: italic;"&gt;Output Side Algorithm&lt;/span&gt;, la cual varía de la anterior en un punto muy importante. Antes de ver cual es la diferencia importante, veamos el código, ya que es muy simple de entender:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define PUNTOS_X (6)&lt;br /&gt;#define PUNTOS_H (4)&lt;br /&gt;#define PUNTOS_Y ((PUNTOS_X) + (PUNTOS_H) - 1)&lt;br /&gt;&lt;br /&gt;/* Los metodos tienen la misma interfaz:&lt;br /&gt;    x, h ---&amp;gt; son las señales de entrada&lt;br /&gt;       y ---&amp;gt; es la señal de salida        */&lt;br /&gt;void input_side_conv(int *x, int *h, int *y)&lt;br /&gt;{&lt;br /&gt;    int i,j;&lt;br /&gt;    for(i=0;i&amp;lt;PUNTOS_X; i++)&lt;br /&gt;        for(j=0;j&amp;lt;PUNTOS_H;j++)&lt;br /&gt;            y[i+j]=y[i+j]+x[i]*h[j];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void output_side_conv(int *x, int *h, int *y)&lt;br /&gt;{&lt;br /&gt;    int i,j;&lt;br /&gt;&lt;br /&gt;    for(i=0;i&amp;lt;PUNTOS_Y; i++) {&lt;br /&gt;        y[i]=0;&lt;br /&gt;        for(j=0;j&amp;lt;PUNTOS_H;j++) {&lt;br /&gt;            if(i-j&amp;lt;0 || i-j&amp;gt;=PUNTOS_X) continue;&lt;br /&gt;            y[i] = y[i]+h[j]*x[i-j];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    int x[PUNTOS_X] = {0,-1,-1,2,1,1};&lt;br /&gt;    int h[PUNTOS_H] = {1,0,-1,1};&lt;br /&gt;    int y1[PUNTOS_Y] = {0,0,0,0,0,0,0,0,0};&lt;br /&gt;    int y2[PUNTOS_Y] = {0,0,0,0,0,0,0,0,0};&lt;br /&gt;&lt;br /&gt;    int i;&lt;br /&gt;&lt;br /&gt;    //calculamos la convolucion por el primer metodo&lt;br /&gt;    input_side_conv(x, h, y1);&lt;br /&gt;    //calculamos la convolucion por el otro metodo&lt;br /&gt;    output_side_conv(x, h, y2);&lt;br /&gt;&lt;br /&gt;    //mostramos las dos respuestas&lt;br /&gt;    printf("Input Side        Output Side\n");&lt;br /&gt;    for(i=0;i&amp;lt;PUNTOS_Y;i++)&lt;br /&gt;        printf("[%2d]              [%d]\n", y1[i], y2[i]);&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;Vemos que he definido 3 constantes simbólicas con &lt;span style="font-style: italic;"&gt;#define&lt;/span&gt;. Las mismas son &lt;span style="font-style: italic;"&gt;PUNTOS_X&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;PUNTOS_H&lt;/span&gt; y&lt;span style="font-style: italic;"&gt; PUNTOS_Y&lt;/span&gt;. Cada uno denota la cantidad de puntos que tiene cada señal involucrada. En el caso de &lt;span style="font-style: italic;"&gt;PUNTOS_Y&lt;/span&gt; se puede obtener con la operación que puse, según la fórmula que expliqué en la primera parte de esta serie de artículos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;Luego siguen las definiciones de las funciones que calculan la convolución. Ambas dan el mismo resultado, pero cada una lo calcula de forma distinta.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;Finalmente, tenemos un main() que lo unico que hace es fijar valores para &lt;span style="font-weight: bold;"&gt;x[n]&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;h[n]&lt;/span&gt; y luego realiza la convolución de las mismas en dos señales de salida,&lt;span style="font-weight: bold;"&gt; y1[n]&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;y2[n]&lt;/span&gt; y muestra en forma "de tabla" el resultado de ambas para simplificar la comparación y ver que dan el mismo resultado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;La diferencia importante de la que hablé recién, es la siguiente: si observamos con detalle cómo se calcula cada convolución, podemos notar que la segunda forma, output_side_conv() tiene una ventaja importante, y ésta es que permite calcular un valor específico de &lt;span style="font-weight: bold;"&gt;y[n] &lt;/span&gt;sin que sea necesario conocer todos los puntos de &lt;span style="font-weight: bold;"&gt;x[n]&lt;/span&gt;, sino solo los necesarios. En cambio, en la otra función necestiamos conocer todos los puntos de &lt;span style="font-weight: bold;"&gt;x[n]&lt;/span&gt; de antemano, ya que los recorremos uno a uno, y en base a esto vamos calculando cada valor de&lt;span style="font-weight: bold;"&gt; y[n]&lt;/span&gt;. ¿Por qué esto es tan importante? Porque generalmente, no contamos con todos los puntos de &lt;span style="font-weight: bold;"&gt;x[n]&lt;/span&gt; ya que muchas veces se necesita obtener la convolución a medida que se va obteniendo la señal &lt;span style="font-weight: bold;"&gt;x[n]&lt;/span&gt;, es decir, obtener &lt;span style="font-weight: bold;"&gt;y[n]&lt;/span&gt; en tiempo real.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;Acá les dejo el código en C para que no tengan que copiarlo a mano: &lt;a href="http://www.4shared.com/file/rcKENWZc/main.html"&gt;bajar código en C .&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;Bueno, con esto doy por finalizados los artículos de convolución, espero que les haya resultado interesante, divertido.. o al menos práctico!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-5313147623827596966?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/Pd10iolSlWU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/5313147623827596966/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=5313147623827596966" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/5313147623827596966?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/5313147623827596966?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/Pd10iolSlWU/convolucion-pero-si-es-muy-facil-parte.html" title="¿Convolución? ¡Pero si es muy fácil! (Parte 3/3)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>2</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2011/01/convolucion-pero-si-es-muy-facil-parte.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4GQ3s-cSp7ImA9Wx9QEkQ.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-1136351975212762187</id><published>2010-12-25T08:01:00.000-08:00</published><updated>2010-12-25T08:02:02.559-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-25T08:02:02.559-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Matemática" /><category scheme="http://www.blogger.com/atom/ns#" term="DSP" /><category scheme="http://www.blogger.com/atom/ns#" term="Electronica" /><title>¿Convolución? ¡Pero si es muy fácil! (Parte 2/3)</title><content type="html">&lt;h4&gt;&lt;strong&gt;&lt;strong style="FONT-FAMILY: Arial"&gt;Método "Semi-Gráfico" Simple de convolución.&lt;/strong&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;Buenas! En mi post anterior, hablé un poco de lo que era la convolución, y medio que me obligué a mostrar en esta entrega un método para resolver convoluciones a mano. Le he llamado "semi-gráfico" porque no es gráfico, pero se me ocurrió a partir de las gráficas de las señalesa convolucionar, aquellas que llamábamos &lt;strong&gt;&lt;em&gt;x[n]&lt;/em&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;em&gt;h[n]&lt;/em&gt;&lt;/strong&gt; . Mediante este método, obtendremos el &lt;strong&gt;y[n]&lt;/strong&gt;. Pero demás está decir que las señales pueden ser cualquiera, asique de forma genérica las llamaremos &lt;strong&gt;a[n]&lt;/strong&gt; y &lt;strong&gt;b[n]&lt;/strong&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Bueno, aqui dejo el video con la explicación del método. Espero que sea últil! ;)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;object xmlns="" width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/G1YtAOO3ZJ0?fs=1&amp;amp;hl=es_ES"/&gt;&lt;param name="wmode"/&gt;&lt;embed xmlns="http://www.w3.org/1999/xhtml" src="http://www.youtube.com/v/G1YtAOO3ZJ0?fs=1&amp;amp;hl=es_ES" width="480" height="385" allowscriptaccess="always" allowfullscreen="true" type="application/x-shockwave-flash"/&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Saludos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-1136351975212762187?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/QK0MqLY7fuE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/1136351975212762187/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=1136351975212762187" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/1136351975212762187?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/1136351975212762187?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/QK0MqLY7fuE/convolucion-pero-si-es-muy-facil-parte_25.html" title="¿Convolución? ¡Pero si es muy fácil! (Parte 2/3)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>2</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/12/convolucion-pero-si-es-muy-facil-parte_25.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMERHk5cSp7ImA9Wx9SGEk.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-8563964517502061596</id><published>2010-12-08T14:41:00.000-08:00</published><updated>2010-12-08T14:46:45.729-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-08T14:46:45.729-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Matemática" /><category scheme="http://www.blogger.com/atom/ns#" term="DSP" /><category scheme="http://www.blogger.com/atom/ns#" term="Electronica" /><title>¿Convolución? ¡Pero si es muy fácil! (Parte 1/3)</title><content type="html">Bueno, les comento que para el título del post, saqué la idea de un libro muy viejo que tenía mi abuelo, el cual se titulaba: &lt;em&gt;"¿La Radio? ¡Pero si es muy fácil!",&lt;/em&gt; y como me pareció muy simpático para un libro, me quedó grabado muchos años.. ahora lo adapté para usarlo en mi blog :)&lt;p&gt;Pasando al tema que me toca. La convolución es un tema al que cuesta agarrarle la mano en un principio, tanto en el concepto como el cálculo de la misma. Mientras aprendía este tema, se me ocurrió una forma muy simple de calcular convoluciones a mano, y por eso me decidí a realizar el post. Advierto que no soy un experto en el tema, pero comprendo muy bien el concepto, y voy a tratar de explicarlo de la forma más sencilla posible; además del método de resolución que mencioné y un programa en algún lenguaje que la resuelva, como para terminar esto bien bonito. En la imagen que no se ve, pueden hacer click para agrandarla.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;¿Qué es la convolución?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Para comenzar, la convolución se trata de una operación matemática que combina dos señales para producir una tecer señal. En el campo de las señales digitales es muy importante, ya que permite obtener la &lt;strong&gt;señal de salida&lt;/strong&gt; de un sistema a partir de la &lt;strong&gt;señal de entrada&lt;/strong&gt; y &lt;strong&gt;la respuesta al impulso&lt;/strong&gt;. Es decir, podemos predecir la salida, conociendo la entrada y la respuesta al impulso.&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh6.ggpht.com/_nLAO39nr9Ys/TQAJyeQM77I/AAAAAAAABF0/cJkoeLyiwzM/convolucion.JPG" alt="convolucion.JPG" width="492" height="120" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Conceptos previos.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Bien, primero que nada, es necesario tener algunas cosas claras antes de explicar la convolución. Comencemos por describir qué es el &lt;strong&gt;impulso unitario&lt;/strong&gt; o &lt;strong&gt;función delta&lt;/strong&gt; (es lo mismo). No es nada más que una simple función matemática que vale &lt;em&gt;1&lt;/em&gt; en &lt;em&gt;n = 0&lt;/em&gt; y vale &lt;em&gt;0&lt;/em&gt; en cualquier otro punto. Es decir:&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh6.ggpht.com/_nLAO39nr9Ys/TQAJyw6eW_I/AAAAAAAABF4/uGF4DU9tLP8/convolucion2.JPG" alt="convolucion2.JPG" width="254" height="115" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Podemos desplazar y escalar esta función delta, ¿cierto? Por ejemplo, si tenemos una señal &lt;em&gt;s[n]&lt;/em&gt; que vale &lt;em&gt;-3&lt;/em&gt; en &lt;em&gt;n = 5&lt;/em&gt; y vale cero en cualquier otro punto, entonces expresarla como una función delta desplazada 5 muestras hacia la derecha, y escalada por un factor de &lt;em&gt;-3&lt;/em&gt;. Es decir que &lt;em&gt;s[n] = -3*delta[n-5]&lt;/em&gt;. Es decir, lo que tenemos es un &lt;strong&gt;impulso&lt;/strong&gt; (es decir, es una señal que es el impulso unitario &lt;em&gt;pero desplazado y escalado&lt;/em&gt;).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Una vez que comprendemos el efecto de desplazar y escalar la función delta, podemos descomponer cualquier señal en una sumatoria de impulsos (funciones delta desplazadas y escaladas). A la descoposición de una señal en una otras señales se le llama &lt;em&gt;análisis&lt;/em&gt; de la señal. La idea de esto, es que si tomamos cada impulso y los sumamos, volveremos a obtener la señal original. A la composición de una señal a partir de la sumatoria de otras señales (en nuestro caso impulsos) se le llama &lt;em&gt;síntesis&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Veamos un ejemplo simple de descomposición de una señal en una sumatoria de impulsos&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_nLAO39nr9Ys/TQAJzQUnWyI/AAAAAAAABF8/_h5tsUSKApg/convolucion3.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 585px; height: 70px;" src="http://lh5.ggpht.com/_nLAO39nr9Ys/TQAJzQUnWyI/AAAAAAAABF8/_h5tsUSKApg/convolucion3.JPG" alt="" border="0" /&gt;&lt;/a&gt;Ahora, imaginemos que tenemos un sistema lineal cualquiera. Si en la entrada de dicho sistema ponemos una señal cuañquiera, el sistema, como es de esperarse, nos devovlerá una señal salida, la cual dependerá exclusivamente de &lt;em&gt;qué&lt;/em&gt; haga el sistema internamente. O sea que distintos sistemas nos pueden dar distintas respuestas ante la misma entrada. En el caso particular de que la entrada sea el impulso unitario la salida del sistema se llamará &lt;strong&gt;respuesta al impulso&lt;/strong&gt; o &lt;strong&gt;respuesta impulsiva&lt;/strong&gt; y se denota como &lt;em&gt;&lt;strong&gt;h[n]&lt;/strong&gt;&lt;/em&gt;.&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh6.ggpht.com/_nLAO39nr9Ys/TQAJztVLV8I/AAAAAAAABGA/41v0h-55iJ4/convolucion4.JPG" alt="convolucion4.JPG" width="209" height="46" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Lo interesante de esto, es que si la entrada al sistema es un impulso unitario desplazado y escalado, entonces la salida será la respuesta al impulso, pero igualmente desplazada y escalada que que la entrada. Si además, recordamos que cualquier señal puede expesarse como una sumatoria de impulsos, podemos conocer la respuesta del sistema a cada uno de esos impulsos. Y si además, sumamos todas estas respuestas a cada impulso, entonces obtendremos la respuesta del sistema a la señal original.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ahora si, ¿qué es la convolución?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;¿Cuál es el beneficio de todo esto? Que podemos predecir la salida de cualquier sistema linear con solo conocer su respuesta al impulso unitario, es decir, el &lt;strong&gt;h[n]&lt;/strong&gt;.y no hay necesidad de introducir realmente una señal de entrada al sistema; sino que descomponemos esa señal en impulsos, evaluamos la respuesta del sistema para cada impulso (escalamos y desplazamos &lt;strong&gt;h[n]&lt;/strong&gt; según cada impulso) y luego sumamos esas respuestas. ¡Todo este proceso, no es más que la &lt;strong&gt;convolución&lt;/strong&gt; de &lt;em&gt;h[n]&lt;/em&gt; y la señal de entrada! La convolucion se representa con una estrella. Es decir:&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh3.ggpht.com/_nLAO39nr9Ys/TQAJ0DKqmGI/AAAAAAAABGE/CvcWcJq21ug/convolucion5.JPG" alt="convolucion5.JPG" width="229" height="72" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Matemáticamente, se escribe como:&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img src="http://lh3.ggpht.com/_nLAO39nr9Ys/TQAJ0WB1PgI/AAAAAAAABGI/PpsgF2NF1Uc/convolucion6.JPG" alt="convolucion6.JPG" width="122" height="59" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;donde &lt;em&gt;M&lt;/em&gt; es la cantidad de muestras que tiene la respuesta al impulso &lt;em&gt;h[n]&lt;/em&gt; y van desde &lt;em&gt;0&lt;/em&gt; hasta &lt;em&gt;M-1&lt;/em&gt;. La señal x[n] tiene N muestras (&lt;em&gt;0&lt;/em&gt; a &lt;em&gt;N-1&lt;/em&gt;). La convolución de ambas señales, &lt;em&gt;y[n]&lt;/em&gt;, tendrá &lt;em&gt;N+M-1&lt;/em&gt; muestras (de &lt;em&gt;0&lt;/em&gt; a &lt;em&gt;N+M-2&lt;/em&gt;).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Bueno, espero que haya sido claro, sino pregunten o sugieran, y nunca está demás complementar con otras lecturas. Personalmente, recomiendo leer el capítulo 6 de un libro disponible en formato digital llamado "The &lt;em&gt;Scientist and Engineer's Guide to Digital Signal Processing&lt;/em&gt;" escrito por &lt;em&gt;Steven W. Smith&lt;/em&gt;, &lt;em&gt;Ph.D&lt;/em&gt;. &lt;a href="http://www.dspguide.com/" target="_blank" title="Enlace al libro."&gt;Enlace al libro&lt;/a&gt;. Está en inglés, ¡pero es excelente!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La proxima entrega describo el método de cálculo manual de la convolución. ¡Nos vemos!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-8563964517502061596?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/Po6f_A-u_NQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/8563964517502061596/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=8563964517502061596" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/8563964517502061596?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/8563964517502061596?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/Po6f_A-u_NQ/convolucion-pero-si-es-muy-facil-parte.html" title="¿Convolución? ¡Pero si es muy fácil! (Parte 1/3)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_nLAO39nr9Ys/TQAJyeQM77I/AAAAAAAABF0/cJkoeLyiwzM/s72-c/convolucion.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/12/convolucion-pero-si-es-muy-facil-parte.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UMR3Y-eSp7ImA9WhZRFEs.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-4353336870457492503</id><published>2010-12-07T23:17:00.001-08:00</published><updated>2011-04-10T14:01:26.851-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-10T14:01:26.851-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>Funciones estáticas de C</title><content type="html">Esta tarde estaba mirando/modificando un código en lenguaje C. Me llamó la atención el uso de un puntero a función que referenciaba a una función estática. Me llamó a la atención porque si bien en el paradigma orientado a objetos los métodos estáticos tienen una importancia relevante, no pude hacer una relación inmediata sobre qué podía significar una función estática en la programación estructurada. Por esto es que me puse a buscar un poco, hasta dí con el significado.&lt;br /&gt;&lt;p&gt;Cuando definimos una función como estática en C, lo que realmente estamos haciendo es limitar a que &lt;strong&gt;solo las funciones que están definidas en el mismo archivo que la función estática puedan llamarla a ésta&lt;/strong&gt;. Para verlo más claro, veamos los siguientes archivos:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;//////////////////////////&lt;br /&gt;// Archivo: funciones.h //&lt;br /&gt;//////////////////////////&lt;br /&gt;&lt;br /&gt;int sumar (int a, int b);&lt;br /&gt;static int rest(int a, int b);&lt;br /&gt;int restar(int a, int b);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;//////////////////////////&lt;br /&gt;// Archivo: funciones.c //&lt;br /&gt;//////////////////////////&lt;br /&gt;&lt;br /&gt;#include "funciones.h"&lt;br /&gt;&lt;br /&gt;int sumar(int a, int b)&lt;br /&gt;{&lt;br /&gt;    return a+b;&lt;br /&gt;}&lt;br /&gt;static int rest (int a, int b)&lt;br /&gt;{&lt;br /&gt;    return a-b;&lt;br /&gt;}&lt;br /&gt;int restar (int a, int b)&lt;br /&gt;{&lt;br /&gt;    return rest(a,b);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c"&gt;&lt;br /&gt;/////////////////////&lt;br /&gt;// Archivo: main.c //&lt;br /&gt;/////////////////////&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    int a, b, c, d, e;&lt;br /&gt;&lt;br /&gt;    a = 5;&lt;br /&gt;    b = 7;&lt;br /&gt;&lt;br /&gt;    c = sumar(a,b);&lt;br /&gt;    d = restar(a,b); //CORECTO! :)&lt;br /&gt;    e = rest(a,b);   //  ERROR! :(&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La función &lt;em&gt;rest()&lt;/em&gt; está definida como estática, esto quiere decir que solo las funciones &lt;em&gt;sumar()&lt;/em&gt; y &lt;em&gt;restar()&lt;/em&gt; pueden llamarla; pero&lt;em&gt; main()&lt;/em&gt; -que está definida en otro archivo- no puede hacerlo, ya que no la "vé" directamente. (En &lt;a href="http://blog.ilikeblues.com/2008/02/llamadas-a-funciones-estaticas-externas-en-c/"&gt;esta página&lt;/a&gt; hay una forma interesante de saltear esta restricción para casos particulares, como por ejemplo, pruebas unitarias).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Puedo decir, sin intención de herir la susceptibilidad de los paradigmáticos, que las funciones estáticas de C vienen a ser las &lt;em&gt;abuelas&lt;/em&gt; de los actuales modificadores &lt;strong&gt;private&lt;/strong&gt; tan utilizados en la programación orientada a objetos, ya que ambos permiten el encapsulamiento de funcionalidad .&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Luego sigo ahondando un poco más en el tema, ¡nos vemos!&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;EDIT: Artículo corregido.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-4353336870457492503?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/g0TuUjqMXuI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/4353336870457492503/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=4353336870457492503" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4353336870457492503?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4353336870457492503?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/g0TuUjqMXuI/funciones-estaticas-de-c.html" title="Funciones estáticas de C" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>2</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/12/funciones-estaticas-de-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEABRH45fyp7ImA9Wx5bFkk.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-1134647793771622959</id><published>2010-11-01T14:23:00.000-07:00</published><updated>2010-11-01T14:25:55.027-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-01T14:25:55.027-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="off-topics" /><category scheme="http://www.blogger.com/atom/ns#" term="software libre" /><title>Comunidad Libre UTN</title><content type="html">Buenas! Hoy les tiro la data de una comunidad que estamos armando junto con algunos compañeros de la facutlad. Les "copy-pasteo" la descripción de la misma:&lt;br /&gt;&lt;br /&gt;&lt;h2 class="pagetitle"&gt;Sobre la comunidad&lt;/h2&gt;                     &lt;p&gt;Porque creemos que la utilización de software libre en el  ámbito educativo es un recurso invaluable y debe ser aprovechado al  máximo.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Unite a una comunidad en donde el fín último será el aprendizaje colectivo y la utilización de nuevas tecnologías.&lt;/li&gt;&lt;li&gt;Mediante el intercambio de información, conocimiento e ideas  potenciaremos las capacidades individuales de cada uno de los miembros.&lt;/li&gt;&lt;li&gt;Fomentaremos el espíritu proactivo y creativo de los integrantes  mediante el aprendizaje autodidacta, el desarrollo de nuevas  herramientas y el trabajo en equipo.&lt;/li&gt;&lt;li&gt;Organizaremos diferentes tipos de actividades para promover la  utilización de herramientas libres y su filosofía, dentro y fuera de la  comunidad.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;¿Cómo funcionamos?&lt;/h3&gt; &lt;p&gt;La comunidad persigue fuertemente la filosofía de “aprender  haciendo”. Esto significa que la comunidad induce a los miembros a  participar en diferentes proyectos y aprender del estudio, de la  experiencia y de compartir conocimiento.&lt;/p&gt; &lt;p&gt;No tenemos un foro de ayuda, no somos soporte técnico y si buscás  ayuda para un problema puntual probablemente te sea dificil encontrarla  porque nuestra estructura no facilita ese tipo de búsqueda. Estamos para  aprender haciendo cosas y nosotros también buscamos conocimientos desde  otras fuentes. Si en algún futuro nace un grupo dentro de la comunidad  que esté dedicado a ayudar en la resolución de problemas, pues esas  serán políticas puramente de dicho grupo.&lt;/p&gt; &lt;p&gt;Te invitamos a que te unas a la comunidad registrándote en este sitio  y que busques grupos de tu interés, o que crees el tuyo propio si es  que no encuentras alguno que te guste.&lt;/p&gt;Link: http://comunidadlibre-utn.co.cc/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-1134647793771622959?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/dHhJtK2s5do" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/1134647793771622959/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=1134647793771622959" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/1134647793771622959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/1134647793771622959?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/dHhJtK2s5do/comunidad-libre-utn.html" title="Comunidad Libre UTN" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/11/comunidad-libre-utn.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUICQXw-cCp7ImA9WhZRFEo.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-2690492821428305939</id><published>2010-09-14T18:09:00.000-07:00</published><updated>2011-04-10T15:12:40.258-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-10T15:12:40.258-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="C/C++" /><title>Funciones 'inline' de C++: "Expansión en Línea"</title><content type="html">Es realmente interesante todo lo que se puede aprender a partir de pequeñas dudas. La mía surgió por un motivo que no viene al caso, pero terminé interesándome por las funciones definidas en el estándar de C++ llamadas &lt;span style="font-weight: bold;"&gt;inline&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Las funciones &lt;span style="font-style: italic;"&gt;inline &lt;/span&gt;han venido de alguna manera, a reemplazar las macros de preprocesador. No es que esta fuera la finalidad al crearlas (realmente no lo sé), pero la utilidad es básicamente la misma, aunque las funciones &lt;span style="font-style: italic;"&gt;inline &lt;/span&gt;tienen ventajas sobre las macros.&lt;br /&gt;&lt;br /&gt;Bueno, empecemos: ¿qué hace un función &lt;span style="font-style: italic;"&gt;inline&lt;/span&gt;? Cuando declaramos una función con el calificador &lt;span style="font-style: italic;"&gt;inline&lt;/span&gt;, el compilador intentará -llegado el momento- de colocar una copia del código de la función en el lugar de la llamada a dicha función en línea). Esto reduce la sobrecarga que se genera cuando llamamos a funciones, pero a costa de incrementar el tamaño del programa por el hecho de tener una copia de la función en cada lugar en que la llamamos.&lt;br /&gt;&lt;br /&gt;Es lo mismo que logramos cuando utilizamos las macros de preprocesamiento para expandir código en línea. Acá se puede ver:&lt;br /&gt;&lt;pre class="brush:cpp"&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;#define macroCubo(x) (x)*(x)*(x)&lt;br /&gt;&lt;br /&gt;inline int funcCubo(int x)&lt;br /&gt;{&lt;br /&gt;    return x*x*x;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;    cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "Con macro: " &amp;lt;&amp;lt; macroCubo(2+1);&lt;br /&gt;    cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "Con inline: " &amp;lt;&amp;lt; funcCubo(2+1);&lt;br /&gt;&lt;br /&gt;    /*&lt;br /&gt;        La linea 10 queda finalmente como:&lt;br /&gt;            cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "Con macro: " &amp;lt;&amp;lt; (2+1)*(2+1)*(2+1);&lt;br /&gt;        La linea 11 queda finalmente como:&lt;br /&gt;            cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "Con inline: " &amp;lt;&amp;lt; 3*3*3;&lt;br /&gt;    */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aunque el resultado funcional es el mismo, existen diferencias entre los dos métodos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Las funciones &lt;span style="font-style: italic;"&gt;inline&lt;/span&gt;, al ser como cualquier otra función, conlleva una verificación de tipo, cosa que no sucede con las macros, ya que se reemplazan "sin más".&lt;/li&gt;&lt;li&gt;Las funciones &lt;span style="font-style: italic;"&gt;inline &lt;/span&gt;no pueden utilizarse de forma sintácticamente incorrecta, ya que esto produciría un error de compilación. Con las macros, es posible sufrir ciertos efectos colaterales por mal uso.&lt;/li&gt;&lt;li&gt;Las macros no puede ser depuradas, ya que para el precompilador son solo porciones de texto que deben reemplazarse donde se indique. El compilador puede informar un error, pero no podrá decir que se debe a una macro, ni a cual. Por el contrario, las funciones &lt;span style="font-style: italic;"&gt;inline&lt;/span&gt; se puede depurar como cualquier otra función.&lt;/li&gt;&lt;li&gt;Las macros reemplazan los argumentos con los parámetros sin evaluar (ver imagen de arriba). En cambio, las funciones evalúan los parámetros (si se tratá de una expresión matemática, por ejemplo, esta se resuelve y se pasa).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Cabe aclarar que no me gusta hablar de &lt;span style="font-style: italic;"&gt;ventajas y desventajas&lt;/span&gt;, y remarco que son &lt;span style="font-style: italic;"&gt;diferencias&lt;/span&gt;. Muchas veces lo que en ciertos contextos es ua ventaja, en otros puede no serlo o ser una desventaja.&lt;br /&gt;&lt;br /&gt;Sobre el uso de las funciones en línea, vale aclarar algunas cositas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cada vez que se modifica una función inline, es necesario recompilar todos los archivos que la utilizan (recordemos que se trata de &lt;span style="font-style: italic;"&gt;copiar y pegar&lt;/span&gt; el cuerpo de la función; y si ésta se moficia, hay que volver a &lt;span style="font-style: italic;"&gt;copiar y pegar&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Se recomienda utilizar el calificador sólo en las funciones pequeñas (aunque tengo entendido que el compilador lo ignora si la función es relativamente grande).&lt;/li&gt;&lt;li&gt;Existe una sobrecarga cuando se llama a una función cualquiera, la cual se evita utilizando funciones inline, mejorando el tiempo de ejecución.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Ahora quiero mencionar algunos aspectos importantes de las funciones en línea que es conveniente tener presentes al momento de diseñar un programa. Para el "programa típico" quizás no sean relevantes, pero para casos más extremos como sistemas embebidos o sistemas distribuídos, puede significar un costo importante de recursos.&lt;br /&gt;&lt;br /&gt;Los aspectos a tener en cuenta son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Se reduce tiempo de ejecución, probablemente a costa de aumentar el tamaño del programa. Es necesario evaluar este punto si queremos, por ejemplo, programar sistemas embebidos ya que usualmente el espacio suele ser un factor crítico en estos.&lt;/li&gt;&lt;li&gt;Las variables que se agregan por las funciones en línea pueden necesitar registros adicionales, y si no se dispone de suficientes, entonces se requerirá más accesos a memoria  RAM, incrementando así el tiempo de ejecución.&lt;/li&gt;&lt;li&gt;Si el código del programa crece demasiado, pueden superarse las limitaciones de recursos (como memoria RAM) y fallar el programa. Esto es importante sobre todo en sistemas de recursos más limitados, como embebidos, móviles, etc.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Bueno, supongo que aún pueden tenerse en cuenta algunos aspectos que no he mencionado acá, pero esto da algunas pautas de las consecuencias que puede haber con el uso de las funciones en línea, que pueden ayudar o perjudicar en las aplicaciones que hagamos.&lt;br /&gt;&lt;br /&gt;Salutes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-2690492821428305939?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/5gHuGyywiAM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/2690492821428305939/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=2690492821428305939" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2690492821428305939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2690492821428305939?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/5gHuGyywiAM/funciones-inline-de-c-expansion-en.html" title="Funciones 'inline' de C++: &quot;Expansión en Línea&quot;" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/09/funciones-inline-de-c-expansion-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YMQXY8eSp7ImA9Wx5QFk4.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-2991016380948508697</id><published>2010-09-04T14:42:00.000-07:00</published><updated>2010-09-04T15:26:20.871-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-04T15:26:20.871-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Patrones" /><category scheme="http://www.blogger.com/atom/ns#" term="UML" /><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería de Sistemas" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Ejemplo de uso del patron Observer</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nLAO39nr9Ys/TILEsOA46PI/AAAAAAAABEs/MWT5wsSlz0Q/s1600/ObserverPattern.JPG"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 252px; height: 175px;" src="http://1.bp.blogspot.com/_nLAO39nr9Ys/TILEsOA46PI/AAAAAAAABEs/MWT5wsSlz0Q/s200/ObserverPattern.JPG" alt="" id="BLOGGER_PHOTO_ID_5513185157810022642" border="0" /&gt;&lt;/a&gt;Ahora que hice el último patrón que se nos había encomendado implementar, el patrón Observador, voy a poner el ejemplo como hice con el patrón Command.&lt;br /&gt;&lt;br /&gt;La idea es la siguiente: tenemos un caso de uso "Marcar Gol" que se dispara -imaginemos- cuando un sensor ubicado en un arco de fútbol detecta que pasa la pelota. Al dispararse este caso de uso, se llama al método de su experto &lt;span style="font-style: italic;"&gt;anotarGol()&lt;/span&gt;, quien -entre otras cosas- llama al método &lt;span style="font-style: italic;"&gt;actualizar()&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;SuscriptorGoles&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La interfaz del caso de uso "Ver Resultados" llama al método &lt;span style="font-style: italic;"&gt;inciar()&lt;/span&gt; del controlador, con el cual éste se suscribe a &lt;span style="font-style: italic;"&gt;SuscriptorGoles &lt;/span&gt;para que SuscriptorGoles llame al método &lt;span style="font-style: italic;"&gt;actualizar() &lt;/span&gt;del controlador. Este método, lo implementa de la interfaz &lt;span style="font-style: italic;"&gt;IObservadorGoles&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Notemos que &lt;span style="font-style: italic;"&gt;SuscriptorGoles &lt;/span&gt;tiene un arreglo (o lista) de &lt;span style="font-style: italic;"&gt;IObservadorGoles &lt;/span&gt;para actualizar a cada observador suscrtipto a el.&lt;br /&gt;&lt;br /&gt;En el diagrama de clases olvidé especificarlo, pero conviene que &lt;span style="font-style: italic;"&gt;SuscriptorGoles &lt;/span&gt;sea un singleton, ya que no vamos a usar más que una sola instancia de él.&lt;br /&gt;&lt;br /&gt;Implementación en &lt;span style="font-weight: bold;"&gt;C#&lt;/span&gt;: &lt;a href="http://www.4shared.com/file/Edb0fw1B/PatronObservador.html"&gt;Descargar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Salutes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-2991016380948508697?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/4RIWFVApZPk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/2991016380948508697/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=2991016380948508697" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2991016380948508697?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2991016380948508697?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/4RIWFVApZPk/ejemplo-de-uso-del-patron-observer.html" title="Ejemplo de uso del patron Observer" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nLAO39nr9Ys/TILEsOA46PI/AAAAAAAABEs/MWT5wsSlz0Q/s72-c/ObserverPattern.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/09/ejemplo-de-uso-del-patron-observer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8FRHoycSp7ImA9Wx5QFkk.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-4657394635740728859</id><published>2010-09-03T08:52:00.000-07:00</published><updated>2010-09-04T15:53:35.499-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-04T15:53:35.499-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Modelación" /><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería de Sistemas" /><category scheme="http://www.blogger.com/atom/ns#" term="analisis de sistemas" /><title>La estrategia del Cartógrafo</title><content type="html">&lt;div style="text-align: left;"&gt;Todos los que hay&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ebrisa.com/portalc/media/media-S/images/00016652.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 241px; height: 179px;" src="http://www.ebrisa.com/portalc/media/media-S/images/00016652.jpg" alt="" border="0" /&gt;&lt;/a&gt;an leido el conocido libro de Craig Larman "UML y Patrones", ya saben a que me refiero. Para quienes no, y para tenerlo en mi colección bloggera de temas interesantes, lo pongo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La estrategia del cartógrafo está explicada en la parte del libro que habra sobre la &lt;span style="font-weight: bold;"&gt;construcción de modelos conceptuales.&lt;/span&gt; La idea que propone es  tener en cuenta tres sugerencias que seguir al momento de trazar un mapa o, en nuestro caso, modelar un dominio.&lt;br /&gt;&lt;br /&gt;Un modelo conceptual es una especie de mapa de las &lt;span style="font-style: italic;"&gt;cosas&lt;/span&gt; del dominio que estamos analizando. Las tres sugerencias para tener en cuenta son:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Utilizar los nombres existentes en el territorio&lt;/span&gt;. Los cartógrafos utilizan los nombres que se usan en ese territorio, no les inventan nuevos nombres a las cosas. Es decir, que el vocabulario que usemos cuando asignamos el nombre a los conceptos y atributos sea el mismo que se usa en el dominio. Por ej: si en un modelo de supermercado, el personal llama "&lt;span style="font-style: italic;"&gt;Comprador&lt;/span&gt;" a los clientes, nosotros le llamaremos como tal y no "&lt;span style="font-style: italic;"&gt;Cliente&lt;/span&gt;" o "&lt;span style="font-style: italic;"&gt;PersonaQueCompra&lt;/span&gt;" o cualquier otro nombre que nos guste más.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Excluir las características irrelevantes&lt;/span&gt;. Los cartógrafos deben omitir en su mapa las cosas que no les parecen importantes, es decir, aquellas que no contribuyen con el propósito que persiguen, como por ejemplo, la población en determinados lugares, o la salinidad de la tierra, etc. En nuestro ámbito, y siguiendo con el ejemplo del supermercado, nos puede convenir excluir conceptos como "Proveedor" si es que los proveedores no son relevantes para los requerimientos actuales. Hay que tener cuidado en esto, porque algunos conceptos pueden no ser tan obvios respecto de su relevancia, y podemos omitir algo que en el futuro será necesario.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) No agregar cosas que no existan.&lt;/span&gt; El ejemplo que se menciona en el libro no puede ser más claro: ¡un cartógrafo no va a poner una montaña si ésta no existe! Con esto se refiere a que es conveniente excluir todo aquello que no forma parte del dominio del sistema que se analiza.&lt;br /&gt;&lt;br /&gt;Claro no hay que cumplirlas al pie de la letra (por algo son sugerencias) pero a mi parecer son muy simples y muy prácticas. A veces hasta pueden sonar obvias e innecesarias, pero lo que me agrada es que son muy útiles para esos momentos en que el sistema "nos puede", esos momentos en que nos perdemos en el mar de conceptos, requerimientos y descripciones que tienen los sistemas grandes...&lt;br /&gt;&lt;br /&gt;Hasta la próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-4657394635740728859?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/sgUAiq6CGOU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/4657394635740728859/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=4657394635740728859" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4657394635740728859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/4657394635740728859?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/sgUAiq6CGOU/la-estrategia-del-cartografo.html" title="La estrategia del Cartógrafo" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/09/la-estrategia-del-cartografo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IMQXs7eSp7ImA9Wx5QEUQ.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-6194440131658307747</id><published>2010-08-28T08:33:00.000-07:00</published><updated>2010-08-30T12:13:00.501-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-30T12:13:00.501-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Patrones" /><category scheme="http://www.blogger.com/atom/ns#" term="UML" /><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería de Sistemas" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Ejemplo de uso del patron Command</title><content type="html">Buenas, gente. Decidi subir este ejemplo al blog porque tuve que hacerlo para la facultad y por ahi viene bien ver algunos ejemplos, aunque que abunden en internet.&lt;br /&gt;Como dije, se trata de un ejemplo aplicado del patrón Command a un negocio que tiene que ver con una escuela.&lt;br /&gt;&lt;br /&gt;La idea es que cuando en dicha escuela se programan las fechas de exámenes, se debe notificar a los profesores, a los padres de los alumnos, a la Dirección General de Escuelas, y debe además, mostrarse en la cartelera. Es un caso ficticio, inventado para el ejemplo. La idea es que a los profesores se les debe enviar una notificación &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nLAO39nr9Ys/THky4NGzRVI/AAAAAAAABEk/TGjRQmQxi6Y/s1600/DClasesPComando.bmp"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 320px; height: 178px;" src="http://3.bp.blogspot.com/_nLAO39nr9Ys/THky4NGzRVI/AAAAAAAABEk/TGjRQmQxi6Y/s320/DClasesPComando.bmp" alt="" id="BLOGGER_PHOTO_ID_5510491560236762450" border="0" /&gt;&lt;/a&gt;impresa a la casa, a los padres se les avisa por e-mail, a la DGE se le puede avisr por e-mail o por notificacion escrita (da igual). Digo que da igual, porque no me he centrado en el proceso particular de cada notificación en sí, sino solo en la aplicación del patrón Command.&lt;br /&gt;&lt;br /&gt;Cuando el experto del caso de uso "Programar Fechas de Examenes" confirma dichas fechas, se debe proceder a hacer las notificaciones para cada caso.  Eso es lo que está en el ejemplo.&lt;br /&gt;&lt;br /&gt;El lenguaje utilizado es C#, con el IDE Visual C# 2008 Express Edition.  Pueden descargar el código fuente y ver el diagrama de clases.&lt;br /&gt;&lt;br /&gt;Código Fuente : &lt;a href="http://www.4shared.com/file/AyEVwHjq/PatronComando.html"&gt;Descargar&lt;/a&gt;&lt;br /&gt;Diagrama de Clases: &lt;a href="http://www.4shared.com/document/qJm0eSQ7/Diagrama_de_Clases.html"&gt;Descargar&lt;/a&gt; o la &lt;a href="http://3.bp.blogspot.com/_nLAO39nr9Ys/THky4NGzRVI/AAAAAAAABEk/TGjRQmQxi6Y/s1600/DClasesPComando.bmp"&gt;imagen&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-6194440131658307747?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/tyak094yrrs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/6194440131658307747/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=6194440131658307747" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6194440131658307747?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6194440131658307747?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/tyak094yrrs/ejemplo-de-uso-del-patron-comando.html" title="Ejemplo de uso del patron Command" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nLAO39nr9Ys/THky4NGzRVI/AAAAAAAABEk/TGjRQmQxi6Y/s72-c/DClasesPComando.bmp" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/08/ejemplo-de-uso-del-patron-comando.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMCRnc5fip7ImA9Wx5RFU8.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-5959399951229313771</id><published>2010-08-21T11:45:00.000-07:00</published><updated>2010-08-22T18:54:27.926-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-22T18:54:27.926-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="off-topics" /><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="cneisi" /><title>CNEISI '10: Impresiones personales.</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nLAO39nr9Ys/THAn0e3tKeI/AAAAAAAABEc/0TjAHqBckrM/s1600/cenisi.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 150px; height: 200px;" src="http://1.bp.blogspot.com/_nLAO39nr9Ys/THAn0e3tKeI/AAAAAAAABEc/0TjAHqBckrM/s200/cenisi.jpg" alt="" id="BLOGGER_PHOTO_ID_5507946126867507682" border="0" /&gt;&lt;/a&gt;Acabo de volver del CNEISI 2010, realizado en la provincia de Santa Fé, y esta es mi impresión en rasgos generales.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La prvincia&lt;/span&gt;. No pude conocer mucho debido al poco tiempo que dura el congreso, pero lo poco que ví me encantó. El tiempo nos acompañó de muy buena manera, no hacía ni frío, ni calor. El río formaba un paisaje realmente hermoso y digno de ver, junto al puente "colgante" y desde la orilla odíamos ver el edificio del CONICET y la UNL al otro lado de la misma. También cruzamos a Entre Ríos para concoer Paraná, una ciudad que verdaderamente me encantó, no se, su estilo..  La verdad, quisiera haber tenido más tiempo para conocer ambos lugares un poco más.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El congreso en general&lt;/span&gt;. Bueno, este no me encantó desde ningún punto de vista. De hecho su  organización me pareció muy pobre. Mi único punto de comparación es el  CNEISI 2009 realizado en San Franciso (pvca de Córdoba), el cual me  resultó mucho mejor armado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Las charlas&lt;/span&gt;. Son los detalles los que hacen que un congreso sea bueno o malo. Los temas de las charlas me parecieron muy malos (con excpeciones), me arriesgo a decir que fueron casi "improvisados". Dar una charla sobbre "crackeo de contraseñas" es muy pobre... esta es información disponible en cualquier lugar de internet, no hay nada innovador en ello, es más, ¿quién no ha investigado y googleado sobre el crackeo de contraseñas alguna vez?. Otra cosa que noté, es que la empresas -en sus charlas- están ansiosas por presentar("vender") sus productos, sus sistemas... esto no llama, no sirve, esto no es de interés para un estudiante típico.&lt;br /&gt;Como conclusión en las charlas tuve la impresión de que &lt;span style="font-weight: bold;"&gt;nos llenaron de información inútil, pero no nos muestran la importancia de meditarla&lt;/span&gt;. Y por esto mismo, quiero recalcar la charla "&lt;span style="font-style: italic;"&gt;¿Me va a servir   dentro  de 20 años lo que estoy aprendiendo hoy?&lt;/span&gt;" que dio Santiago Ceria porque significó algo así como una "pausa en el tiempo", un "wait" para procesar un poco lo que había en el búffer, porque eso es más difícil de encontrar en internet, porque te hace dejar de reaccionar mecánicamente a la información y te hace pensar.. o eso fue lo que me produjo a mi. Esa charla, realmente me encantó.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La comida&lt;/span&gt;. Los pebetes con botella del almuerzo no estuvieron mal, teniendo en cuenta que son solo un brake para seuir en el congreso. Por ahi te quedabas como con ganas de comer un poco más, pero de última pasaba. Las cenas me parecieron muy malas, pésimas. La primera: ir a comer a un boliche y comer 6 porciones de pizza por 23 pesos es una gastada... y todavía peor si están frías y con la música a todo volúmen. La segunda cena fue más rica (pancitos con un poco de carne entre medio) pero realmente fue escasa. Nos quedamos con muchísimas hambre. Nuevamente la música a todo volúmen... no da para cenar, no podés conversar. Una cena no debería hacerse en un boliche. En esto, la facultad de San Francisco estuvo muchísimo mejor organizadas. Comidas realmente ricas, y en un ambiente agradable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El hotel&lt;/span&gt;. No estuvo mal para ser que solo pasabamos allí las noches. El servicio no era el mejor, pero para los fines era adecuado. No pongo quejas en ello. Tampoco me siento del todo satisfecho.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A favor...&lt;/span&gt; Ló único que si puedo rescatar a favor, y en lo cual este congresó fue superior al anterior, fue la puntualidad. No fue 100% puntual, pero la demora fue de menos horas que el anterior. ¿Qué pasa con esto? Es fácil: cuando una delegación llega a destino luego de un largo viaje, quiere sí o sí ir al hotel y bañarse. No me parece que el hotel este acreditado desde ese mismo día. No me parece que haya que esperar 3 horas en la facultad hasta que nos acrediten en el congreso para recién podes ir al hotel. El problema, es que ni siquiera después se puede ir al hotel. Este es un aspecto que imagino tienen todos los congresos, pero realmente habría que mejorar.&lt;br /&gt;&lt;br /&gt;Bueno, esa fue mi impresión general del congreso. De todas formas, la pasé muy bien y esperaremos al año que viene para volver a participar del mismo :)&lt;br /&gt;&lt;br /&gt;Info del congreso: http://www.frsf.utn.edu.ar/cneisi2010/&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-5959399951229313771?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/0lzWw-kADfc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/5959399951229313771/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=5959399951229313771" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/5959399951229313771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/5959399951229313771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/0lzWw-kADfc/cneisi-2010-impresiones-personales.html" title="CNEISI '10: Impresiones personales." /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_nLAO39nr9Ys/THAn0e3tKeI/AAAAAAAABEc/0TjAHqBckrM/s72-c/cenisi.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/08/cneisi-2010-impresiones-personales.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08DQ38yfyp7ImA9Wx5QFU8.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-3100837219777951541</id><published>2010-08-02T07:15:00.000-07:00</published><updated>2010-09-03T09:04:32.197-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-03T09:04:32.197-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algoritmos" /><category scheme="http://www.blogger.com/atom/ns#" term="inteligencia artificial" /><category scheme="http://www.blogger.com/atom/ns#" term="programacion paralela" /><title>Algoritmos Genéticos Paralelos (I)</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://just4cool.files.wordpress.com/2008/12/dna.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 273px; height: 152px;" src="http://just4cool.files.wordpress.com/2008/12/dna.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt; Después de casi un año de letargo, me decidí a volver y escribir uno de los tantos posts que tengo en la cabeza hace un tiempo.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;Voy a tirar algunos conceptos básicos sobre lo que son los algoritmos genéticos paralelos.&lt;br /&gt;&lt;br /&gt;Había escrito el primer post sobre el tema, pero lo eliminé porque me pareció molesto tenerlo en dos blogs. Directamente dejo el otro lugar donde tengo las dos partes del informe ya terminadas y además porque es más elegante y te parsea codigo fuente.&lt;br /&gt;Bien, estos son los temas que trato:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;1. Una introducción a los Algoritmos Genéticos.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;   2. Explicación del Algoritmo Genético Simple.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;   3. Los algoritmos genéticos paralelos.&lt;br /&gt;&lt;br /&gt;Los temas 1 y 2 se ven acá:  &lt;a href="http://es.debugmodeon.com/articulo/algoritmos-geneticos-paralelos-i"&gt;Algoritmos Genéticos Paralelos (Parte 1)&lt;/a&gt;&lt;br /&gt;El tema 3, se puede ver acá: &lt;/span&gt;&lt;a style="color: rgb(0, 0, 0);" href="http://es.debugmodeon.com/articulo/algoritmos-geneticos-paralelos-ii"&gt;&lt;span style="color: rgb(0, 0, 153);font-family:arial;font-size:100%;"  &gt;Algoritmos Genéticos Paralelos (Parte 2)&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);font-family:verdana;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:arial;font-size:100%;"  &gt;Esta serie de artículos se trata de un informe que escribí para la cátedra de Computación Paralela de la facultad a la que asisto. Acepto sugerencias y críticas.&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);font-family:arial;font-size:100%;"  &gt; &lt;span style="color: rgb(0, 0, 0);"&gt;Salute!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-3100837219777951541?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/9m1EwWyhjjo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/3100837219777951541/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=3100837219777951541" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/3100837219777951541?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/3100837219777951541?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/9m1EwWyhjjo/algoritmos-geneticos-paralelos-i.html" title="Algoritmos Genéticos Paralelos (I)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2010/08/algoritmos-geneticos-paralelos-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkINR3g9fSp7ImA9WxBbGE4.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-6526751757013193236</id><published>2009-08-29T16:07:00.000-07:00</published><updated>2010-03-17T08:09:56.665-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-17T08:09:56.665-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="off-topics" /><title>Puliendo el vocabulario: Parámetros y Argumentos</title><content type="html">Tener un vocabulario preciso es una cuestión esencial al momento de querer recibir o transmitir conocimiento. Sin ir más lejos, cuando he leído libros o artículos sobre temas un tanto áridos de entender, me me he encontrado con que algunos autores no son precisos al momento de utilizar el vocabulario. En algunas ocasiones, esto me ha significado caer en los mismo errores que ellos, y lo que es peor, no comprender realmente lo que ellos han querido transmitir.&lt;br /&gt;&lt;br /&gt;En charlas en la facultad, discutiendo sobre problemas, me he encontrado que muchas personas no saben la diferencia -o la han olvidado- entre los parámetros y los argumentos de una función. Incluso buscando en internet he visto que muchas personas las confunden, o que para intentar simplificar su explicación de las mismas, las mezclan (que ridículo). En fin, en la página de MSDN encontré ambas definiciones muy sencillas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Diferencias entre parámetros y argumentos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  En la mayoría de los casos, un procedimiento necesita cierta información sobre las circunstancias en las que se le ha llamado. Un procedimiento que ejecuta tareas repetidas o compartidas utiliza datos distintos en cada llamada. Estos datos se componen de variables, constantes y expresiones que se transfieren al procedimiento cada vez que se le llama.&lt;br /&gt;&lt;br /&gt;  Para comunicar esta información al procedimiento, el procedimiento define un parámetro, y el código de llamada transfiere un argumento a dicho parámetro. Puede imaginar el parámetro como una plaza de aparcamiento y el argumento como un automóvil. Del mismo modo que diferentes automóviles puede aparcan en la misma plaza de aparcamiento en momentos distintos, el código de llamada puede transferir un argumento distinto al mismo parámetro cada vez que llama al procedimiento.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Parámetros&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  Un parámetro representa un valor que el procedimiento espera que se transfiera cuando es llamado. La declaración del procedimiento define sus parámetros.&lt;br /&gt;&lt;br /&gt;     El nombre de cada parámetro actúa como una variable local dentro del procedimiento. El nombre del parámetro se utiliza del mismo modo que cualquier otra variable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Argumentos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  Un argumento representa el valor que se transfiere a un parámetro del procedimiento cuando se llama al procedimiento. El código de llamada proporciona los argumentos cuando llama al procedimiento.&lt;br /&gt;&lt;br /&gt;     A diferencia de la definición de parámetros, los argumentos no tienen nombres. Cada argumento es una expresión que puede contener cero o más variables, constantes y literales. El tipo de datos de la expresión evaluada normalmente debe coincidir con el tipo de datos definido para el parámetro correspondiente, y en algún caso, debe poder convertirse al tipo del parámetro.&lt;br /&gt;&lt;br /&gt;Fuente: &lt;a href="http://msdn.microsoft.com/es-es/library/9kewt1b3%28VS.80%29.aspx"&gt;http://msdn.microsoft.com/es-es/library/9kewt1b3%28VS.80%29.aspx&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-6526751757013193236?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/adgQPXwh3Qg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/6526751757013193236/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=6526751757013193236" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6526751757013193236?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6526751757013193236?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/adgQPXwh3Qg/puliendo-el-vocabulario-parametros-y.html" title="Puliendo el vocabulario: Parámetros y Argumentos" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>3</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2009/08/puliendo-el-vocabulario-parametros-y.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIBQXY_fip7ImA9WxBbGEg.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-2789190303300609826</id><published>2009-05-29T09:16:00.000-07:00</published><updated>2010-03-17T13:42:30.846-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-17T13:42:30.846-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="UML" /><category scheme="http://www.blogger.com/atom/ns#" term="Casos de Uso" /><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura Software" /><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería de Sistemas" /><title>¿Validar las precondiciones?</title><content type="html">La idea de escribir este postsurgió de una charla que esuché ayer entre un compañero de la meteria "Diseño de Sistemas" y la profesora. Él decía que las precondiciones no se debían evaluar dentro del caso de uso -o sea que no debería ser parte del flujo de ese caso de uso el validar que dichas precondiciones se cumplirian- y por el contrario, son condiciones que ya deben haberse cumplido antes de disparar ese caso de uso. La profesora, en el otro extremo le decía que sí debían validarse dentro del caso de uso.&lt;br /&gt;&lt;br /&gt;En principio estuve de acuerdo con mi compañero, porque pensé que esa es justamente la definción de "precondición" (de hecho, la misma palabra lo dice).&lt;br /&gt;&lt;br /&gt;Además, la definición formal de &lt;span style="font-weight: bold;"&gt;precondición &lt;/span&gt;es: "&lt;span style="font-style: italic;"&gt;una operación que debe ser cierta cuando se invoca una operación&lt;/span&gt;". En el Manual de Referencia de UML se agrega, despues de esta definición, que &lt;span style="font-style: italic;"&gt;el receptor no debe tener que verificar la condición.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aunque con estos argumentos parece tener la última palabra mi compañero, la profesora tenía algo más que razón. Quizás su punto de vista no encaja exactamente con el del paradigma  de orientación a objetos, o mejor dicho, con las definiciones que se proponen en UML. ¿Entonces está mal su punto de vista?&lt;br /&gt;&lt;br /&gt;No. Si recordamos los principios básicos de la orientación a objetos, uno de ellos se refería a la capacidad de reutlizar componentes. Componentes que son de un sistema, pero sirven para otro, pueden ser reutilizados para evitar volver a construirlos. Un caso de uso, por ejemplo, puede ser reutilizado si dos sistemas tienen algun requisito en común. Este caso de uso tendrá sus propias precondiciones que el peimer sistema (llamémosle sistema A) se encarga de "poner a punto" antes de llamarlo. Con "poner a punto" me refiero a que el sistema sabe que caso de uso se llamará -previo al caso de uso que vamos compartir- de forma que el sistema queda en un estado tal que el caso de uso que vamos a compartir tiene "verificadas" esas precondiciones.&lt;br /&gt;¿Pero quien me asegura que esto sea realmente asi? o peor aún, ¿quien me asegura que el nuevo sistema (sistema B) también se encargue de llamar al caso de uso compartido con las precondiciones validadas? Nadie.&lt;br /&gt;&lt;br /&gt;Entonces, quizás sea esto lo que la profesora quería decir. Si el mismo caso de uso verificara sus precondiciones, entonces no hay problema de reutilizarlo, ya que el mismo se asegura -donde quiera que lo pongan- que las condiciones se validen. De no validarse, sencillamente no se ejecutará. Esto evita que el sistema llegue a estados no válidos, o de resultados incorrectos.&lt;br /&gt;&lt;br /&gt;Entonces, ¿para qué están las precondiciones? Bueno, es un dato más sobre la interfaz del caso de uso. Si conozco las precondiciones, no necesito saber que hace un caso de uso -qué valida y que no- sino simplemente usarlo. Es decir, la precondición como tal es un aspecto más bien ligado al análisis y al diseño, mientras que la verificacion de ésta está más ligada a la implementación.&lt;br /&gt;También ayudan a percibir los flujos posibles entre casos de uso: un caso de uso solo podrá ejecutarse si anteriormente, otros casos de uso han dejado el sistema en un estado tal que éste pueda ejecutarse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-2789190303300609826?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/QYBA1HBotBE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/2789190303300609826/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=2789190303300609826" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2789190303300609826?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2789190303300609826?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/QYBA1HBotBE/que-pasa-con-las-precondiciones.html" title="¿Validar las precondiciones?" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>4</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2009/05/que-pasa-con-las-precondiciones.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MDRnY6eip7ImA9WxJUEEQ.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-2584047933951697843</id><published>2009-05-04T08:13:00.000-07:00</published><updated>2009-07-08T17:31:17.812-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-08T17:31:17.812-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="problemas" /><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="Redes" /><category scheme="http://www.blogger.com/atom/ns#" term="Internet" /><title>Sincronizar carpetas para trabajar en RED</title><content type="html">&lt;div  style="text-align: justify;font-family:times new roman;"&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;              &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: arial;font-size:100%;" &gt;En este post quiero comentar un esquema -y un programa que permite implementarlo- para la sincronización de recursos que nos facilite el trabajo en red.&lt;br /&gt;&lt;br /&gt;Hace tiempo que estaba buscando un buen programa para sincronizar carpetas con un servidor en internet. La finalidad era mantener mis archivos actualizados en cualquier equipo que yo quisiera, sin tener que copiarlos y mantener esa actualización "a mano".&lt;br /&gt;&lt;br /&gt;Este problema se vio incrementado aún más, cuando comenzamos a hacer trabajos de campo en quipo en la facultad. Por ahi se necesita tener demasiados archivos al alcance de todo el equipo (de unas 10 personas en mi caso) y donde no resulta cómodo pasarse los archivos por mail, pendrives, o de alguna otra manera. Es decir, lo que se busca es que &lt;span style="font-weight: bold; font-style: italic;"&gt;todo &lt;/span&gt;&lt;span style="font-style: italic;"&gt;este al alcance de &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;todos&lt;/span&gt; &lt;/span&gt;sin hacer esfuerzo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Generalmente, cada intgrante del equipo tendra su propio equipo para trabajar (pc, portatil, etc) y dentro de su equipo tendrá un directorio para cada proyecto. ¡Que bueno si ese directorio puediera compartirse con el resto del equipo!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Bueno... de hecho, se puede: Windows XP lo permite. Pero hay una gran contra: sólo un equipo puede compartir su recurso (una carpeta por ejemplo), y todos los miembros tendrán que acceder a esa carpeta para leer o modificar archivos. Pero lo peor, es que ese equipo tendrá que estar encendido y conectado a la red cada vez que un integrante "remoto" quiera acceder a él para trabajar. Con esto desechamos el "compartir carpetas" de windows y lo enviamos a la papelera de reciclaje ;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Después de probar bastante (y buscar muchisimo), di con un programa que hasta ahora no me da motivos de queja: &lt;a href="http://allwaysync.com/"&gt;Allways Sync&lt;/a&gt;. Es licencia freeware, muy fácil e intuitivo. Solo hay que tener claro qué es lo que se quiere hacer (como pasa siempre, ¿no? xD).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Ahora explico con un esquema cual era mi objetivo para trabajar:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nLAO39nr9Ys/Sf8MwtyvWUI/AAAAAAAAAyQ/5eHkD9IIz-s/s1600-h/nodoss.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 150px;" src="http://3.bp.blogspot.com/_nLAO39nr9Ys/Sf8MwtyvWUI/AAAAAAAAAyQ/5eHkD9IIz-s/s320/nodoss.JPG" alt="" id="BLOGGER_PHOTO_ID_5331994514895624514" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;El funcionamiento de este esquema es adecuado porque que cualquier equipo puede realizar modificaciones sobre sus carpetas. Estas carpetas se sincronizacn con el servidor -probablemente un servicio de FTP- y cada uno de los otros equipos, cuando se encienda -o si ya está encendido- sincronizará con el servidor y actualizará los archivos. Algo así:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nLAO39nr9Ys/Sf8QTXbj9gI/AAAAAAAAAyY/-F8uNaQyWh4/s1600-h/nodoss.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_nLAO39nr9Ys/Sf8QTXbj9gI/AAAAAAAAAyY/-F8uNaQyWh4/s320/nodoss.JPG" alt="" id="BLOGGER_PHOTO_ID_5331998408723133954" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Con este programa que mencioné esto es posible, e incluso el mismo software da muchas más posibilidades que no voy a describir pero están en la página del mismo.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Su configuración para este esquema es muy sencilla, básicamente:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Instalamos All Sync en cada equipo, y por cada equipo realizamos los siguientes pasos.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol  style="text-align: left;font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Seleccionamos el "&lt;span style="font-style: italic;"&gt;origen&lt;/span&gt;" y el "&lt;span style="font-style: italic;"&gt;destino&lt;/span&gt;". El origen será la carpeta de nuestro equipo que queremos mantener sincronizada con el "destino", que en este caso será el sitio FTP.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Configuramos el acceso al servidor FTP (servidor, usuario, password, etc).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Opcionalmente, podemos ir a las opciones de esta tarea y marcar la opción de que &lt;span style="font-style: italic;"&gt;se realice una sincronización cada vez que se modifique algún archivo&lt;/span&gt; e incluso que &lt;span style="font-style: italic;"&gt;se haga una sincronización cada cierto tiempo&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Listo!&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:130%;"&gt;                     &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Increiblemente, es asi de sencillo. Hay muchas más opciones, pero esas son las principales para este esquema.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Las ventajas principales son:&lt;br /&gt;&lt;/span&gt;&lt;ul  style="text-align: left;font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;No es necesario que un equipo en particular esté prendido para trabajar, ya que los datos están en el mismo equipo que los necesite.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Si un equipo o el servidor falla y pierde sus archivos, existen copias en los otros equipos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Es posible trabajar remotamente sin necesidad de preocuparse por nada, excepto porder acceder a la red de comunicaciones (en este caso se supone que es internet).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Aún sin una conexión, se puede realizar todos los cambios que se desee, y éstos se actualizaran en el resto de los nodos de trabajo (equipos, servidor, etc) cuando haya una conexión disponible.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;La desventajas principales son:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul  style="text-align: left;font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Se requiere una buena política de versionado y posiblemente backups para evitar que un equipo realice modifiaciones indeseables (borrado de archivos, actualizaciones erroneas, etc)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Si no se cuenta con una conexión a la red de comunicaciones, no se pueden actualizar los archivos de forma indemdiata.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:times new roman;font-size:100%;"  &gt;Espero que ésto les sea de utilidad. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-2584047933951697843?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/37cN1t_j9YM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/2584047933951697843/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=2584047933951697843" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2584047933951697843?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2584047933951697843?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/37cN1t_j9YM/sincronizar-recursos-para-trabajar-en.html" title="Sincronizar carpetas para trabajar en RED" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nLAO39nr9Ys/Sf8MwtyvWUI/AAAAAAAAAyQ/5eHkD9IIz-s/s72-c/nodoss.JPG" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2009/05/sincronizar-recursos-para-trabajar-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IDRHo7eip7ImA9WxJUEEQ.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-6098759510192099978</id><published>2009-04-29T11:54:00.000-07:00</published><updated>2009-07-08T17:32:55.402-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-08T17:32:55.402-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="UML" /><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura Software" /><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería de Sistemas" /><title>Avances de UML: Modelado en Colores (Parte 1)</title><content type="html">&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uidesign.net/sooug/images/DNCDec2000_ClassDiagram.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 220px; height: 155px;" src="http://www.uidesign.net/sooug/images/DNCDec2000_ClassDiagram.gif" alt="" border="0" /&gt;&lt;/a&gt;             &lt;span style="color: rgb(0, 0, 0); font-family: arial;font-family:arial;font-size:100%;"  &gt;UML tal y como se lo usa en la mayoría de lo casos, nos permite mantener un nivel de abstracción que elegimos nosotros mismos. Y lo elegimos se&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: arial;font-family:arial;font-size:100%;"  &gt;gún cual sea el nivel de detalle que nos interese percibir en un determinado modelo. Por ejemplo, en una clase de análisis, no nos importa conocer el tipo de dato que un atributo puede tener; con saber con el atributo existe nos basta; e incluso, si nos abstraemos más aún, podemos lograr que ese mismo atributo sea totalmente irrelevante, a tal punto que desaparezca por completo de la clase (aunque cuidado, para niveles menores de abstracción, éste seguirá existiendo).&lt;/span&gt;&lt;/div&gt;&lt;p class="MsoNormal"  style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;font-family:arial;"&gt;  &lt;/p&gt;&lt;p class="MsoNormal"  style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;Técnicas de abstracción hay muchas, y más de una vez nosotros mismos tenemos nuestras propias formas “simplificar un modelo” aún sin pretenderlo conscientemente.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;font-family:georgia;"&gt;&lt;span style="font-size:100%;"&gt;C&lt;/span&gt;&lt;span style="font-size:100%;"&gt;omo ejemplo, en UML, podemos agrupar los elementos que se pueden manipular como un todo en los llamados &lt;i&gt;paquetes&lt;/i&gt;. Y esto, nos permite concentrarnos en el paquete como una sola cosa, y no como los muchos componentes que puede contener. Esto es realmente útil cuando tenemos demasiados elementos para analizarlos todos en detalles, y más aún, cuando algunos de esos elementos &lt;i style=""&gt;no los queremos analizar&lt;/i&gt; en detalle. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;Utilizar paquetes, es sólo una forma de abstraernos de algunos aspectos del dominio. Seguramente existen muchas otras, pero sin duda una de las más interesantes, tiene que ver con el uso de colores en los diagramas de UML.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;Peter Coad, Eric Lefevre y Jeff De Luca realizaron investigaciones sobre este último punto: el uso de colores para el modelado de sistemas. El lenguaje que utilizaron para “colorear” fue el Lenguaje Unificado de Modelado (UML). El resultado de estas investigaciones, es una notable técnica, que nos permite identificar a simple vista, los &lt;i style=""&gt;distintos&lt;/i&gt; &lt;i style=""&gt;tipos de elementos&lt;/i&gt; que existan en un dominio de negocio dado, y además nos permite saber &lt;i style=""&gt;qué&lt;/i&gt; &lt;i style=""&gt;tipos de elementos&lt;/i&gt; son. A este “&lt;i style=""&gt;tipo de elementos&lt;/i&gt;” ellos les llamaron: &lt;i style=""&gt;arquetipos.&lt;/i&gt; (“archetypes”, en inglés). En su libro “&lt;i style=""&gt;JAVA Modeling COLOR with UML” ([Coad99])&lt;/i&gt; explican con detalle ésta técnica.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" face="arial" style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;"&gt;&lt;span style="font-size:100%;"&gt;Esta técnica de coloreado nos permite &lt;b style=""&gt;analizar un modelo&lt;/b&gt; y entenderlo rápidamente por encima. El hecho de usar color en un modelo –por ejemplo, en un diagrama de clases- no da una perspectiva general de cómo está conformado el modelo, aún antes de mirarlo con detalle, porque como veremos más adelantes, estos modelos siguen un patrón genérico llamado “&lt;i style=""&gt;Componente de Dominio Neutral&lt;/i&gt;” (Domain-Neutral Component).&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 35.4pt; color: rgb(0, 0, 0); font-family: arial;"&gt;&lt;span style="font-size:100%;"&gt;Esta técnica, además de ayudar a quién examina un modelo, también ayuda a &lt;b style=""&gt;diseñar modelos&lt;/b&gt;. Esto es así porque si tenemos en cuenta que los procesos de negocio siguen ciertos patrones (algo que Coad y los otros notaron), entonces se puede armar un modelo con sólo identificar las partes del dominio donde se pueden ajustar esos patrones.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-size:100%;" &gt;&lt;br /&gt;&lt;br /&gt;(continuará..)&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-6098759510192099978?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/JoTtNrspPQA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/6098759510192099978/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=6098759510192099978" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6098759510192099978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/6098759510192099978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/JoTtNrspPQA/avances-de-uml-parte-1.html" title="Avances de UML: Modelado en Colores (Parte 1)" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2009/04/avances-de-uml-parte-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQCRnw-eSp7ImA9WxJQFk8.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-9174000019063535899</id><published>2009-03-26T23:58:00.000-07:00</published><updated>2009-05-29T11:39:27.251-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T11:39:27.251-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="UML" /><category scheme="http://www.blogger.com/atom/ns#" term="Casos de Uso" /><category scheme="http://www.blogger.com/atom/ns#" term="Arquitectura Software" /><category scheme="http://www.blogger.com/atom/ns#" term="Ingeniería de Sistemas" /><title>¿Generalizacion o Inclusion? Esa es la cuestion.</title><content type="html">Esta pregunta surgió en un curso de Diseño de Sistemas, en tanto la profesora pretendia poner a prueba los conocimientos conceptuales supuestamente adquiridos por los alumnos en el curso anterior de Analisis de Sistemas. Todos tiraban ideas, pero costo un buen tiempo entre los cincuenta alumnos llegar a una conclusion importante.&lt;br /&gt;&lt;br /&gt;Podemos imaginarnos el siguiente diagrama de Casos de Uso. Si la descripcion del sistema dice que “los pacientes pueden internarse por obra social o de forma particular”, es casi evidente –intuitivo incluso- pensar en una especialización de un caso mas general denominado “Internar”. Algo así:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nLAO39nr9Ys/Scx6myhZBhI/AAAAAAAAAxk/ik2mEiPBQwU/s1600-h/gen.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 224px;" src="http://3.bp.blogspot.com/_nLAO39nr9Ys/Scx6myhZBhI/AAAAAAAAAxk/ik2mEiPBQwU/s400/gen.JPG" alt="" id="BLOGGER_PHOTO_ID_5317760066833155602" border="0" /&gt;&lt;/a&gt;Esto a simple vista nos resulta correcto, aceptable y hasta tipico y seguimos adelante. Pero la pregunta que podria surgirnos es. ¿Por que especializamos? ¿Por que no incluimos? Es decir, ¿estaria mal el siguiente diagrama?&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nLAO39nr9Ys/Scx6yP-cLaI/AAAAAAAAAxs/vV51NtGKIrA/s1600-h/inc.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 235px;" src="http://3.bp.blogspot.com/_nLAO39nr9Ys/Scx6yP-cLaI/AAAAAAAAAxs/vV51NtGKIrA/s400/inc.JPG" alt="" id="BLOGGER_PHOTO_ID_5317760263718186402" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;Que diferencia presenta con el anterior, si ambos pueden hacer exactamente lo mismo. Para asegurarnos de esto, recordemos que es una generalizacion y que es una inclusion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Inclusion&lt;/span&gt;: &lt;span style="font-style: italic;"&gt;Es una forma de interaccion, un caso de uso dado puede "incluir" otro. El primer caso de uso a menudo depende del resultado del caso de uso incluido. Esto es util para extraer comportamientos comunes desde multiples casos de uso a una descripcion individual, desde el caso de uso que lo incluye hasta el caso de uso incluido. El comportamiento del caso incluido es colocado dentro del comportamiento del caso de uso base. No hay parametros o valores de retorno.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generalizacion:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Un caso de uso dado puede estar en una forma especializada de un caso de uso existente. Esto se asemeja al concepto orientado a objetos de sub-clases. En la practica puede ser util generalizar comportamientos comunes, describirlos una vez, y enfrentarse a los detalles excepcionales en los casos de uso especializados. Entonces la Generalizacion es la actividad de identificar elementos en común entre conceptos y definir las relaciones de un concepto general y un concepto especializado. Es una manera de construir clasificaciones taxonomicas entre conceptos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ya tenemos definidos ambos tipos de relaciones. Las definiciones parecen indicar que estos conceptos son bastante diferentes el uno del otro, y, de hecho los son, pero ¿donde radica la diferencia en el ejemplo dado? Es posible implementar un sistema usando el modelo con generalizacion, y funcionaria de la misma manera que si se implementara el modelo de inclusion.&lt;br /&gt;&lt;br /&gt;En el primero, el paciente va a internarse activando el CU “Internar”. Supongamos que el paciente tiene una obra social: entonces el C.U. que se activa es “Internar con Obra Social” aplicando los pasos generales de “Internar” y en el punto indicado se siguen los pasos que pertenecen a la especializacion que, en este caso, se es “Internar con Obra Social”.&lt;br /&gt;&lt;br /&gt;En el segundo modelo, el paciente activa directamente el caso de uso “Internar con Obra Social”, el cual realizara los pasos referidos a una internación con obra social  llamara al caso de uso “Internar” en el momento que deba realizar los pasos generales.&lt;br /&gt;Como vemos, ambos funcionan sin problemas. La pregunta –insisto- es: ¿porque el segundo no se utiliza?&lt;br /&gt;&lt;br /&gt;Dejo abierta la pregunta para quien quiera pensarlo un poco.&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-9174000019063535899?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/otzNtPujYLw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/9174000019063535899/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=9174000019063535899" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/9174000019063535899?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/9174000019063535899?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/otzNtPujYLw/generalizacion-o-inclusion-esa-es-la.html" title="¿Generalizacion o Inclusion? Esa es la cuestion." /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_nLAO39nr9Ys/Scx6myhZBhI/AAAAAAAAAxk/ik2mEiPBQwU/s72-c/gen.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2009/03/generalizacion-o-inclusion-esa-es-la.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4BQX84eSp7ImA9WhZRFEg.&quot;"><id>tag:blogger.com,1999:blog-2715874640743883267.post-2105053396328841096</id><published>2008-10-02T16:33:00.000-07:00</published><updated>2011-04-10T08:55:50.131-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-10T08:55:50.131-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Restar fechas en C#</title><content type="html">Para comprobar el vencimiento de una fecha, es una buena idea usar la clase &lt;span style="font-weight: bold;"&gt;TimeSpan &lt;/span&gt;que provee la plataforma .NET. En mi caso, estoy usando la fecha de vencimiento del tipo &lt;span style="font-weight: bold;"&gt;DateTime&lt;/span&gt;, con lo cual en un princpio tuve problemas para hacer una resta de esa fecha con la fecha actual.&lt;br /&gt;&lt;br /&gt;Foreando encontré varias propuestas que al menos a mi, no me funcionaron, ya que intentaban usar el metodo &lt;span style="font-weight: bold;"&gt;Substract &lt;/span&gt;de la clase &lt;span style="font-style: italic;"&gt;DateTime&lt;/span&gt;, con un parametro &lt;span style="font-style: italic;"&gt;DateTime&lt;/span&gt;; y esto no es posible porque -según mi compilador- no podia convertir &lt;span style="font-style: italic;"&gt;DateTime &lt;/span&gt;en &lt;span style="font-style: italic;"&gt;TimeSpan&lt;/span&gt;. Lo extraño, es que este metodo esta sobrecargado para aceptar ambos tipos de datos...&lt;br /&gt;&lt;br /&gt;Pero en fin, una manera sencilla -y a mi gusto muy prolija-  de hacerlo, es implementando un metodo al que podemos llamar, por ej, &lt;span style="font-style: italic;"&gt;ObtenerDias &lt;/span&gt;y que le pasemos como argumento dos fechas (de tipo &lt;span style="font-weight: bold;"&gt;DateTime&lt;/span&gt;). Lo que nos devuleve es la diferencia en días entre dichas fechas. ( Obviamente, bien podría ser la diferencia en meses, años, segundos etc..)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;&lt;br /&gt;public double ObtenerDias( DateTime Fecha1, DateTime Fecha2)&lt;br /&gt;{&lt;br /&gt;        TimeSpan T1, T2;&lt;br /&gt;        double diff;&lt;br /&gt;&lt;br /&gt;        T1 = new TimeSpan( Fecha1.Ticks );&lt;br /&gt;        T2 = new TimeSpan( Fecha2.Ticks );&lt;br /&gt;&lt;br /&gt;        diff = ( T1.Substract(T2) ).TotalDays;&lt;br /&gt;&lt;br /&gt;        return diff;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La clase &lt;span style="font-style: italic;"&gt;TimeSpan &lt;/span&gt;tiene la propiedad '&lt;span style="font-weight: bold;"&gt;Ticks&lt;/span&gt;' como unidad de medida. Solo obtenemos los ticks de cada fecha, los restamos y mediante la propiedad &lt;span style="font-weight: bold;"&gt;TotalDays &lt;/span&gt;obtenemos la cantidad total de días entre ambas fechas. Logicamente se puede obtener &lt;span style="font-style: italic;"&gt;TotalYears&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;TotalMinutes&lt;/span&gt;, etc.. Pero hay que tener cuidado con la propiedad '&lt;span style="font-style: italic;"&gt;Days&lt;/span&gt;' que no es lo mismo que '&lt;span style="font-style: italic;"&gt;TotalDays&lt;/span&gt;', ya que &lt;span style="font-style: italic;"&gt;Days&lt;/span&gt; solo mide la cantidad de dias que corresponden al mes del año de la diferencia entre ambas fechas.. Por ejemplo:&lt;br /&gt;&lt;br /&gt;si &lt;span style="font-style: italic;"&gt;TotalDays = 35&lt;/span&gt;, entonces &lt;span style="font-style: italic;"&gt;Days = 4&lt;/span&gt; debido a que los 31 dias anteriores, corresponden al mes anterior y no se cuentan en el mes del ultimo de los 35 dias.&lt;br /&gt;&lt;br /&gt;Me agradaría saber si esto les ha resultado de interés y si les ha servido. Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2715874640743883267-2105053396328841096?l=includeblogh.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/fGwM/~4/uXi5xDMyLqU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://includeblogh.blogspot.com/feeds/2105053396328841096/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2715874640743883267&amp;postID=2105053396328841096" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2105053396328841096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2715874640743883267/posts/default/2105053396328841096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/fGwM/~3/uXi5xDMyLqU/restar-fechas-en-c.html" title="Restar fechas en C#" /><author><name>Ignacio</name><uri>http://www.blogger.com/profile/00777464846297951418</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://4.bp.blogspot.com/-hWJEECisT5k/TaCss9v6UTI/AAAAAAAABHM/PggwAF8dLIc/s220/DSC00329%2B%2528Large%2529.JPG" /></author><thr:total>3</thr:total><feedburner:origLink>http://includeblogh.blogspot.com/2008/10/restar-fechas-en-c.html</feedburner:origLink></entry></feed>

