<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[code segment (3.0)]]></title>
  <link href="http://blog.ideseg.com/atom.xml" rel="self"/>
  <link href="http://blog.ideseg.com/"/>
  <updated>2012-02-06T10:10:38+01:00</updated>
  <id>http://blog.ideseg.com/</id>
  <author>
    <name><![CDATA[Carlos Segura]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Un tracker en node.js (2)]]></title>
    <link href="http://blog.ideseg.com/blog/2012/02/03/un-tracker-en-node-dot-js-2/"/>
    <updated>2012-02-03T15:08:00+01:00</updated>
    <id>http://blog.ideseg.com/blog/2012/02/03/un-tracker-en-node-dot-js-2</id>
    <content type="html"><![CDATA[<h3>Cambios</h3>

<p>He continuado jugando con node.js, cuando he cogido el proyecto he decidido hacer algunos cambios en el modelo, esto pasa cuando no hay nada planificado … Hoy he decidido cambiar la estructura de los datos y eliminar los documentos anidados y que la colección principal sea una colección plana. Esto simplifica mucho las cosas a la hora de hacer consultas, el otro día como esta enredando con mongoose, me deje llevar :)</p>

<p>Por el momento la estructura era:</p>

<pre><code>hosts (code)
    - stats []
</code></pre>

<p>Ahora la colección principal será entries, para des-anidar haremos lo siguiente</p>

<pre><code>db.hosts.find({}).forEach(function(v) { 
  v.stats.forEach( function(s) { 
    s["code"] = v.code; 
    db.entries.insert(s); 
  }) 
})
</code></pre>

<p>Con esto creamos una nueva colección llamada &#8216;entries&#8217; en la que hemos metido cada uno de las fila de stats y le hemos añadido el código del padre. voila ..</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Un tracker en node.js (1)]]></title>
    <link href="http://blog.ideseg.com/blog/2012/02/01/un-tracker-en-node-dot-js-1/"/>
    <updated>2012-02-01T12:23:00+01:00</updated>
    <id>http://blog.ideseg.com/blog/2012/02/01/un-tracker-en-node-dot-js-1</id>
    <content type="html"><![CDATA[<h3>Tarde</h3>

<p>La verdad es que llevaba tiempo con ganas de hacer alguna cosita en node.js, pero no había tenido ocasión, así que con el remordimiento de llegar tarde he sacado un ratito para jugar un poco.</p>

<p>Como siempre el objetivo es aprender y evaluar. Para ello he pensado en hacer un tracker web, je otra cosa que parece que esta de moda ¿tendrá que ver?.</p>

<p>La cosa es que he empezado y la cosa no pinta mal. Básicamente haré un tracker (luego mejorará), que será intrusivo, es decir que requerirá de un script en la página que nos enviará la información una vez esta pase al cliente. Vamos al igual que hace google analytics con su ga.js</p>

<p>Usaré <a href="http://nodejs.org">node.js</a>, el framework de <a href="http://expressjs.com/">express</a> para la front-end, <a href="http://jade-lang.com/">jade</a> para las plantillas, <a href="http://www.mongodb.org/">mongo</a> para almacenar los datos, <a href="http://mongoosejs.com/">mongoose</a> como módulo desde node.js</p>

<p>La información que guardaré por el momento la podemos ver en el modelo que he creado en mongo.</p>

<figure class='code'><figcaption><span>models/hosts.js  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">mongoose</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mongoose&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">Schema</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">Schema</span>
</span><span class='line'>  <span class="p">,</span> <span class="nx">ObjectId</span> <span class="o">=</span> <span class="nx">Schema</span><span class="p">.</span><span class="nx">ObjectId</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">StatsSchema</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">created_at</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="nb">Date</span><span class="p">,</span> <span class="s1">&#39;default&#39;</span><span class="o">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span> <span class="p">},</span>
</span><span class='line'>  <span class="nx">tracked_at</span><span class="o">:</span> <span class="nb">Date</span><span class="p">,</span>   <span class="c1">// client datetime</span>
</span><span class='line'>  <span class="nx">hostname</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>    <span class="c1">// document.location.hostname</span>
</span><span class='line'>  <span class="nx">port</span><span class="o">:</span><span class="nb">Number</span><span class="p">,</span>        <span class="c1">// document.location.port</span>
</span><span class='line'>  <span class="nx">protocol</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>    <span class="c1">// document.location.protocol</span>
</span><span class='line'>  <span class="nx">pathname</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>    <span class="c1">// document.location.pathName</span>
</span><span class='line'>  <span class="nx">referrer</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>    <span class="c1">// document.referrer (r)</span>
</span><span class='line'>  <span class="nx">title</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>       <span class="c1">// document.title</span>
</span><span class='line'>  <span class="nx">user_agent</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>  <span class="c1">// navigator usr agent</span>
</span><span class='line'>  <span class="nx">address</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>     <span class="c1">// end-client address (ip)</span>
</span><span class='line'>  <span class="nx">lng</span><span class="o">:</span><span class="nb">Number</span><span class="p">,</span>         <span class="c1">// geo-code</span>
</span><span class='line'>  <span class="nx">lat</span><span class="o">:</span><span class="nb">Number</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">HostsSchema</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Schema</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">code</span><span class="o">:</span><span class="nb">Number</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">host</span><span class="o">:</span><span class="nb">String</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">stats</span><span class="o">:</span><span class="p">[</span><span class="nx">StatsSchema</span><span class="p">]</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">exports</span> <span class="o">=</span> <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Hosts</span> <span class="o">=</span> <span class="nx">mongoose</span><span class="p">.</span><span class="nx">model</span><span class="p">(</span><span class="s1">&#39;Hosts&#39;</span><span class="p">,</span> <span class="nx">HostsSchema</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>desde nuestra app enviaremos el script, para ello he añadido dos rutas</p>

<figure class='code'><figcaption><span>app.js  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/wstat.js&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">sendfile</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/public/javascripts/wstat.js&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/wstat.gif&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">saveStats</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">res</span><span class="p">.</span><span class="nx">sendfile</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">&#39;/public/images/wstat.gif&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>el cliente primero demandará nuestro script wstat.js, mediante el siguiente script que se cargará de manera asíncrona, es básicamente lo que hace google analytics genera el DOM y lo inserta en nuestra página, incluso lleva nuestro código de seguimiento para poder rastrear diferentes sitios</p>

<figure class='code'><figcaption><span>wstat_client.js  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">wstat</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;script&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">wstat</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s1">&#39;text/javascript&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">wstat</span><span class="p">.</span><span class="nx">async</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">wstat</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s1">&#39;wstat&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">wstat</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="s1">&#39;code&#39;</span><span class="p">,</span> <span class="s1">&#39;9999&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">wstat</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s1">&#39;//HOST_NAME/wstat.js&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">e</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">&#39;script&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>  <span class="nx">e</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nx">insertBefore</span><span class="p">(</span><span class="nx">wstat</span><span class="p">,</span> <span class="nx">e</span><span class="p">);</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>este script lo que hace es cargar wstat.js que será el encargado de trasmitirnos parte de la información relevante a nuestra página, la otra parte la extraeremos de los datos de la petición (request)</p>

<figure class='code'><figcaption><span>wstat.js  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">script</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;wstat&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">code</span> <span class="o">=</span> <span class="nx">script</span><span class="p">.</span><span class="nx">getAttribute</span><span class="p">(</span><span class="s1">&#39;code&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">image</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Image</span><span class="p">();</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">script</span><span class="p">.</span><span class="nx">src</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s1">&#39;/wstat.js&#39;</span><span class="p">,</span> <span class="s1">&#39;/wstat.gif&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;?c=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nx">code</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;d=&quot;</span> <span class="o">+</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">getTime</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;h=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hostname</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;p=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">pathname</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;pl=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">protocol</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;pr=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">port</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;rf=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">referrer</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">+=</span> <span class="s2">&quot;&amp;t=&quot;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">title</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">image</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="nx">url</span><span class="p">;</span>
</span><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>este script, genera en el dom una imagen y como src le pasa la dirección de nuestro script sustituyendo el script por una imagen y añadiendo los parámetros que queremos obtener del cliente.</p>

<p>cuando se solicita la imagen hay un <strong>saveStats(req)</strong> que es el que se encarga de almacenar los datos en nuestra base de datos</p>

<figure class='code'><figcaption><span>app.js  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">saveStats</span><span class="p">(</span><span class="nx">req</span><span class="p">)</span> <span class="p">{</span> 
</span><span class='line'>    <span class="kd">var</span> <span class="nx">code</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;c&#39;</span><span class="p">,</span> <span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">stats</span> <span class="o">=</span> <span class="nx">getStats</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">Hosts</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span> <span class="nx">code</span><span class="o">:</span> <span class="nx">code</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">doc</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">doc</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">doc</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Hosts</span><span class="p">({</span>
</span><span class='line'>                    <span class="nx">code</span><span class="o">:</span><span class="nx">code</span><span class="p">,</span>
</span><span class='line'>                    <span class="nx">stats</span><span class="o">:</span> <span class="p">[]</span>
</span><span class='line'>                <span class="p">});</span>
</span><span class='line'>                <span class="nx">doc</span><span class="p">.</span><span class="nx">save</span><span class="p">();</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="nx">doc</span><span class="p">.</span><span class="nx">stats</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">stats</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">doc</span><span class="p">.</span><span class="nx">save</span><span class="p">();</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>primero busca si tenemos ya una entrada para nuestro código de seguimiento, en caso de que no exista la crea y almacena las estadísticas que obtenemos de la petición</p>

<figure class='code'><figcaption><span>app.js  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">getStats</span><span class="p">(</span><span class="nx">req</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">date</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;d&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">hostname</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;h&#39;</span><span class="p">));</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">pathname</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;p&#39;</span><span class="p">));</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">protocol</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;pl&#39;</span><span class="p">));</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">port</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;pr&#39;</span><span class="p">));</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">referrer</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;rf&#39;</span><span class="p">));</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">title</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">param</span><span class="p">(</span><span class="s1">&#39;t&#39;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">tracked_at</span><span class="o">:</span> <span class="nx">date</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">hostname</span><span class="o">:</span> <span class="nx">hostname</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">pathname</span><span class="o">:</span> <span class="nx">pathname</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">protocol</span><span class="o">:</span> <span class="nx">protocol</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">port</span><span class="o">:</span> <span class="nx">port</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">referrer</span><span class="o">:</span> <span class="nx">referrer</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">user_agent</span><span class="o">:</span><span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">[</span><span class="s1">&#39;user-agent&#39;</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">address</span><span class="o">:</span> <span class="nx">req</span><span class="p">.</span><span class="nx">socket</span><span class="p">.</span><span class="nx">remoteAddress</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">title</span><span class="o">:</span> <span class="nx">title</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h4>primeras conclusiones</h4>

<p>Bueno, la programación de este mini proyecto solo me ha tomado unas horas, lo cual es BUENO, como prototipo la cosa ha ido bastante decente, alguna pequeña cosa a la hora de hacer el deployment que por el momento hago un un shell script .. de las pruebas y de otras cosas hablaré en otros posts, que esto va para largo y de momento node.js se queda.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[amplificador para el iphone (2)]]></title>
    <link href="http://blog.ideseg.com/blog/2012/01/25/amplificador-para-el-iphone-2/"/>
    <updated>2012-01-25T21:41:00+01:00</updated>
    <id>http://blog.ideseg.com/blog/2012/01/25/amplificador-para-el-iphone-2</id>
    <content type="html"><![CDATA[<p>Ya os enseñe como había quedado el ampli en <a href="http://blog.ideseg.com/blog/2012/01/23/amplificador-para-el-iphone/">la primera brico-sesión</a>, en la segunda lo he completado .. lo primero ha sido hacer un pequeño transformador 12v -> 5v algo sencillo usando un integrado 7805 el esquema que he seguido es este ..</p>

<p><img src="https://lh4.googleusercontent.com/-nlmroy33Yoo/TyBuyuZZ0rI/AAAAAAAAAJc/qSX9XoV3jW4/s288/IMG_0497.jpg" alt="image" /></p>

<p>El montaje bueno, nada complicado (la placa ya la cortaré un poco, más adelante)</p>

<p><img src="https://lh5.googleusercontent.com/--fwcftrY5Es/TyBot3WZ-MI/AAAAAAAAAH4/Lah8RQIeyOM/s288/IMG_0485.JPG" alt="image_l" /></p>

<p><img src="https://lh5.googleusercontent.com/-Aooi9RLYgYg/TyBox8oRRKI/AAAAAAAAAIY/NmrzetIqfiM/s288/IMG_0489.JPG" alt="image" /></p>

<p>Obviamente la prueba unitaria :-). Y después una prueba de integración</p>

<p><img src="https://lh4.googleusercontent.com/-2UgB3J0AlqM/TyBo0EEnGRI/AAAAAAAAAIo/5Hkdw1MY6Es/s288/IMG_0491.JPG" alt="image" /></p>

<p>Y finalmente este es el resultado .. suena fenómeno .. y solo 51 eurillos</p>

<p><img src="https://lh6.googleusercontent.com/-0WPHXv1hP5s/TyBo3PlBL1I/AAAAAAAAAJA/6oOWGEhURPA/s400/IMG_0494.JPG" alt="image" /></p>

<p>Por cierto, el ampli tiene integrada una radio, control de graves y agudos.</p>

<p><a href="https://picasaweb.google.com/101650827713482282224/Amplificador_iphone#">Fotos</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Blog v3.0]]></title>
    <link href="http://blog.ideseg.com/blog/2012/01/24/blog-v3-dot-0/"/>
    <updated>2012-01-24T10:02:00+01:00</updated>
    <id>http://blog.ideseg.com/blog/2012/01/24/blog-v3-dot-0</id>
    <content type="html"><![CDATA[<p>Nuevo blog, dejo atrás el <a href="http://oldblog.ideseg.com">anterior</a>, que estaba basado en WordPress y me paso a algo un poco más friki <a href="http://octopress.org/">octopress</a>. Por el momento no tengo intenciones de pasar los antiguos artículos que se pueden consultar aquí <a href="http://oldblog.ideseg.com">oldblog.ideseg.com</a> aunque existe un mágnifico script llamado <a href="https://github.com/thomasf/exitwp">exitwp</a> de Thomas Frössman, que permite extraer los posts y las imágenes de WordPress, yo lo he hecho y funciona perfectamente. Antes de ejecutarlo hacer una limpieza de los comentarios en WordPress y eliminar el spam.</p>

<p>Está vez en la mudanza he hecho limpieza y no me apetece llevar las maletas nuevas cargadas de cosas viejas, si acaso alguna joyita.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[amplificador para el iphone]]></title>
    <link href="http://blog.ideseg.com/blog/2012/01/23/amplificador-para-el-iphone/"/>
    <updated>2012-01-23T23:15:00+01:00</updated>
    <id>http://blog.ideseg.com/blog/2012/01/23/amplificador-para-el-iphone</id>
    <content type="html"><![CDATA[<p>A ver que con la que nos esta cayendo .. me hubiera gustado pillarme unos altavoces de esos chulos para el iphone, pero eso sí, de los buenos, los que nos gustan a todos, los que valen una pasta :-)</p>

<p>Pero con esto de recortar gastos&#8230;. no encontré una razón para justificar la compra :-(, y como por el trastero guardo mi vieja cadena de música a la cual en su día le pille unos estupendo altavoces B&amp;W (entonces no había crisis :-), me puse a pensar en subir toda la cadena, ampli, cd, radio a casa, pero eso ocupa un montón.</p>

<p>Bueno la cosa es que estas navidades vi el cacharrito este de <a href="http://www.logitech.com/es-es/speakers-audio/home-pc-speakers/devices/8087">logitech</a>, que puedes pincharlo en tu cadena por la entrada aux y por BT puedes escuchar tu iphone, de modo en que la idea de volver a subir la cadena a casa molaba, lo que no molaba nada era el espacio que necesita y la cantidad de cables que necesita bufff que pereza</p>

<p><img src="http://www.logitech.com/assets/36522/wireless-speaker-adapter-glamour-images.png" alt="image" /></p>

<h3>Al lio</h3>

<p>La cosa es que vi un ampli por ebay que costaba solo 16€  (jeje)</p>

<p><img src="https://lh6.googleusercontent.com/-RflqHMdAVd8/Tx1raYYDB5I/AAAAAAAAADo/wTHeee96aNs/s288/ampli_iphone2.jpg" alt="image" /></p>

<p>Así que se me ocurrió la idea de hacer un poco de brico-mania y meter el ampli este en una caja de esas que parecen libros, y meter también el receptor de logitech, conectar mis altavoces estupendos y a ver&#8230;</p>

<p><img src="https://lh5.googleusercontent.com/-nJM08Pz37nY/Tx1nwnNpxpI/AAAAAAAAACw/XmN8qhVRaCQ/s288/ampli_iphone07.jpg" alt="image" /></p>

<p>Este es el resultado obtenido por por el momento, ahora hay que meter el receptor y hacer unos ajustes en el voltaje, ya que el ampli funciona con 12v y el receptor de logitech con 5v.</p>

<p><img src="https://lh6.googleusercontent.com/-rqFsoCU2MSs/Tx1n5oo6vKI/AAAAAAAAADA/IIvDzjU79es/s288/ampli_iphone08.jpg" alt="image" /></p>

<p><a href="https://picasaweb.google.com/101650827713482282224/Amplificador_iphone?authuser=0&amp;feat=directlink">Más fotos</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fuzzy Logic y expresiones lambda]]></title>
    <link href="http://blog.ideseg.com/blog/2010/01/16/fuzzy-logic-y-expresiones-lambda/"/>
    <updated>2010-01-16T01:33:00+01:00</updated>
    <id>http://blog.ideseg.com/blog/2010/01/16/fuzzy-logic-y-expresiones-lambda</id>
    <content type="html"><![CDATA[<p>Para un proyecto que estoy realizando, he realizado una prueba de concepto probado a aplicar lógica difusa con el fin de realizar ciertas acciones a partir de una serie de datos imprecisos.</p>

<p>A la hora de expresar las reglas encargadas de modelar nuestro sistema de lógica difusa, (IF-THEN) la mayoría de los sistemas que he visto requerían de un pequeño y simple análizador sintáctico para interpretar las reglas, en este punto me he preguntado si en vez de un análizador sintáctico, podríamos usar expresiones lambda y una interfaz fluida.</p>

<p><strong>FuzzySystem (improvisado)</strong></p>

<p>De modo que he construido un pequeño motor de lógica difusa que tiene la particularidad de usar expresiones lambda y una interfaz fluida para definir el conjunto de reglas.<br/>
Este pequeño motor incorpora un par de funciones miembro, una de tipo Trapezoide y otra Triangular, básicamente su uso es el siguiente.<br/>
Definimos el sistema, añadimos las variables con sus estados y funciones miembro…</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">FuzzyTest</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="k">readonly</span> <span class="n">FuzzySystem</span> <span class="n">_engine</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FuzzySystem</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="nf">FuzzyTest</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">FuzzyVariable</span> <span class="n">varA</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FuzzyVariable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="n">varA</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Cerrado&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="m">5</span><span class="p">));</span>
</span><span class='line'>        <span class="n">varA</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Medio&quot;</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">6</span><span class="p">,</span> <span class="m">6</span><span class="p">));</span>
</span><span class='line'>        <span class="n">varA</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">9</span><span class="p">,</span> <span class="m">9</span><span class="p">));</span>
</span><span class='line'>        <span class="n">_engine</span><span class="p">.</span><span class="n">Variables</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">varA</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">FuzzyVariable</span> <span class="n">varB</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FuzzyVariable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="n">varB</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Cerrado&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">5</span><span class="p">,</span> <span class="m">5</span><span class="p">));</span>
</span><span class='line'>        <span class="n">varB</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Medio&quot;</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">6</span><span class="p">,</span> <span class="m">6</span><span class="p">));</span>
</span><span class='line'>        <span class="n">varB</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">9</span><span class="p">,</span> <span class="m">9</span><span class="p">));</span>
</span><span class='line'>        <span class="n">_engine</span><span class="p">.</span><span class="n">Variables</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">varB</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">FuzzyVariable</span> <span class="n">varR</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FuzzyVariable</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="n">varR</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Frio&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">3</span><span class="p">));</span>
</span><span class='line'>        <span class="n">varR</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Templado&quot;</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">6</span><span class="p">,</span> <span class="m">6</span><span class="p">));</span>
</span><span class='line'>        <span class="n">varR</span><span class="p">.</span><span class="n">Memberships</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">TrapezoidMembership</span><span class="p">(</span><span class="s">&quot;Caliente&quot;</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">7</span><span class="p">,</span> <span class="m">9</span><span class="p">,</span> <span class="m">9</span><span class="p">));</span>
</span><span class='line'>        <span class="n">_engine</span><span class="p">.</span><span class="n">Variables</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">varR</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>La definición de reglas mediante expresiones Lambda</strong></p>

<p>El beneficio en este punto es que el sistema no requiere del análizador sintáctico para evaluar las expresiones si no que será el CLR quien se encargue de ello.<br/>
Para llevar a cabo esta evaluación de las reglas he definido una clase <em>FuzzyExpresion </em>que tiene definidos los operadores &amp;&amp; y || para así como el true y el false para poder evaluar las reglas en consecuencia.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">FuzzyExpression</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">private</span> <span class="k">readonly</span> <span class="n">FuzzyVariable</span> <span class="n">_variable</span><span class="p">;</span>
</span><span class='line'>    <span class="k">private</span> <span class="kt">string</span> <span class="n">_state</span><span class="p">;</span>
</span><span class='line'>    <span class="k">private</span> <span class="kt">double?</span> <span class="n">_value</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">double</span> <span class="n">Value</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">get</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="n">_value</span><span class="p">.</span><span class="n">HasValue</span><span class="p">)</span>
</span><span class='line'>                <span class="k">return</span> <span class="n">_value</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span>
</span><span class='line'>            <span class="n">_value</span> <span class="p">=</span> <span class="n">_variable</span><span class="p">.</span><span class="n">Fuzzify</span><span class="p">(</span><span class="n">State</span><span class="p">);</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">_value</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">string</span> <span class="n">State</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_state</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="nf">FuzzyExpression</span><span class="p">(</span><span class="n">FuzzySystem</span> <span class="n">engine</span><span class="p">,</span> <span class="kt">string</span> <span class="n">literal</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">_variable</span> <span class="p">=</span> <span class="n">engine</span><span class="p">.</span><span class="n">Variables</span><span class="p">[</span><span class="n">literal</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">_variable</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">FuzzyException</span><span class="p">(</span><span class="s">&quot;variable not found.&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="nf">FuzzyExpression</span><span class="p">(</span><span class="kt">double</span> <span class="k">value</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">_value</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">FuzzyExpression</span> <span class="nf">Is</span><span class="p">(</span><span class="kt">string</span> <span class="n">state</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">_state</span> <span class="p">=</span> <span class="n">state</span><span class="p">;</span>
</span><span class='line'>        <span class="n">_value</span> <span class="p">=</span> <span class="n">_variable</span><span class="p">.</span><span class="n">Fuzzify</span><span class="p">(</span><span class="n">_state</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">FuzzyExpression</span> <span class="nf">Set</span><span class="p">(</span><span class="kt">string</span> <span class="n">newState</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">_state</span> <span class="p">=</span> <span class="n">newState</span><span class="p">;</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FuzzyExpression</span> <span class="k">operator</span> <span class="p">|(</span><span class="n">FuzzyExpression</span> <span class="n">a</span><span class="p">,</span> <span class="n">FuzzyExpression</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FuzzyExpression</span><span class="p">(</span><span class="n">Math</span><span class="p">.</span><span class="n">Max</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">Value</span><span class="p">,</span> <span class="n">b</span><span class="p">.</span><span class="n">Value</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">FuzzyExpression</span> <span class="k">operator</span> <span class="p">&amp;(</span><span class="n">FuzzyExpression</span> <span class="n">a</span><span class="p">,</span> <span class="n">FuzzyExpression</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">FuzzyExpression</span><span class="p">(</span><span class="n">Math</span><span class="p">.</span><span class="n">Min</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">Value</span><span class="p">,</span> <span class="n">b</span><span class="p">.</span><span class="n">Value</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="nf">false</span><span class="p">(</span><span class="n">FuzzyExpression</span> <span class="n">a</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="m">0</span> <span class="p">&gt;</span> <span class="n">a</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="nf">true</span><span class="p">(</span><span class="n">FuzzyExpression</span> <span class="n">a</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">Value</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Las reglas en la lógica difusa sirven para combinar las distintas proposiciones, no son reglas excesivamente complicadas, y son del tipo IF-THEN, básicamente hay 4 reglas (Implicación Conjunción, Disyunción y negación) que se corresponden con:</p>

<ul>
<li>Implicación IF variable==estado THEN variable = estado</li>
<li>Conjunción, equivalente al AND, si dos proposiciones son ciertas simultáneamente</li>
<li>Disyunción, cualquiera de las dos proposiciones es cierta OR</li>
<li>Negación, invierte la proposición</li>
</ul>


<p>Finalmente podemos definir las reglas de este modo</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">_engine</span><span class="p">.</span><span class="n">AddRule</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span>
</span><span class='line'>                <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">)</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>                <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">))</span>
</span><span class='line'>                <span class="p">.</span><span class="n">Then</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="p">).</span><span class="n">Set</span><span class="p">(</span><span class="s">&quot;Caliente&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="n">_engine</span><span class="p">.</span><span class="n">AddRule</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span>
</span><span class='line'>                <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">)</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>                <span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Cerrado&quot;</span><span class="p">)</span> <span class="p">||</span> <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Medio&quot;</span><span class="p">)))</span>
</span><span class='line'>                <span class="p">.</span><span class="n">Then</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="p">).</span><span class="n">Set</span><span class="p">(</span><span class="s">&quot;Templado&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="n">_engine</span><span class="p">.</span><span class="n">AddRule</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span>
</span><span class='line'>                <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">)</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>                <span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Cerrado&quot;</span><span class="p">)</span> <span class="p">||</span> <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Medio&quot;</span><span class="p">)))</span>
</span><span class='line'>                <span class="p">.</span><span class="n">Then</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="p">).</span><span class="n">Set</span><span class="p">(</span><span class="s">&quot;Templado&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="n">_engine</span><span class="p">.</span><span class="n">AddRule</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span>
</span><span class='line'>                <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Cerrado&quot;</span><span class="p">)</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>                <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Cerrado&quot;</span><span class="p">))</span>
</span><span class='line'>                <span class="p">.</span><span class="n">Then</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="p">).</span><span class="n">Set</span><span class="p">(</span><span class="s">&quot;Frio&quot;</span><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>¿Como funciona?</strong></p>

<p>Una regla tiene una condición (IF) y una consecuencia (THEN), la condición es una función que recibe el sistema y debe devolver una FuzzyExpresion, (<em>Func&lt;FuzzySystem,FuzzyExpression></em>), esto es parte de la magia ya que una expresión condicional es siempre reducida a una única expresión y finalmente a un único valor.<br/>
Y curiosamente la consecuencia de la regla, es exactamente igual, solo que en este caso la expresión no devuelve nada porque la consecuencia es una acción, aqui hay otro pequeño truco que es que la propia regla contiene los dos elementos separados (condición y consecuencia) fijaros en que:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">_engine</span><span class="p">.</span><span class="n">AddRule</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span>
</span><span class='line'>  <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">)</span> <span class="p">&amp;&amp;</span>
</span><span class='line'>    <span class="n">x</span><span class="p">.</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">).</span><span class="n">Is</span><span class="p">(</span><span class="s">&quot;Abierto&quot;</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Esta devolviendo una regla y el método <em>Then</em> es aplicado sobre la regla, y cuando se evalúa la regla si la condición es cierta se evalua la consecuencia, que lo que hace es únicamente cambiar el estado (ver el método <em>Set </em>de <em>FuzzyExpression</em>)</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">FuzzyRule</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>   <span class="k">private</span> <span class="k">readonly</span> <span class="n">FuzzySystem</span> <span class="n">_engine</span><span class="p">;</span>
</span><span class='line'>   <span class="k">private</span> <span class="k">readonly</span> <span class="n">Func</span> <span class="n">_condition</span><span class="p">;</span>
</span><span class='line'>   <span class="k">private</span> <span class="n">Func</span> <span class="n">_then</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="kt">double</span> <span class="n">Value</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="n">FuzzySystem</span> <span class="n">Engine</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_engine</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="nf">FuzzyRule</span><span class="p">(</span><span class="n">FuzzySystem</span> <span class="n">engine</span><span class="p">,</span> <span class="n">Func</span> <span class="n">condition</span><span class="p">)</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="n">_engine</span> <span class="p">=</span> <span class="n">engine</span><span class="p">;</span>
</span><span class='line'>       <span class="n">_condition</span> <span class="p">=</span> <span class="n">condition</span><span class="p">;</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="n">FuzzyExpression</span> <span class="nf">Eval</span><span class="p">()</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="n">Value</span> <span class="p">=</span> <span class="n">_condition</span><span class="p">(</span><span class="n">Engine</span><span class="p">).</span><span class="n">Value</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>       <span class="k">if</span> <span class="p">(</span><span class="n">Value</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">)</span>
</span><span class='line'>       <span class="p">{</span>
</span><span class='line'>           <span class="k">return</span> <span class="nf">_then</span><span class="p">(</span><span class="n">Engine</span><span class="p">);</span>
</span><span class='line'>       <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>       <span class="k">return</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">public</span> <span class="k">void</span> <span class="nf">Then</span><span class="p">(</span><span class="n">Func</span> <span class="n">then</span><span class="p">)</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>       <span class="n">_then</span> <span class="p">=</span> <span class="n">then</span><span class="p">;</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Defuzzyficando</strong></p>

<p>Para evaluar nuestro sistema ..</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">a</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">a</span> <span class="p">&lt;</span> <span class="m">10</span><span class="p">;</span> <span class="n">a</span><span class="p">++)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">b</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">b</span> <span class="p">&lt;</span> <span class="m">10</span><span class="p">;</span> <span class="n">b</span><span class="p">++)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="n">_engine</span><span class="p">.</span><span class="n">Variables</span><span class="p">[</span><span class="s">&quot;A&quot;</span><span class="p">].</span><span class="n">InputValue</span> <span class="p">=</span> <span class="n">a</span><span class="p">;</span>
</span><span class='line'>            <span class="n">_engine</span><span class="p">.</span><span class="n">Variables</span><span class="p">[</span><span class="s">&quot;B&quot;</span><span class="p">].</span><span class="n">InputValue</span> <span class="p">=</span> <span class="n">b</span><span class="p">;</span>
</span><span class='line'>            <span class="n">_engine</span><span class="p">.</span><span class="n">Consecuent</span> <span class="p">=</span> <span class="s">&quot;R&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">var</span> <span class="n">r</span> <span class="p">=</span> <span class="n">_engine</span><span class="p">.</span><span class="n">Defuzzy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;A {0} - B {1} = {2,-6} [{3,-10}][{4,-10}] = {5}&quot;</span><span class="p">,</span>
</span><span class='line'>                <span class="n">a</span><span class="p">,</span>
</span><span class='line'>                <span class="n">b</span><span class="p">,</span>
</span><span class='line'>                <span class="n">r</span><span class="p">,</span>
</span><span class='line'>                <span class="n">_engine</span><span class="p">.</span><span class="n">GetVariableState</span><span class="p">(</span><span class="s">&quot;A&quot;</span><span class="p">,</span><span class="n">a</span><span class="p">),</span>
</span><span class='line'>                <span class="n">_engine</span><span class="p">.</span><span class="n">GetVariableState</span><span class="p">(</span><span class="s">&quot;B&quot;</span><span class="p">,</span><span class="n">b</span><span class="p">),</span>
</span><span class='line'>                <span class="n">_engine</span><span class="p">.</span><span class="n">GetVariableState</span><span class="p">(</span><span class="s">&quot;R&quot;</span><span class="p">,</span> <span class="n">r</span><span class="p">)));</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Mejoras de diseño </strong></p>

<p>Hay una cosa que no me gusta mucho y es el hecho de que mi clase FuzzyExpression, tiene tanto el método Is como el método Set y esto habría que dividirlo en dos para no llevar a errores a la hora de la usar la interfaz fluida.</p>

<p><strong>Errores de diseño </strong></p>

<p>Pero no todo es de color de rosa, cuando planifique el sistema, pensé en la posibilidad de guardar las expresiones lambda como texto y después compilarlas usando CodeDom, bien tengo que deciros que cuando me he puesto a ello me he llevado la desagradable sorpresa de que CodeDom no soporta expresiones lambda, de modo que mi gozo en un pozo.</p>

<p>Y digo esto porque es de vital importancia el poder mantener las reglas fuera del código, bien un archivo de configuración, un archivo XML, lo que sea… de este modo podemos realizar ajustes sin tener que recompilar todo …</p>

<hr />

<p><strong>Para una futura version </strong></p>

<p>Completar estas cositas …</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Excel - CS-Solver de VBA a VSTO]]></title>
    <link href="http://blog.ideseg.com/blog/2006/07/01/excel-cs-solver-de-vba-a-vsto/"/>
    <updated>2006-07-01T17:29:27+02:00</updated>
    <id>http://blog.ideseg.com/blog/2006/07/01/excel-cs-solver-de-vba-a-vsto</id>
    <content type="html"><![CDATA[<p>Hace ya algún tiempo que escribí <strong>CS-Solver</strong>, estos días me he propuesto convertirlo de VBA a VSTO.</p>

<p><strong>CS-Solver</strong> es un add-in para Excel que escribí hace algún tiempo, ya que la calculadora que usaba tenía un sistema de resolver ecuaciones muy parecido (<a href="http://www.infinitysw.com/products/poweronefinance.html"><strong>PowerOne finance</strong></a>) y sin embargo resolver ecuaciones con Excel era bastante más complicado.</p>

<p><strong>CS-Solver</strong> utiliza el método secante para encontrar las raíces de <strong>f(x)=0</strong> en un intervalo, este no es tan rápido como el de Newton, pero si más rápido que la bisección ya que acota el intervalo y usa la aproximación más reciente.</p>

<p>A diferencia del método de Newton, no necesitamos calcular la derivada de la función en cada iteración, y que es un proceso más tedioso y requiere cálculo adicional.</p>

<p>Veamos ahora como funciona <strong>CS-Solver</strong> con un pequeño ejemplo, resolviendo la siguiente ecuación <br/>
<strong>2<sup>x</sup> + 5x = 2</strong></p>

<p><img src="https://lh4.googleusercontent.com/-QfldrCzMxmU/Tx5jCFdNSdI/AAAAAAAAAFc/OGLUYKlmZcg/s288/css002.jpg" alt="image" /></p>

<p>Primero crearemos una celda <strong>C2 </strong>a la que daremos un nombre en este caso <strong>X</strong>, esta es la incógnita, en otra celda teclearemos la función, igualando el resultado a <strong>0</strong>, quedando la ecuación **2<sup>x+5x-2=0**,</sup> esta celda la introduciremos como texto.</p>

<p>Ahora desde el menú de <strong>CSSolver</strong>, seleccionamos resolver ecuación</p>

<p>En donde se nos pide que introduzcamos la celda que contiene la ecuación a resolver, una vez seleccionada la celda que contiene la ecuación C4 pulsamos sobre Aceptar</p>

<p><img src="https://lh3.googleusercontent.com/-y5m_OFVbh6s/Tx5jCox6sjI/AAAAAAAAAFk/k3NA3E2Rh9M/s288/css004.jpg" alt="image" /></p>

<p>El resultado aparece en la celda de nombre <strong>X </strong>que es la incógnita a resolver.</p>

<p><img src="https://lh5.googleusercontent.com/-PcPRzGEIBqQ/Tx5jDC4y8mI/AAAAAAAAAFw/zupkgAHJBbE/s288/css006.jpg" alt="image" /></p>

<p>Veamos ahora otras cosas que se puede hacer con <strong>CS-Solver</strong>. Para ello usaremos la formula del Interés compuesto y calcularemos el Valor Futuro de un Capital invertido al 5% de interés anual durante <strong>3 </strong>meses.</p>

<hr />

<p>**Valor Final = Valor Actual * ( 1 + (Interés/12))<sup>Meses**</sup></p>

<p><img src="https://lh4.googleusercontent.com/-RUuLpI26qfM/Tx5jDYxcipI/AAAAAAAAAF0/sQ24BKQ-OeA/s400/css008.jpg" alt="image" /></p>

<p>Teclearemos la formula igualada a 0, <strong>0=(vactual*(1+interes))<sup>meses)-vfinal**</sup> para ello, nombraremos la celda </strong>C2<strong> como </strong>vfinal<strong>, </strong>C3<strong> como </strong>vactual<strong>, </strong>C4 <strong>como </strong>interes<strong> y </strong>C5<strong> como </strong>meses**</p>

<p>Si ejecutamos <strong>CS-Solver</strong> y seleccionamos <strong>B7</strong> como la formula a resolver obtendremos el <strong>Valor Actual</strong>, solucionando la ecuación.</p>

<p><img src="https://lh3.googleusercontent.com/-q9eoJIfPHNI/Tx5jD5b9-KI/AAAAAAAAAF8/O65iLsj7T6c/s400/css010.jpg" alt="image" /></p>

<p>Bien, una vez obtenido el resultado deseamos vemos que <strong>1012,55</strong> no es lo esperado que necesitamos obtener al final de nuestra inversión un total de <strong>1125</strong>, así que queremos ver cuanto necesitamos ingresar ahora para poder retirar dentro de 3 meses <strong>1125</strong></p>

<p>Para ello, nos basta con eliminar el contenido de la celda <strong>C3</strong>, (<strong>vactual</strong>) e indicar en la celda <strong>C2 </strong>el importe que deseamos obtener. Nuestra hoja de excel quedaría así.</p>

<p><img src="https://lh6.googleusercontent.com/-iFxRtl3rCJM/Tx5jEAmbvxI/AAAAAAAAAGA/DQag_6CYMzg/s400/css012.jpg" alt="image" /></p>

<p>Bien, no tenemos que tocar nada más tan solo seleccionar <strong>CS-So</strong>lver e indicar la formula que ya habíamos escrito, <strong>B7</strong></p>

<p><img src="https://lh3.googleusercontent.com/-GNhduDPB4Ac/Tx5jEuiGGQI/AAAAAAAAAGM/BfZdjM4n-0k/s400/css014.jpg" alt="image" /></p>

<p><strong>CS-Solver</strong> comprueba cual es la incógnita de la ecuación, vactual en este caso y comprueba que no tiene valor, así que su objetivo es resolver dicha incógnita.</p>

<p><strong>CS-Solver</strong> incorpora también una nueva formula llamada <strong>CSSolver</strong> con la cual podemos tener en una celda el valor de la incógnita de la ecuación, de este modo se puede tener en una celda <strong>=CSSolver(“2<em>x</em>sin(x)-5”)</strong> para la ecuación <strong>2<em>x</em>sin(x)=5</strong> e incluso podemos vincular la formula con una celda <strong>=CSSolver(A5)</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Excel - Distribuciones, planificaciones, formulas matriciales ]]></title>
    <link href="http://blog.ideseg.com/blog/2006/03/27/excel-distribuciones-planificaciones-formulas-matriciales/"/>
    <updated>2006-03-27T22:21:15+02:00</updated>
    <id>http://blog.ideseg.com/blog/2006/03/27/excel-distribuciones-planificaciones-formulas-matriciales</id>
    <content type="html"><![CDATA[<p>No se si lo he comentado alguna vez, pero en el trabajo suelo usar mucho Excel para hacer una gran variedad de cosas, en general mucho de lo que tiene que ver con el área económico financiera (lo terminamos haciendo en Excel).</p>

<p>Muchas de nuestras hojas de cálculo, son planes financieros, estudios de viabilidad, análisis etc. Básicamente estas hojas planifican cobros y pagos ó gastos e ingresos, la cuestión es la planificación, en Excel podemos planificar todo aquello que queramos, es sencillo podemos establecer una fila para cada previsión a realizar y en cada columna podemos poner un periodo (ene, feb, mar…), por último en cada celda (previsión / periodo) el importe de dicha previsión.</p>

<p><img src="https://lh5.googleusercontent.com/-_QyX7I6Q3wA/Tx5_ezVfMpI/AAAAAAAAAHE/AaZzfV7zjS8/s400/emat1.gif" alt="image" /></p>

<p>El problema se complica un poco cuando el importe de cada previsión no tiene un periodo fijo, sino que este debe establecerse en función de otra variable. Supongamos que tenemos que realizar una previsión entre dos periodos dados (Inicio y Final) y el importe debe ser proporcional al número de periodos.</p>

<p><img src="https://lh5.googleusercontent.com/-431XS42269U/Tx5_ezf3IbI/AAAAAAAAAHI/jgCYaL3z3OM/s400/emat2.gif" alt="image" /></p>

<p>Como es lógico las formulas se nos van complicando, más y más en función de las condiciones que necesitamos. Con lo que terminamos creando nuestras funciones en VBA para simplificar el proceso.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='vbnet'><span class='line'><span class="k">Function</span> <span class="nf">csPDistB</span><span class="p">(</span><span class="n">importe</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">periodo</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">inicio</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">fin</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">)</span>
</span><span class='line'>  <span class="k">If</span> <span class="p">(</span><span class="n">periodo</span> <span class="o">&gt;=</span> <span class="n">inicio</span><span class="p">)</span> <span class="ow">And</span> <span class="p">(</span><span class="n">periodo</span> <span class="o">&lt;=</span> <span class="n">fin</span><span class="p">)</span> <span class="k">Then</span>
</span><span class='line'>    <span class="n">csPDistB</span> <span class="o">=</span> <span class="n">importe</span> <span class="o">/</span> <span class="p">((</span><span class="n">fin</span> <span class="err">–</span> <span class="n">inicio</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="k">End</span> <span class="k">If</span>
</span><span class='line'><span class="k">End</span> <span class="k">Function</span>
</span></code></pre></td></tr></table></div></figure>


<p>Realizaría el mismo trabajo que las formulas vistas. Dándole una vuelta más podemos crear una función matricial para hacer la misma tarea y que automáticamente tome el periodo actual en función del rango en donde se encuentre.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='vbnet'><span class='line'><span class="k">Public</span> <span class="k">Function</span> <span class="nf">csPDistB</span><span class="p">(</span><span class="n">importe</span> <span class="ow">As</span> <span class="kt">Variant</span><span class="p">,</span> <span class="n">primero</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">,</span> <span class="n">ultimo</span> <span class="ow">As</span> <span class="kt">Integer</span><span class="p">)</span> <span class="ow">As</span> <span class="kt">Variant</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">i</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">nPeriodos</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">valor</span> <span class="ow">As</span> <span class="kt">Double</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">ReDim</span> <span class="n">a</span><span class="p">(</span><span class="mi">0</span> <span class="k">To</span> <span class="n">Application</span><span class="p">.</span><span class="n">Caller</span><span class="p">.</span><span class="n">Rows</span><span class="p">.</span><span class="n">Count</span><span class="p">,</span> <span class="mi">0</span> <span class="k">To</span> <span class="n">Application</span><span class="p">.</span><span class="n">Caller</span><span class="p">.</span><span class="n">Columns</span><span class="p">.</span><span class="n">Count</span><span class="p">)</span> <span class="ow">As</span> <span class="kt">Variant</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">On</span> <span class="k">Error</span> <span class="k">GoTo</span> <span class="n">Handler</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">nPeriodos</span> <span class="o">=</span> <span class="n">ultimo</span> <span class="err">–</span> <span class="n">primero</span>
</span><span class='line'>  <span class="n">valor</span> <span class="o">=</span> <span class="k">CDbl</span><span class="p">(</span><span class="n">importe</span> <span class="o">/</span> <span class="p">(</span><span class="n">nPeriodos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">For</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">To</span> <span class="n">Application</span><span class="p">.</span><span class="n">Caller</span><span class="p">.</span><span class="n">Columns</span><span class="p">.</span><span class="n">Count</span>
</span><span class='line'>      <span class="k">If</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&gt;=</span> <span class="n">primero</span> <span class="ow">And</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">ultimo</span> <span class="k">Then</span>
</span><span class='line'>         <span class="n">a</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="o">=</span> <span class="n">valor</span>
</span><span class='line'>      <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>  <span class="k">Next</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">csPDistB</span> <span class="o">=</span> <span class="n">a</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">Exit</span> <span class="k">Function</span>
</span><span class='line'><span class="nf">Handler</span><span class="p">:</span>
</span><span class='line'>  <span class="n">csPDistB</span> <span class="o">=</span> <span class="n">CVErr</span><span class="p">(</span><span class="mi">2015</span><span class="p">)</span>  <span class="err">‘</span><span class="n">xlErrNum</span> <span class="o">=</span> <span class="mi">2036</span>
</span><span class='line'><span class="k">End</span> <span class="k">Function</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="https://lh3.googleusercontent.com/-1Pv7rPLx7xw/Tx5_e7OZKXI/AAAAAAAAAHM/PUnEmaK9XVo/s800/emat3.gif" alt="image" /></p>

<p>Por último con una pequeñas modificaciones sobre este código podemos crear funciones más complejas para nuestras planificaciones, por ejemplo distribuciones en función de una curva de porcentajes, 25%, 50% y 25% sería el 25% en el primer tercio, el 50% en el segundo tercio y el 25% en el tercer tercio del tiempo.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='vbnet'><span class='line'><span class="k">Public</span> <span class="k">Function</span> <span class="nf">csPDistCP</span><span class="p">(</span><span class="n">importe</span> <span class="ow">As</span> <span class="kt">Variant</span><span class="p">,</span> <span class="k">ParamArray</span> <span class="n">porcentajes</span><span class="p">())</span> <span class="ow">As</span> <span class="kt">Variant</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">i</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">nParte</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">p</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">ReDim</span> <span class="n">a</span><span class="p">(</span><span class="n">Application</span><span class="p">.</span><span class="n">Caller</span><span class="p">.</span><span class="n">Columns</span><span class="p">.</span><span class="n">Count</span><span class="p">)</span> <span class="ow">As</span> <span class="kt">Variant</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">On</span> <span class="k">Error</span> <span class="k">GoTo</span> <span class="n">Handler</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">nParte</span> <span class="o">=</span> <span class="p">(</span><span class="n">UBound</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">UBound</span><span class="p">(</span><span class="n">porcentajes</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">p</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">For</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">To</span> <span class="n">UBound</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span class='line'>    <span class="k">If</span> <span class="n">i</span> <span class="ow">Mod</span> <span class="n">Int</span><span class="p">(</span><span class="n">nParte</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">Then</span>
</span><span class='line'>       <span class="k">If</span> <span class="n">p</span> <span class="o">&lt;</span> <span class="n">UBound</span><span class="p">(</span><span class="n">porcentajes</span><span class="p">)</span> <span class="k">Then</span>
</span><span class='line'>          <span class="n">p</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'>       <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>    <span class="k">End</span> <span class="k">If</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">a</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">=</span> <span class="k">CDbl</span><span class="p">((</span><span class="n">importe</span> <span class="o">/</span> <span class="n">nParte</span><span class="p">)</span> <span class="o">*</span> <span class="n">porcentajes</span><span class="p">(</span><span class="n">p</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">Next</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">csPDistCP</span> <span class="o">=</span> <span class="n">a</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">Exit</span> <span class="k">Function</span>
</span><span class='line'>
</span><span class='line'><span class="nf">Handler</span><span class="p">:</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">csPDistCP</span> <span class="o">=</span> <span class="n">CVErr</span><span class="p">(</span><span class="mi">2015</span><span class="p">)</span>  <span class="err">‘</span><span class="n">xlErrNum</span> <span class="o">=</span> <span class="mi">2036</span>
</span><span class='line'>
</span><span class='line'><span class="k">End</span> <span class="k">Function</span>
</span></code></pre></td></tr></table></div></figure>


<p>Un último ejemplo en donde realizamos previsiones los periodos indicados, el importe proporcional al número de periodos.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='vbnet'><span class='line'><span class="k">Public</span> <span class="k">Function</span> <span class="nf">csPDistP</span><span class="p">(</span><span class="n">importe</span> <span class="ow">As</span> <span class="kt">Variant</span><span class="p">,</span> <span class="k">ParamArray</span> <span class="n">periodos</span><span class="p">())</span> <span class="ow">As</span> <span class="kt">Variant</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">i</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">nPeriodos</span> <span class="ow">As</span> <span class="kt">Integer</span>
</span><span class='line'>  <span class="k">Dim</span> <span class="n">valor</span> <span class="ow">As</span> <span class="kt">Double</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">ReDim</span> <span class="n">a</span><span class="p">(</span><span class="n">Application</span><span class="p">.</span><span class="n">Caller</span><span class="p">.</span><span class="n">Columns</span><span class="p">.</span><span class="n">Count</span><span class="p">)</span> <span class="ow">As</span> <span class="kt">Variant</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">On</span> <span class="k">Error</span> <span class="k">GoTo</span> <span class="n">Handler</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">nPeriodos</span> <span class="o">=</span> <span class="n">UBound</span><span class="p">(</span><span class="n">periodos</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">valor</span> <span class="o">=</span> <span class="k">CDbl</span><span class="p">(</span><span class="n">importe</span> <span class="o">/</span> <span class="p">(</span><span class="n">nPeriodos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">For</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">To</span> <span class="n">nPeriodos</span>
</span><span class='line'>      <span class="n">a</span><span class="p">(</span><span class="n">periodos</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="o">=</span> <span class="n">valor</span>
</span><span class='line'>  <span class="k">Next</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">csPDistP</span> <span class="o">=</span> <span class="n">a</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">Exit</span> <span class="k">Function</span>
</span><span class='line'>
</span><span class='line'><span class="nf">Handler</span><span class="p">:</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">csPDistP</span> <span class="o">=</span> <span class="n">CVErr</span><span class="p">(</span><span class="mi">2015</span><span class="p">)</span>  <span class="err">‘</span><span class="n">xlErrNum</span> <span class="o">=</span> <span class="mi">2036</span>
</span><span class='line'>
</span><span class='line'><span class="k">End</span> <span class="k">Function</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
</feed>

