<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IPCorp Blog &#187; Herramientas</title>
	<atom:link href="http://www.ipcorp.com.ar/blog/category/temas/herramientas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ipcorp.com.ar/blog</link>
	<description>#pg_dump ideas &#62; blog.log</description>
	<lastBuildDate>Fri, 11 Nov 2011 20:18:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mi pequeño paso por python: RSS, HTML, Jquery</title>
		<link>http://www.ipcorp.com.ar/blog/2011/11/11/mi-pequeno-paso-por-python-rss-html-jquery/</link>
		<comments>http://www.ipcorp.com.ar/blog/2011/11/11/mi-pequeno-paso-por-python-rss-html-jquery/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 20:18:24 +0000</pubDate>
		<dc:creator>Carlos Mathiasen</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=1129</guid>
		<description><![CDATA[Hace no menos de un mes termin&#233; un proyecto que consist&#237;a en mostrar noticias de diarios argentinos de manera offline. Para ser implementado en muy poco espacio de disco, por lo que utilizar algun framework ser&#237;a un poco pesado.
El sistema ya se encontraba implementado con mod-python, la idea era seguir trabajando con eso y crear [...]]]></description>
			<content:encoded><![CDATA[<p>Hace no menos de un mes termin&eacute; un proyecto que consist&iacute;a en mostrar noticias de diarios argentinos de manera offline. Para ser implementado en muy poco espacio de disco, por lo que utilizar algun framework ser&iacute;a un poco pesado.<br />
El sistema ya se encontraba implementado con mod-python, la idea era seguir trabajando con eso y crear los scripts correspondientes en python.<br />
Desde un principio la idea era que un script traiga los feeds de noticias cada cierto tiempo (utilizando tareas cron) y generar un html el cual se pod&iacute;a ver de forma offline.<br />
Para ello en python existe una librer&iacute;a llamada feedparser, que nos trae en forma de diccionario todo lo que el servicio nos da.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> feedparser
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span> <span style="color: #808080; font-style: italic;">#lo utilizamos mas adelante</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span> <span style="color: #808080; font-style: italic;">#lo utilizamos mas adelante</span>
parse = feedparser.<span style="color: black;">parse</span><span style="color: black;">&#40;</span>url_de_rss<span style="color: black;">&#41;</span></pre></div></div>

<p>Si tenemos conexi&oacute;n a internet, esas l&iacute;neas nos deber&iacute;an bajar el feed completo que nos ofrece la p&aacute;gina con la que queremos trabajar. Solo queda sacar lo que nos importa, en este caso el t&iacute;tulo, la noticia y las fotos si las hubiera. Como trabajamos offline no tendr&iacute;n que haber links de ningun tipo</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">noticias = <span style="color: #483d8b;">'&lt;ol&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span>
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>:
    titulo = parse.<span style="color: black;">entries</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>.<span style="color: black;">title</span>
    resumen =  <span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'((&lt;a){1}(.)+(&lt;/a&gt;)?)|((&lt;img){1}(.)+(/img&gt;)?)|((&lt;table){1}(.)+(&lt;/table&gt;)?)'</span>, <span style="color: #483d8b;">''</span>,parse.<span style="color: black;">entries</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>.<span style="color: black;">summary_detail</span>.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        img_url = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>parse.<span style="color: black;">entries</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>.<span style="color: black;">enclosures</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">href</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;images/imagen_%s.jpg&quot;</span><span style="color: #66cc66;">%</span>i,<span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
        f.<span style="color: black;">write</span><span style="color: black;">&#40;</span>img_url<span style="color: black;">&#41;</span>
        imagen = <span style="color: #483d8b;">'&lt;img src=&quot;images/imagen_%s.jpg&quot; alt=&quot;&quot;/&gt;'</span><span style="color: #66cc66;">%</span>i
    <span style="color: #ff7700;font-weight:bold;">except</span>:
        imagen = <span style="color: #483d8b;">''</span>
    noticias += <span style="color: #483d8b;">'&lt;li&gt;%s&lt;br/&gt;%s&lt;br/&gt;%s&lt;/li&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #66cc66;">%</span><span style="color: black;">&#40;</span>titulo,resumen,imagen<span style="color: black;">&#41;</span>
&nbsp;
noticias += <span style="color: #483d8b;">'&lt;/ol&gt;'</span>
archivo_noticias = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;templates/_noticias.html&quot;</span>,<span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
archivo_noticias.<span style="color: black;">write</span><span style="color: black;">&#40;</span>noticias<span style="color: black;">&#41;</span></pre></div></div>

<p>En la l&iacute;nea 1 simplemente inicializamos la variable que luego pondremos en el html correspondiente, vamos a utilizar una lista ordenada.<br />
En la l&iacute;nea 2 empezamos nuestro bucle diciendo que s&oacute;lo vamos a querer 10 noticias. Con un simple for podemos hacerlo, debido a que vamos a trabajar con la clave entries del diccionario, esta clave contiene un array, donde cada elemento es otro diccionario con sus propias claves. Las que vamos a utilizar en esta ocasi&oacute;n son:<br />
<b>title:</b> Trae el t&iacute;tulo de la noticia.<br />
<b>summary_detail:</b> Es donde est&aacute; el res&uacute;men de la noticia, este tiene como valor otro diccionario, de donde utilizaremos la clave value, donde est&aacute; el res&uacute;men propiamente dicho.<br />
<b>enclosures:</b> es donde se guardan los adjuntos de la noticia, en este caso nos interesan las im&aacute;genes, pero como trabajamos offlines tenemos que descargarlas para ello utilizamos urllib2 asi la guardamos en nuestro sistema de archivos. A modo de ejemplo puse que la imagen tenga como nombre el indice de la noticia. Si s&oacute;lo trabajamos con un diario no ser&iacute;a inconveniente, para m&aacute;s de un diario puede haber problemas porque los archivos se sobreescribir&iacute;an y no se mostrariacutean las correctas. Esta parte pongo dentro de un try, porque no siempre traen im&aacute;genes y el parse nos tira una excepci&oacute;n, en caso de que pase cargamos la variable con nada, sino creamos el tag html de imágenes.<br />
En la l&iacute;nea 3 creamos una variable donde se guarda el t&iacute;tulo de nuestra noticia<br />
En la l&iacute;nea 4  guardamos el res&uacute;men en una variable, puede parecer un poco complejo el c&oacute;digo, pero es bastante f&aacute;cil. Utilizamos la librer&iacute;a re para poder trabajar con expreciones regulares y con el m&eacute;todo sub eliminamos del string las cosas que no queremos. A mi no me interesaba ning&uacute;n<br />
link:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;"> ((&lt;a){1}(.)+(&lt;/a&gt;)?)</pre></div></div>

<p>im&aacute;gen:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">((&lt;img){1}(.)+(/img&gt;)?)</pre></div></div>

<p>tabla:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">((&lt;table){1}(.)+(&lt;/table&gt;)?</pre></div></div>

<p>que haya en el res&uacute;men, entonces cuando encuentre algo de eso que simplemente lo reemplace por nada.<br />
Finalmente cerramos nuestra lista fuera del for y tendr&iacute;amos un resultado parecido a este:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>ol<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo1<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen1<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_1.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo2<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen2<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_2.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo3<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen3<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_3.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo4<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen4<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_4.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo5<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen5<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_5.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo6<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen6<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_6.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo7<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen7<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo8<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen8<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;</span>img src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;images/imagen_8.jpg&quot;</span> alt<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo9<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen9<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;</span>Titulo10<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;</span>Resumen10<span style="color: #339933;">&lt;</span>br<span style="color: #339933;">/&gt;&lt;/</span>li<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>ol<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Para poder guardarlo en el archivo _noticias.html<br />
Ya tenemos toda una lista de noticias lista para ser le&iacute;da offline, s&oacute;lo queda cargarlo en nuestro index y problema resulto, para eso podemos hacer uso de jquery (se puede hacer directamente con javascript, pero una p&aacute;gina web tiene bastante c&oacute;digo javascript hoy en d&iacute;a y jquery es un framework muy copadito<br />
para escribir poco <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p>En el index.html tendr&iacute;amos:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">&lt;div id=&quot;#noticias&quot;&gt;&lt;/div&gt;
&nbsp;
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#noticias&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'_noticias.html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Este fue mi pequeño paso por python, la verdad una experiencia muy linda, es un muy buen lenguaje. En realidad si  quer&eacute;s hacer un script de manera muy r&aacute;pida es una buena opci&oacute;n.<br />
Les dejo los links de feedparser y mod-python<br />
 <b>Feedparser: </b><a href="http://code.google.com/p/feedparser/">http://code.google.com/p/feedparser/</a><br />
 <b>Mod-Python: </b> <a href="http://www.modpython.org/">http://www.modpython.org/</a><br />
Bueno espero que les haya gustado y hasta la pr&oacute;xima <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2011/11/11/mi-pequeno-paso-por-python-rss-html-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Script para recorrer archivos html y encontrar las clases</title>
		<link>http://www.ipcorp.com.ar/blog/2011/06/17/script-para-recorrer-archivos-html-y-encontrar-las-clases/</link>
		<comments>http://www.ipcorp.com.ar/blog/2011/06/17/script-para-recorrer-archivos-html-y-encontrar-las-clases/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 15:56:59 +0000</pubDate>
		<dc:creator>Carlos Mathiasen</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Sistemas Operativos]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=1060</guid>
		<description><![CDATA[Me vinieron con un problema bastante bueno ayer: &#8220;Necesito que elimines las clases que no se usan en el archivo .css&#8221;, la verdad parece no complicarse mucho, el problema se agrava un poco cuando ten&#233;s unos cuantos archivos html. Por curiosidad se me ocurri&#243; contar los archivos:

  find /proyectos/app/ -name *.erb -exec ls -l [...]]]></description>
			<content:encoded><![CDATA[<p>Me vinieron con un problema bastante bueno ayer: &#8220;Necesito que elimines las clases que no se usan en el archivo .css&#8221;, la verdad parece no complicarse mucho, el problema se agrava un poco cuando ten&eacute;s unos cuantos archivos html. Por curiosidad se me ocurri&oacute; contar los archivos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>proyectos<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #660033;">-name</span> <span style="color: #000000; font-weight: bold;">*</span>.erb <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span> \; <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> <span style="color: #660033;">-l</span>
  <span style="color: #666666; font-style: italic;">#busco todos los que terminan en .erb, porque es un proyecto en Rails</span></pre></div></div>

<p>Me di&oacute; la m&oacute;dica suma de 444 archivos. Ahora si se complicaba demasiado hacerlo a mano.<br />
Me puse a incursionar un poco en bash y sali&oacute; esto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">a</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">find</span> $<span style="color: #000000;">1</span> <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;*.erb&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>; <span style="color: #666666; font-style: italic;">#busco los archivos y guardo los paths en una lista</span>
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$a</span>; <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #666666; font-style: italic;">#recorro la lista</span>
   <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$i</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">egrep</span> <span style="color: #ff0000;">'class=&quot;'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-F</span> <span style="color: #ff0000;">'class='</span> <span style="color: #ff0000;">'{print $2}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-F</span> <span style="color: #ff0000;">'&quot;'</span> <span style="color: #ff0000;">'{print $2}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-F</span> <span style="color: #ff0000;">' '</span> <span style="color: #ff0000;">'{for (j=1; j&lt;=NF; j++)  print $j; print &quot;\n&quot;}'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> clases.txt
<span style="color: #000000; font-weight: bold;">done</span>  
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sort</span> clases.txt <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> clases2.txt <span style="color: #666666; font-style: italic;">#ordeno el archivo y lo guardo en otro</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> clases.txt <span style="color: #666666; font-style: italic;">#elimino el primer archivo</span>
<span style="color: #c20cb9; font-weight: bold;">uniq</span> <span style="color: #660033;">-u</span> clases2.txt <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> clases.txt <span style="color: #666666; font-style: italic;">#borro las l&amp;iacute;neas duplicadas (ya que las clases no son &amp;uacute;nicas)</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> clases2.txt <span style="color: #666666; font-style: italic;">#elimino el archivo auxiliar</span></pre></div></div>

<p>La tercer linea del script la explico aca abajo, sino no se iba a entender nada</p>
<p><strong>cat $i:</strong> muestra el contenido del path que le estamos pasando.<br />
<strong> egrep &#8216;class=&#8221;&#8216;:</strong> Me muestra solo las l&iacute;neas que contienen &#8216;class=&#8221;&#8216;, que es como definimos una clase en html.<br />
<strong> awk -F &#8216;class=&#8217; &#8216;{print $2}&#8217;:</strong>Hago como un split a un string separando por &#8216;class=&#8217; y mostrando solo el segundo valor, es decir todas las clases que tenga ese tag.<br />
<strong>awk -F &#8216;  &#8216;  &#8216;{for (j=1; j<=NF; j++)  print $j; print "\n"}':</strong> Como ya tenemos en una sola l&iacute;nea todas las clases de un tag, y sabemos que las clases se separan con un espacio, hacemos nuestro split por espacios y recorremos todas las variables y las vamos imprimiendo con un salto de linea al final. Esto nos har&iacute;a una lista con todas las clases que existan en los archivos html.<br />
Despu&eacute;s habriendo el archivo clases.txt, vemos las clases ordenadas y &uacute;nicas <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Quiz&aacute; se pueda costumizar más, no usar 2 archivos sino solo uno. Tambi&eacute;n se podria recorrer el archivo .css y compararlo con nuestro archivo, eliminando las l&iacute;neas que necesitamos. Pero para salir del apuro anda perfecto. Y si queremos encontrar los id, es cuesti&oacute;n de reemplazar la b&uacute;squeda nom&aacute;, aunque me tira algunos datos sucios, ya que también se usa en javascript y en ruby, entonces por ahi se complicaba un poco m&aacute;s, pero les dejo como tarea para la casa jeje<br />
Bueno espero les pueda servir y cualquier consulta no duden en comentar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2011/06/17/script-para-recorrer-archivos-html-y-encontrar-las-clases/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FullCalendar de JQUERY  Y RAILS</title>
		<link>http://www.ipcorp.com.ar/blog/2011/05/19/fullcalendar-de-jquery-y-rails/</link>
		<comments>http://www.ipcorp.com.ar/blog/2011/05/19/fullcalendar-de-jquery-y-rails/#comments</comments>
		<pubDate>Thu, 19 May 2011 23:22:53 +0000</pubDate>
		<dc:creator>higinia</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=1045</guid>
		<description><![CDATA[Les queria mostrar un calendario con el cual me entusiasme mucho cuando lo puse en práctica, claro que adaptándolo a mi aplicación.
FullCalendar es un plugin JQuery para implementar un calendario con una interfaz muy sencilla de implementar y muy personalizable por medio de CSS. 
Para configurarlo, este recurso brinda un  conjunto de parámetros, objetos y eventos como:
*Opciones para definir meses, [...]]]></description>
			<content:encoded><![CDATA[<p>Les queria mostrar un calendario con el cual me entusiasme mucho cuando lo puse en práctica, claro que adaptándolo a mi aplicación.<br />
FullCalendar es un plugin JQuery para implementar un calendario con una interfaz muy sencilla de implementar y muy personalizable por medio de CSS. </p>
<p>Para configurarlo, este recurso brinda un  conjunto de parámetros, objetos y eventos como:<br />
*Opciones para definir meses, años, si el elemento es arrastrable, la transparencia del elemento arrastrado, titulo, etc.<br />
*Eventos para proveer los datos.<br />
*Eventos que se disparan al hacer clic en un día, al cargar, al arrastrar, al soltar, etc.<br />
*Objetos del calendarios como título, fecha, hora, etc.<br />
*Ademas es de código abierto</p>
<p>De acuerdo a mis necesidades y a mi lenguaje utilizado, lo implemente de la siguiente manera:<br />
Se descarga el archivo ZIP de la biblioteca JQuery, el plugin y demos funcionales y los incluís a tu archivo que contienen tus scripts.</p>
<p>Inicialmente en tu formulario donde vas a presentarlo, lo llamas con un simple identificador
<div id=''calendar'></div>
<p>Luego en la parte del codigo javascript, incluís el conjunto de parámetros que  te sea mas útil.</p>
<p>A modo de ejemplo les muestro algunos que utilice:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">&lt;table&gt;
  &lt;tr&gt;
  &lt;a&gt;<span style="color:#006600; font-weight:bold;">&lt;%</span>= <span style="color:#5A0A0A; font-weight:bold;">link_to</span> <span style="color:#996600;">'Nuevo Evento'</span>, turno_tarea_turnos_path <span style="color:#006600; font-weight:bold;">%&gt;</span>&lt;/a&gt;
&nbsp;
// Este link_to nos llevara a los distintos eventos que serán mostrados en el calendario (en el caso de mi aplicación)
&nbsp;
 &lt;/tr&gt;
&lt;/table&gt;
&nbsp;
&lt;table&gt;  
&lt;div id='calendar'&gt;&lt;/div&gt;  
&nbsp;
Acá comenzamos a configurar el calendario
&lt;script type=&quot;text/javascript&quot;&gt;
  $(document).ready(function(){
$('#calendar').fullCalendar({   
          editable: true,
          header: {
              left: 'prev,next',
              center: 'title'
              /*right: 'month,agendaWeek,agendaDay'*/
          },
          defaultView: 'agendaWeek',      
          height: 600,
          slotMinutes: 30,
          minTime : 8,
          maxTime : 21,
          firstDay : 1,
          allDaySlot : false,
          columnFormat:'ddd d/M',       
           titleFormat : &quot;MMM d[ yyyy]{ '&amp;#8212;'[MMM] dd 'del' yyyy}&quot;,
          weekends: false,
          defaultEventMinutes : 30,        
          buttonText: {prev: '&amp;nbsp;&amp;#9668;&amp;nbsp;',
		next: '&amp;nbsp;&amp;#9658;&amp;nbsp;',
		prevYear: '&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;',
		nextYear: '&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;',
                today : 'Hoy'},
&nbsp;
          unselectAuto: false,
          weekMode : false,
          monthNamesShort : ['Enero' , 'Febrero' , 'Marzo' , 'Abril' , 'Mayo' , 'Junio' , 'Julio' ,
                        'Agosto' , 'Septiembre' , 'Octubre' , 'Noviembre' , 'Diciembre' ],
          dayNamesShort : ['Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'],
&nbsp;
&nbsp;
  // Este pequeño array nos va a permitir visualizar los eventos
          events:[
&nbsp;
            <span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">for</span> turno <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#0066ff; font-weight:bold;">@turnos</span> = Turno.<span style="color:#9900CC;">all</span>   <span style="color:#006600; font-weight:bold;">-%&gt;</span>
              {
               id : 'turno: <span style="color:#006600; font-weight:bold;">&lt;%</span>= turno.<span style="color:#9900CC;">id</span>.<span style="color:#5A0A0A; font-weight:bold;">to_s</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>',
               title  : 'Profesional: <span style="color:#006600; font-weight:bold;">&lt;%</span>= turno.<span style="color:#9900CC;">profesional</span>.<span style="color:#9900CC;">nombre</span> <span style="color:#006600; font-weight:bold;">%&gt;</span> Duracion: <span style="color:#006600; font-weight:bold;">&lt;%</span>= turno.<span style="color:#9900CC;">duracion</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>minutos Paciente: <span style="color:#006600; font-weight:bold;">&lt;%</span>= turno.<span style="color:#9900CC;">paciente</span>.<span style="color:#9900CC;">nombre</span>  <span style="color:#006600; font-weight:bold;">%&gt;</span> ' ,
               start : 'Fecha: <span style="color:#006600; font-weight:bold;">&lt;%</span>= turno.<span style="color:#9900CC;">fecha_hora</span>.<span style="color:#9900CC;">iso8601</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>',
               end : 'Duracion: <span style="color:#006600; font-weight:bold;">&lt;%</span>= <span style="color:#006600; font-weight:bold;">&#40;</span>turno.<span style="color:#9900CC;">fecha_hora</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">60</span> <span style="color:#006600; font-weight:bold;">*</span> turno.<span style="color:#9900CC;">duracion</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>',
               allDay : false,
               url: '<span style="color:#006600; font-weight:bold;">&lt;%</span>= eliminar_turno_path<span style="color:#006600; font-weight:bold;">&#40;</span>turno<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>'
&nbsp;
              },
&nbsp;
            <span style="color:#006600; font-weight:bold;">&lt;%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>           
&nbsp;
              ],
&nbsp;
          timeFormat: 'h:mm t{ - h:mm t} ',
          dragOpacity: &quot;0.5&quot;,
&nbsp;
&nbsp;
&nbsp;
          eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc){
              if (confirm(&quot;Are you sure about this change?&quot;)) {
                  moveEvent(event, dayDelta, minuteDelta, allDay);
              }
              else {
                revertFunc();
              }
          },
&nbsp;
          eventResize: function(event, dayDelta, minuteDelta, revertFunc){
              if (confirm(&quot;Are you sure about this change?&quot;)) {
                  resizeEvent(event, dayDelta, minuteDelta);
              }
              else {
                 revertFunc();
              }
          },        
&nbsp;
&nbsp;
// En este caso, al hacer click sobre el evento, me llevara a la url especificada para ese evento (se muestra mas arriba)
&nbsp;
 eventClick: function(event, jsEvent){
             if (event.url) {
              if (confirm('Esta seguro de eliminar? Esta accion no se podra deshacer')){
                event.url;
              //return false;
              }else{
                return false;
              }
&nbsp;
        }
          }
}
&nbsp;
&lt;/script&gt;</pre></div></div>

<p>Espero que les guste y lo implementen.</p>
<p>Para descargar los archivos js:  http://<a href="arshaw.com/fullcalendar/ ">arshaw.com/fullcalendar/ </a><br />
Otro ejemplo que me sirvió lo podes ver en http://<a href="fullcalendar.vinsol.com">fullcalendar.vinsol.com/ </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2011/05/19/fullcalendar-de-jquery-y-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jornada de Charlas de la Facultad de Ciencias Exactas de la UNNE</title>
		<link>http://www.ipcorp.com.ar/blog/2010/09/30/jornada-de-charlas-de-la-facultad-de-ciencias-exactas-de-la-unne/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/09/30/jornada-de-charlas-de-la-facultad-de-ciencias-exactas-de-la-unne/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 21:44:25 +0000</pubDate>
		<dc:creator>marcelo</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Ingeniería de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=915</guid>
		<description><![CDATA[Jornada de Charlas de la Facultad de Ciencias Exactas &#8211; Universidad Nacional del Nordeste.
Fecha : 02 de Octubre de 2010
Lugar : Edificio 9 de julio . 9 de Julio 1449  - Corrientes -Cap-
Dirigido a estudiantes de la carrera de sistemas y pùblico en general. Las acreditaciones se realizan el mismo dìa, se entregaran certificados.
Cronograma de [...]]]></description>
			<content:encoded><![CDATA[<p>Jornada de Charlas de la Facultad de Ciencias Exactas &#8211; Universidad Nacional del Nordeste.</p>
<p>Fecha : 02 de Octubre de 2010</p>
<p>Lugar : Edificio 9 de julio . 9 de Julio 1449  - Corrientes -Cap-</p>
<p>Dirigido a estudiantes de la carrera de sistemas y pùblico en general. Las acreditaciones se realizan el mismo dìa, se entregaran certificados.</p>
<p style="text-align: center;"><strong><span style="text-decoration: underline;">Cronograma de charlas</span></strong></p>
<table style="cursor: default; page-break-before: always;" border="1" cellspacing="0" cellpadding="7" width="100%">
<colgroup>
<col width="48*"></col>
<col width="58*"></col>
<col width="73*"></col>
<col width="77*"></col>
</colgroup>
<tbody>
<tr valign="TOP">
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"><strong>Horario</strong></span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"><strong>Título</strong></span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"><strong>Disertante</strong></span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"><strong>Contenido</strong></span></span></span></p>
</td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%" height="82" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">9 – 10 hs</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Struts, una aplicación del Patrón ‘Modelo Vista Controlador</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%" bgcolor="#d3dfee">
<p align="CENTER"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Lic. Edgar Alberto Gómez</span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP" bgcolor="#d3dfee"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">¿Qué es un Patrón de Diseño? – Descripción breve del Patrón Modelo Vista Controlador (MVC).</span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"> </span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Elementos del framework ‘Struts’: Archivos XML de configuración (web.xml, struts-config.xml), Actions, ActionForms, ActionErrors, Tags de Struts para utilizar en código HTML.</span></span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%" height="61">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">10 – 10,30 hs.</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Acreditación de la LSI</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Mgter. Gladys Dapozo</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Acreditación de carreras de Informática. CONEAU. Res. 786/09 Ministerio de Educación. Evaluación de calidad.</span></span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">10.30 – 11,30 hs</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Persistencia de Objetos en Bases de Datos Orientado a Objetos.</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%" bgcolor="#d3dfee">
<p align="CENTER"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Expto. Mario Augusto Arqueros</span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP" bgcolor="#d3dfee"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Origen y concepto del motor de bases de datos orientado a objetos. Comunicación y manejo de la persistencia en la base de datos orientada a objetos. Tipos y complejidades de consulta y recupero de los objetos. Bondades del motor de bases de datos orientadas a objetos DB4o. Principales diferencias entre las BDR y las BDOO. Ejemplo práctico métodos de persistencia y búsqueda de objetos en una BDOO.</span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">11,30 – 13,30 hs</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Diseño de Interfaces de usuario en Aplicaciones Web</span></span></span></p>
<p align="CENTER">
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Lic Carlos Barbiero (IPCorp)</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Introducción, ¿qué es una interfaz de usuario?. – Definiciones. Pequeña referencia histórica. &#8211; Arquitectura de la información. Fenómeno Web 2.0. Definiciones y conceptos. Tecnologías influyentes. Descripción de patrones de diseño. Ejemplos y Tips de diseño</span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">. </span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Sitios y aplicaciones de ejemplo. Tips de diseño en aplicaciones Web.</span></span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">15 – 16hs</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%" bgcolor="#d3dfee">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Reutilización de decisiones de diseño mediante patrones</span></span></p>
<p align="CENTER">
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%" bgcolor="#d3dfee">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Lic. Vanesa Morand</span></span></span></p>
<p align="CENTER">
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP" bgcolor="#d3dfee">
<p style="margin-bottom: 0cm;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Definición de patrones. Clasificación de patrones. Importancia de la aplicación de patrones.</span></span></p>
<p><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Descripción y análisis de algunos patrones (State, Strategy, Decorator, Adapter). Cuándo definir un patrón? Ejemplos del uso de los mismos. Ejemplos de código con la implementación de patrones.</span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%">
<p style="margin-bottom: 0cm;" align="CENTER">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">16 </span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">- 17hs.</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%">
<p style="margin-bottom: 0cm;" align="CENTER">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">e principiante a Desarrollador Web</span></span></span></p>
<p align="CENTER">
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%">
<p style="margin-bottom: 0cm;" align="CENTER">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Ing. Agustín Casiva</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP">
<p style="margin-bottom: 0cm;">
<p><span style="font-family: 'Courier New', monospace;"><span style="font-size: x-small;"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Abstract: Panorama general del desarrollo web en la actualidad, desde tecnologías del lado del cliente, por ejemplo HTML, CSS, JavaScript, Flash, JQuery, ExtJS; hasta procesamiento del lado del Servidor con PHP, Java, .NET, Python, Ruby; involucrando todo el proceso de desarrollo, desde la solicitud del cliente hasta su publicación en la web.</span></span></span></span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">17-18 hs.</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%" bgcolor="#d3dfee">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Calidad de Productos Software</span></span></span></p>
<p align="CENTER">
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%" bgcolor="#d3dfee">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">María Clara Sánchez Vallduvi</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP" bgcolor="#d3dfee"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Concepto de calidad. Medición de software. Normas ISO sobre calidad de Productos Software. ISO 9126 y 14598. Descripción. Relaciones. ISO 25000. Unificación de estándares. Conclusiones.</span></span></span></td>
</tr>
<tr>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="19%">
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">18 – 19 hs.</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="23%">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Características avanzadas de Entornos Integrados de Desarrollo (IDE´s) para Java</span></span></span></p>
<p align="CENTER">
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="29%">
<p style="margin-bottom: 0cm;" align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Ramón Oscar Fernández</span></span></span></p>
<p align="CENTER"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Carlos Alberto Romero</span></span></span></p>
</td>
<td style="color: #000000; font-size: 11px; cursor: text; margin: 8px;" width="30%" valign="TOP"><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Desarrollo con reutilización. Creando objetos a partir de clases de biblioteca. Pasando objetos como parámetros. Utilizando la zona de código. Depuración [Debugging]: Estableciendo puntos de ruptura [Breakpoints]. Avanzando paso a paso por el código.</span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"> </span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Inspeccionando variables. Detener y terminar.</span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;"> </span></span></span><span style="color: #2a2a2a;"><span style="font-family: 'Arial Unicode MS', sans-serif;"><span style="font-size: x-small;">Otras operaciones. Abriendo paquetes no-BlueJ con BlueJ. Interaccion entre IDE&#8217;s. Novedades del nuevo BlueJ.</span></span></span></td>
</tr>
</tbody>
</table>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TEMA: “Strust, una aplicación del Patrón ‘Modelo Vista Controlador”</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Disertante: Edgar Alberto Gómez</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">A partir de las 9hs a 10hs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Introducción: ¿Qué es un Patrón de Diseño? – Descripción breve del Patrón Modelo Vista Controlador (MVC).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Desarrollo: Elementos del framework ‘Struts’: Archivos XML de configuración (web.xml, struts-config.xml), Actions, ActionForms, ActionErrors, Tags de Struts para utilizar en código HTML.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Mostrar un Proyecto Web  en Eclipse utilizando  este Framework</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Duración: 1 hora</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Charla de Acreditacion de la Carrera</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Disertante: Profesora Magíster Gladys Noemí Dapozo</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">A partir de las 10hs a las 10.30hs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Tema: Persistencia de Objetos en Bases de Datos Orientado a Objetos.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Disertante:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Mario Augusto Arqueros</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Larga a las 10.30hs hasta las 11.30hs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Contenido.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Origen y concepto del motor de bases de datos orientado a objetos.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Relación con las clases diseñadas en el diagrama de Clases.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Comunicación y manejo de la persistencia en la base de datos orientada a objetos.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Tipos y complejidades de consulta y recupero de los objetos.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bondades del motor de bases de datos orientadas a objetos DB4o.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Principales diferencias entre las BDR y las BDOO.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Ejemplo práctico entre el diagrama de clases, definición de las clases, diseño de BDR y mapeo del mismo.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Ejemplo práctico de métodos de persistencia y búsqueda de objetos en una BDOO.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Areas de aplicación.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Tiempo de dictado: 1 hora reloj.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TEMA: “Diseño de Interfaces de usuario en Aplicaciones Web&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Disertante Lic Carlos Barbiero,</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">duracion: Aproximada de 1:30</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">desde las 11.30hs hasta las 13.30hs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bosquejo</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">1) Introducción, ¿que es una interfaz de usuario?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Definiciones</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Pequeña referencia histórica</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Arquitectura de la información</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">2) Fenómeno Web 2.0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Definiciones y conceptos</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Tecnologías influyentes</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Patrones de diseño</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">3) HTML, Javascript y CSS</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Introducción</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Frameworks JS</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># Prototype</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># Mootools</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># Scriptaculous</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># Jquery</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Jquery y Jquery UI</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Ejemplos, plugins y código</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">4) Ejemplos y Tips de diseño</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Sitios y aplicaciones de ejemplo</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">- Tips de diseño en aplicaciones Web</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">5) Espacio para Preguntas</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TEMA: Reutilización de decisiones de diseño mediante patrones</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Disertante: licenciada Vanesa Moran</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">A partir de las 15hs a 16hs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Temario</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Definición de patrones. Clasificación de patrones. Importancia de la aplicación de patrones.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Descripción y análisis de algunos patrones (State, Strategy, Decorator, Adapter). Cuándo definir un patrón? Ejemplos del uso de los mismos. Ejemplos de código con la implementación de patrones.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TEMA: De principiante a Desarrollador Web</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Disertante: Agustín Casiva</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">a partir de las 16hs a las 17hs</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Abstract: Panorama general del desarrollo</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/09/30/jornada-de-charlas-de-la-facultad-de-ciencias-exactas-de-la-unne/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La razón de BDD. (Behaviour Driven Development) Parte 1</title>
		<link>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 15:11:15 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Ingeniería de Software]]></category>
		<category><![CDATA[Negocios]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Behaviour]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=853</guid>
		<description><![CDATA[En estos últimos 6 años, la forma de programar y encarar proyectos de software ha ido evolucionando. Cuando uno comienza a trabajar, siempre elige una manera (sobre todo si se siente cómodo con ella) y la va adaptando según el proyecto en el que se esté realizando.
Muchos de estos cambios se producen por los requerimientos, [...]]]></description>
			<content:encoded><![CDATA[<p>En estos últimos 6 años, la forma de programar y encarar proyectos de software ha ido evolucionando. Cuando uno comienza a trabajar, siempre elige una manera (sobre todo si se siente cómodo con ella) y la va adaptando según el proyecto en el que se esté realizando.<br />
Muchos de estos cambios se producen por los requerimientos, magnitudes y alcances de los proyectos, y también con el tipo de clientes con el que se esté tratando. En los tiempos actuales, los clientes se han vuelto mucho más exigentes a  la hora de solicitar un producto, generalmente van cambiando sus ideas y no solo eso, sinó que muchas veces (la mayoría) lo que el cliente pide no es lo que más necesita.<br />
Esto también obliga a cambios a la hora de desarrollo de productos. Si queremos crecer (como empresa o freelance) obligadamente tenemos que adaptarnos a estos cambios.<br />
BDD (Behaviour Drive Development) es una técnica de desarrollo de software ágil que fomenta la colaboración entre desarrolladores, QA (garantía de calidad) y participantes no técnicos o de negocios en un proyecto de software. Para más info sobre BDD <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">Aquí</a> (en inglés)</p>
<p><strong>A continuación comparto con ustedes una serie de artículos escritos por <a href="http://davidchelimsky.net/">David Chelimsky</a> del por qué cambiar:<br />
</strong></p>
<p>La mayoría del software que escribimos nunca se utilizará. No es nada personal,<br />
es sólo que es una industria en la que no somos muy buenos dándole a la gente lo que<br />
que quieren. La razón subyacente de esto es que los métodos tradicionales de software están diseñados para fallar -trabajan realmente en contra nosotros-. Individuos heroicos ofrecen software a pesar de su proceso de  desarrollo y no a causa de él. Veremos cómo y por qué los proyectos fallan, y enfocaremos la atención en algunos de los desafíos que enfrenta el Desarrollo Ágil de Software.</p>
<p><strong>Cómo fallan los procedimientos tradicionales</strong><br />
Los proyectos tradicionales fallan por muchas razones. Una buena manera de identificar los diferentes modos de fallo es preguntarle a tu jefe de proyecto lo que hace por la noche. (Es bueno hacerlo de vez en cuando, ayuda a su autoestima.) Es probable que nuestro jefe de proyecto se planteará una lista de temores similares a los nuestros:</p>
<p><strong>Entrega tardía según el presupuesto</strong></p>
<p>Estimamos, planificamos, tenemos todas las contingencias hasta la enésima potencia y luego, sucede la verdadera decepción de la vida real. Cuando nos deslizamos de la primera fecha, a nadie le importa demasiado. Es decir, sólo será un par de semanas. Si esto sigue sucediendo semanalmente, y así mensualmente, el suficiente número de personas, se han ido y se han unido a que podamos finalmente, poner el proyecto fuera de su miseria. Dieciocho meses a dos años suele ser suficiente. Este es software que no tiene importancia.</p>
<p><strong>Entregando la cosa incorrecta</strong></p>
<p>La mayoría de nosotros usamos un software que se entregó con retraso y más presupuesto en nuestros escritorios, en nuestros teléfonos móviles, en nuestras oficinas y hogares. De hecho nos hemos acostumbrado a los sistemas que se actualizan con correcciones de errores y nuevas características en forma de service packs y actualizaciones del sistema, o sitios web que ofrecen nuevas características con el tiempo. Pero ninguno de nosotros utiliza el software que no resuelve el problema que tenemos.<br />
Es sorprendente cuánto esfuerzo de gestión de proyectos se dedica a cuidar el calendario o el presupuesto cuando el software persigue fines infinitamente más útiles que los mencionados.<br />
Entonces, ¿cómo sucede esto? Tal vez los requisitos cambian después de que estuvimos de acuerdo con ellos,  porque el negocio siguió adelante. Tal vez no fueron lo suficientemente claros en primer lugar. Puede ser que entregamos lo que la empresa pidió en vez de que lo que necesitaban. En cualquier caso ponemos una carga de esfuerzo en entregar el proyecto, dentro del presupuesto y a tiempo, pero resulta que nadie conseguirá realmente ningún beneficio de ello. Este es software que no tiene importancia.</p>
<p><strong>Inestable en producción</strong></p>
<p>¡Hurra! El proyecto llegó a tiempo y dentro del presupuesto, los usuarios lo miraron y decidieron que les gustó, por lo que lo ponemos producción. El problema es que el software falla dos veces al día. Creemos que es algo de memoria, o algo de la configuración, o algo de clustering, o de infraestructura, o &#8230;, pero ¿a quién estamos engañando? Nosotros no sabemos realmente lo que está causando la excepción,  lo que es<br />
más bien embarazoso y nos está costando mucho dinero. Si tan solo hubiéramos pasado más tiempo en probarlo!. La gente lo utilizará esta vez y se dará por vencido cuando se cae &#8220;constantemente&#8221;. Este es software que no tiene importancia.</p>
<p><strong>Costoso de mantener</strong><br />
Hay una serie de cosas que no necesitamos considerar si estamos escribiendo software disponible. Mantenibilidad es uno de ellas. Sin embargo, si esperamos seguir con la Versión 1, Versión 2, Versión 3, o incluso una versión 2010 Professional Super Vaca Power Edition entonces fácilmente nos podemos pintar en una esquina, por no considerarnos desarrolladores río abajo.<br />
Para empezar es probable que no participamos en la puesta en producción anticipada (early release) y no estamos al tanto de las decisiones y conversaciones que condujeron al diseño actual. Si el código no es obvio, los desarrolladores tendrán que luchar para entenderlo. Del mismo modo si el diseño no es obvio, si hay un montón de acoplamiento o redundancia innecesaria, si un montón de trozos fueron copiados y pegados y éste cambió ligeramente, entonces tendrán que luchar para resolver las implicaciones de los cambios que se hacen, lo cual es un éxito seguro a la hora de introducir defectos de regresión.<br />
Con el tiempo el ritmo al que se pueden introducir nuevas características disminuirá hasta que los desarrolladores terminarán gastando más de su tiempo rastreando regresiones inesperadas y desarmando el &#8220;código spaguetti&#8221;. En algún momento, costará más mejorar el software que los ingresos que puede generar. Este es software que no tiene importancia.</p>
<p><a href="http://www.ipcorp.com.ar/blog/?p=871">Seguir leyendo la segunda parte</a></p>
<p>Traducido al castellano de &#8220;The Rspec Book, BDD with Rspec, Cucumber and Friends&#8221; Chapter 7 de David Chelimsky <a href="http://www.pragprog.com/titles/achbd/the-rspec-book">http://www.pragprog.com/titles/achbd/the-rspec-book</a> ISBN: 978-1-93435-637-1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La razón de BDD. (Behaviour Driven Development) Parte 2</title>
		<link>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd-behaviour-driven-development-parte-2/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd-behaviour-driven-development-parte-2/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 15:11:08 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Calidad]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Ingeniería de Software]]></category>
		<category><![CDATA[Negocios]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Behaviour]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=871</guid>
		<description><![CDATA[Por qué proyectos tradicionales fallan
La mayoría de estos modos de fallo ocurre con personas inteligentes tratando de hacer un buen trabajo. Para la mayor parte del software, las personas son diligentes y bien intencionadas. También es poco probable que los
errores en los proyectos son el resultado de la incompetencia o la incapacidad. Debe haber otra [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Por qué proyectos tradicionales fallan</strong></p>
<p>La mayoría de estos modos de fallo ocurre con personas inteligentes tratando de hacer un buen trabajo. Para la mayor parte del software, las personas son diligentes y bien intencionadas. También es poco probable que los<br />
errores en los proyectos son el resultado de la incompetencia o la incapacidad. Debe haber otra razón.<br />
Tal vez este tipo de fracaso es un resultado inevitable del enfoque que hemos estado tomando (el método tradicional o cascada de entrega de software). No importa cuán inteligentes o bien intencionadas sean las personas, las cosas se pueden crear para el fracaso, y es sólo por los esfuerzos sobrehumanos que el software se entrega totalmente terminado.</p>
<p><strong>Cómo funcionan los proyectos tradicionales</strong></p>
<p>La mayoría de los proyectos de software se basan en la secuencia familiar de Planificación, Análisis, Diseño, Código, pruebas, implementación. Su proceso puede tener diferentes nombres, pero las actividades básicas en cada fase será bastante consistente. (Estamos asumiendo una especie de justificación de negocio que ya ha ocurrido, aunque incluso, no es siempre el caso)</p>
<p>Empezamos con la <strong>Fase de planificación:</strong> ¿cuánta gente, cuánto tiempo, qué recursos se necesitan, básicamente, ¿cual es el costo de entregar este proyecto y qué tan pronto vamos a ver algo funcionando?<br />
Luego nos adentramos en una <strong>fase de análisis</strong>. Aquí es donde se articula en detalle el problema que estamos tratando de resolver, lo ideal sería sin prescribir cómo debe ser resuelto, aunque esto casi nunca es así.</p>
<p>Entonces tenemos una <strong>fase de diseño</strong>. Aquí es donde pensamos en cómo podemos utilizar un sistema informático para resolver el problema que tenemos articulado en análisis. Durante esta fase que pensamos sobre el diseño y la arquitectura, las decisiones técnicas a gran y pequeña escala, las diversas normas en torno a la organización, y poco a poco se descompone el problema en fragmentos manejables para que podemos producir especificaciones funcionales.</p>
<p>Ahora pasamos a la <strong>fase de codificación</strong>, donde escribimos el software que va a resolver el problema, de acuerdo a las especificaciones que salieron de la fase de diseño. Una suposición común es que en esta etapa, todo es coser y cantar, porque todo el pensamiento duro ya se hizo. Esto no es tan malo como parece, lo que estamos diciendo es que ahora se deben realizar las actividades de programación y pruebas (testing) a un riesgo relativamente bajo debido a que ya hicimos la planificación por adelantado (el análisis y diseño).</p>
<p>Ahora ya somos adultos responsables que tienen una <strong>fase de testing</strong> en la que probar el software para asegurarse de que hace lo que tenía que hacer. Esta fase incluye actividades con nombres como <em>Testing de aceptación por los usuarios</em> o <em>Performance testing</em> para destacar que nos estamos acercando a la entrega final.</p>
<p>Finalmente llegamos a la <strong>fase de implementación</strong> en la que desplegamos la aplicación en  producción. Con un nivel adecuado de fanfarronería, se desliza nuevo software en producción y comenzamos a ganar dinero!</p>
<p>Todas estas fases son necesarias. No se puede comenzar a resolver un problema que no se ha articulado, no se puede iniciar la aplicación de una solución que no se han descrito, no se puede probar software que no existe y no se puede (o al menos no se debería) implementar software que no ha sido probado.<br />
Por supuesto, en realidad, se pueden hacer cualquiera de estas cosas pero por lo general termina en lágrimas.</p>
<p><strong>¿Cómo funcionan realmente los proyectos tradicionales </strong></p>
<p>Hemos entregado proyectos en más o menos de esta manera desde que empezamos a escribir los sistemas informáticos. Ha habido varios intentos de mejorar el proceso y hacerlo más eficiente y menos propenso a errores, utilizando los documentos para formalizar la mano de fuerza, la creación de plantillas para los documentos, montaje de comités de revisión de las plantillas de los documentos, el establecimiento de normas y la acreditación formal para los comités de examen. . . . Por supuesto que podemos ver cuando el esfuerzo se ha ido.</p>
<p>La razón de toda esta ceremonia alrededor del hands-offs, opiniones, y cosas semejantes es más tarde en el ciclo de vida de entrega de software, detectar un defecto -o introducir un cambio- es más caro que ir por el camino correcto. Y no sólo un poco más &#8211; de hecho, la evidencia empírica en los últimos años ha demostrado que es exponencialmente más caro cuanto más tarde se averigua.</p>
<p>Con esto en mente, tiene sentido de adelantar el proceso. Queremos asegurarnos de que hemos reflexionado sobre los posibles resultados y cubierto todos los ángulos de manera temprana para que no nos sorprendamos por &#8220;desconocidos desconocidos&#8221; al final del día.</p>
<p>Están también, por supuesto, las cuestiones de la rendición de cuentas y responsabilidad cuando las cosas van mal inevitablemente. En una organización con una cultura de culpa tradicional cada grupo tiene que ser capaz de demostrar que no era culpa de ellos: los analistas, los arquitectos, los programadores, testers, el equipo de operaciones y en última instancia, el director del proyecto. Esto hace que, al reunir a un grupo de personas para firmar una declaración de que un artefacto -un plan de proyecto, un documento de requerimientos, especificación funcional, código &#8211; cumple con el nivel adecuado de fiabilidad. Si algo va mal ahora, debe ser debido a un error humano (es decir, la incompetencia, y más importante incompetencia de otra persona ) más adelante en el proceso.</p>
<p>Pero esto no es toda la historia. Sin embargo somos diligentes en cada una de las fases de desarrollo, cualquiera que haya entregado el software de manera tradicional hará constar la cantidad de trabajo que ocurre &#8220;debajo del radar&#8221;. El equipo de programación firma el plan del proyecto, resplandeciente en su detalle, las dependencias, los modelos de recursos, y gráficos de Gantt. Entonces los analistas comienzan a recibir a los apretones el detalle del problema y decir cosas como: &#8220;Hmm, esto parece estar más complicado de lo que pensábamos. Nos gustaría mejorar el plan, esta va a ser algo grande. &#8221;</p>
<p>A continuación, los arquitectos empiezan a trabajar sobre sus características funcionales, que descubren una serie de preguntas y ambigüedades sobre los requisitos. ¿Cómo estos datos se refieren a esa pantalla? ¿Qué pasa si este mensaje no es recibido por ese otro sistema? A veces los analistas de inmediato pueden responder a la pregunta, pero más a menudo que significa que necesitamos más tiempo de análisis y por lo tanto más de los analistas. Mejor actualización de dicho plan. Y conseguir que fuera firmado. Y firmar el nuevo documento, mayores exigencias.</p>
<p>Usted puede ver cómo este costo de coordinación puede montar rápidamente para arriba. Por supuesto que realmente se inicia durante la fase de prueba. Cuando el probador plantea un defecto, el programador pone sus manos en el aire y dice que hizo lo que había en la especificación funcional, el arquitecto culpa al analista de negocios, y así, sobre derechos de copia de seguridad de la cadena. Es fácil ver donde este coste exponencial viene.</p>
<p>En este ir y venir se convierte más en una carga, nos volvemos con más miedo de hacer cambios, lo que significa que la gente hace el trabajo fuera del proceso y los documentos fuera de sincronización entre sí y con el propio software. Las Pruebas se comprimen, la gente trabaja tarde en la de noche, ya la liberación del software se caracteriza generalmente por llanto y el crujir de los dientes, los ojos inyectados en sangre, y varios intentos fallidos de descifrado las instrucciones de las notas de publicación.</p>
<p>Esto se ve agravado por el hecho de que las personas suelen trabajar en una fase de un proyecto y luego seguir adelante, así que para cuando el probador está señalando los defectos que el analista de negocios hace tiempo que se unió a un proyecto diferente y ya no está disponible.</p>
<p><strong>Una profecía autocumplida</strong></p>
<p>En resumen, los proyectos se vuelven exponencialmente más caros al cambior cuanto más nos adentramos en ellos, debido al efecto acumulativo de mantenimiento de todos los artefactos de proyecto en sincronía, por lo que adelantar el proceso con una gran cantidad de planificación para mitigar los riesgos, actividades de análisis y diseño para reducir la posibilidad de reelaboración.</p>
<p>Ahora, ¿cuántos de estos artefactos (el plan del proyecto, la especificación de requisitos, la alta y documentos de diseño de bajo nivel, el software en sí) existían antes de que comenzó el proyecto? Eso es, exactamente ninguno! Así que todo ese esfuerzo -que crece exponencialmente- se debe a que ejecutamos los proyectos de la manera en que hacemos! Así que ahora tenemos una situación de <em>gallina y el huevo</em> o un bucle de refuerzo en la Terminología del Pensamiento Sistémático.</p>
<p>La ironía del enfoque tradicional de los proyectos es que el propio proceso hace el coste exponencial de cambio! Cuando les preguntamos a nuestros jefes de proyecto la forma en que planifican este coste exponencial de los cambios que nos dicen es &#8220;a través de la experiencia.&#8221;<br />
Han visto suficiente de proyectos en situaciones bastante pasar por el mismo dolor.</p>
<p>La respuesta de nuestra industria ha de ser reforzar el bucle en lugar de intentar algo que podría romper el ciclo completo. Sin embargo el desarrollo de software es todavía una industria muy joven, así que ¿de dónde viene esta curva de costes, en primer lugar?</p>
<p>Yendo más profundo, resulta que la curva se origina en la <em>ingeniería civil</em>. Tiene sentido que es posible que se desee pasar mucho tiempo en las fases de diseño de un puente o una embarcación. Una vez que los pilares de hormigón estén armados, si se hunden y la infraestructura de hierro fundido está en su lugar, las cosas se vuelven muy caras de corregir!</p>
<p>Sin embargo, estas normas sólo se aplican al desarrollo de software, porque se lo permitimos! El software es, así, suave. Se supone que es la parte que es fácil de cambiar, y con el enfoque correcto y algunas herramientas decentes puede ser muy maleables. Así que utilizando la metáfora de la ingeniería civil e igualando software con acero y concreto, nos hemos hecho a nosotros mismos un flaco favor.</p>
<p><a href="http://www.ipcorp.com.ar/blog/?p=880">Seguir leyendo la tercera parte</a></p>
<p>Traducido al castellano de &#8220;The Rspec Book, BDD with Rspec, Cucumber and Friends&#8221; Chapter 7 de David Chelimsky <a href="http://www.pragprog.com/titles/achbd/the-rspec-book">http://www.pragprog.com/titles/achbd/the-rspec-book</a> ISBN: 978-1-93435-637-1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd-behaviour-driven-development-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La razón de BDD. (Behaviour Driven Development) Parte 3</title>
		<link>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd-behaviour-driven-development-parte-3/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd-behaviour-driven-development-parte-3/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 15:11:01 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Calidad]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Ingeniería de Software]]></category>
		<category><![CDATA[Negocios]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=880</guid>
		<description><![CDATA[Redefiniendo el problema
No todo es pesimismo sin embargo. Hay muchos equipos por ahí que hacen sus entregas de proyectos a tiempo, dentro del presupuesto, y deleitan a sus participantes titulares, y se las arreglan para hacer una y otra vez. No es fácil. Se necesita disciplina y dedicación, y se basa en un alto grado [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Redefiniendo el problema</strong></p>
<p>No todo es pesimismo sin embargo. Hay muchos equipos por ahí que hacen sus entregas de proyectos a tiempo, dentro del presupuesto, y deleitan a sus participantes titulares, y se las arreglan para hacer una y otra vez. No es fácil. Se necesita disciplina y dedicación, y se basa en un alto grado de comunicación y colaboración, pero es posible.</p>
<p><strong>El Desarrollo Orientado al Comportamiento</strong> es una de varias metodologías ágiles. En concreto se trata de una metodología ágil de segunda generación, construído sobre el labor de unos muchachos realmente inteligentes. Vamos a ver cómo estos métodos Agiles se produjeron y cómo abordar los riesgos de los proyectos tradicionales, entonces podemos ver cómo <em>BDD</em> nos permite concentrarnos en la escritura de software, que es realmente lo que importa.</p>
<p><strong>Cómo hacen frente a los riesgos del proyecto los métodos Ágiles</strong></p>
<p>Los autores del <a href="http://agilemanifesto.org/iso/es/">manifiesto</a> van mucho más allá de las pocas líneas antes mencionadas en el mismo. También documentaron los principios que sustentan su pensamiento. Cabe destacar en este es un deseo de <em>&#8220;ofrecer software de trabajo con frecuencia, desde un par de semanas a un par de meses, con una preferencia a la escala de tiempo más corto.&#8221;</em><br />
Imaginemos por un momento que usted puede hacer esto, a saber, la distribución de software de calidad de producción cada dos semanas para sus grupos de interés, en su proyecto actual, en su organización actual, con su equipo actual, a partir de mañana. ¿Cómo se hace frente a los riesgos tradicionales de entrega que se indicaron antes?</p>
<p><strong>No más entregas tardías según el presupuesto</strong></p>
<p>Como las entregas son pequeñas, iteraciones de una o dos semanas o mini proyectos, utilizando un equipo pequeño, de tamaño fijo, es fácil de calcular nuestro presupuesto del proyecto: se trata simplemente de la velocidad de producción del equipo en el número de semanas, además de algunos de hardware y licencias.</p>
<p>Siempre partimos de una suposición razonable en el tamaño total del proyecto, es decir cuánto estamos dispuestos a invertir en la solución del problema de negocio en el primer lugar, y se da prioridad a las características apropiadamente, entonces el equipo puede entregar las cosas realmente importantes en las iteraciones tempranas. (Recuerde, estamos entregando por característica, no por módulo). Así<br />
a medida que hacia el momento en que el dinero se acaba, debemos, por definición, trabajar en funciones de menor prioridad. También podemos medir la cantidad que realmente se produce en cada iteración, conocida como nuestra velocidad o rendimiento, y usar esto para predecir cuando en realidad estamos con probabilidades de terminar.</p>
<p>Si, como nos acercamos a la fecha límite, las partes (clientes) siguen teniendo ideas y características nuevas y ven las cosas maravillosas sucediendo, pueden optar por financiar el proyecto de unas pocas iteraciones más. A la inversa que pueden decidir antes el plazo que es suficiente para la funcionalidad que ha sido entregada, o bien que quieren terminar temprano. Esta es otra opción que tienen.</p>
<p><strong>No más entregas de cosas incorrectas</strong></p>
<p>Estamos entregando los programas necesarios para los interesados cada dos semanas (por ejemplo), lo que significa que estamos ofreciendo características demostrables. No tenemos dos semanas de &#8220;repetición de esquema de base de datos&#8221; o &#8220;repetición de middleware.&#8221; Después de cada iteración podemos demostrar las nuevas características para los interesados y pueden hacer ningún ajuste o corregir cualquier malentendido cuando la obra está aún fresca en el desarrollo equipo de la mente. Estos regulan, a pequeña escala micro-correcciones que garantizan que no se terminan hasta varios meses abajo de la línea con el software que simplemente no hace lo que los actores querían.</p>
<p>Para dar inicio a la siguiente iteración podemos reunirnos con los interesados para reevaluar las prioridades de las características en caso de que algo ha cambiado desde el pasado tiempo. Esto significa que cualquier nueva idea o sugerencia se pueden programar, y la cantidad correspondiente de trabajo puede ser descomprimida (tiempo extra)</p>
<p><strong>No más inestable en Producción</strong></p>
<p>Estamos entregando cada iteración, lo que significa que tenemos que ser buenos en la construcción y en el despliegue de la aplicación. De hecho contamos con la automatización en gran medida en proceso para manejar esto por nuestra cuenta. No es raro que un equipo Agil con experiencia produzca más de 100 construcciones de buen software cada semana.<br />
En este contexto, liberar a la producción o pruebas de hardware puede ser considerado simplemente otra costrucción para otro ambiente. Los servidores de aplicaciones se configuran automáticamente y se inicializan, esquemas de bases de datos que se actualizan automáticamente, el código es automáticamente incorporado, montado y desplegado a través del cable, todo tipo de pruebas se ejecuta automáticamente para asegurar que el sistema se está comportando como se esperaba. De hecho, en un entorno ágil, la relación entre el equipo de desarrollo y las operaciones &#8220;río abajo&#8221; y los DBA es a menudo mucho más saludable y más solidaria.</p>
<p><strong>Ya no es costoso mantener</strong></p>
<p>Este último es uno de los mayores beneficios tangibles de un proceso ágil. Después de su primera iteración el equipo está en modo de mantenimiento eficaz. Ellos son la adición de características a un sistema que &#8220;funciona&#8221; por lo que tienen que ser muy cuidadosos.<br />
Suponiendo que pueden resolver las cuestiones de la seguridad de cambiar el código existente a fin de no introducir a los defectos de regresión, sus prácticas de trabajo deberían ser exactamente las mismas que los desarrolladores de apoyo intermedio. No es raro que un equipo de desarrollo ágil trabaje en varias versiones de una aplicación al mismo tiempo, la adición de características a la nueva versión, la prestación de apoyo directo a una versión temprana recientemente publicada, y proporción de corrección de errores apoyando a una versión de producción de más edad</p>
<p>Traducido al castellano de &#8220;The Rspec Book, BDD with Rspec, Cucumber and Friends&#8221; Chapter 7 de David Chelimsky <a href="http://www.pragprog.com/titles/achbd/the-rspec-book">http://www.pragprog.com/titles/achbd/the-rspec-book</a> ISBN: 978-1-93435-637-1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/08/27/la-razon-de-bdd-behaviour-driven-development-parte-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Barcode4J en JRuby y Rails</title>
		<link>http://www.ipcorp.com.ar/blog/2010/08/13/barcode4j-en-jruby-y-rails/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/08/13/barcode4j-en-jruby-y-rails/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 12:18:45 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[barcode4j]]></category>
		<category><![CDATA[barcodes]]></category>
		<category><![CDATA[codigos de barras]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=844</guid>
		<description><![CDATA[En el post anterior había explicado el uso de Gbarcode, una librería para generación de códigos de barras con Ruby. El problema es que esta librería no se puede utilizar en Jruby ya que tiene extensiones nativas en C, cosa que Jruby aún no soporta.
Después de investigar alternativas de generación de codigos de barras para [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://www.ipcorp.com.ar/blog/2010/03/16/gbarcode-codigos-de-barra-con-ruby/">post anterior</a> había explicado el uso de Gbarcode, una librería para generación de códigos de barras con Ruby. El problema es que esta librería no se puede utilizar en Jruby ya que tiene extensiones nativas en C, cosa que Jruby aún no soporta.<br />
Después de investigar alternativas de generación de codigos de barras para java como <a href="http://code.google.com/p/zxing/">Zxing</a> y <a href="http://sourceforge.net/projects/barbecue/">Barbecue</a>. Me quedé con <a href="http://barcode4j.sourceforge.net/">Barcode4j</a> por facilidad de implementación, documentación (la cual es muy completa) y sobre todo estabilidad.<br />
A continuación paso a comentarles como utilizar esta librería en JRuby.<br/><br />
1) Lo primero es descargarse en paquete binario del sitio o bien de este <a href="http://downloads.sourceforge.net/project/barcode4j/barcode4j/Barcode4J%202.0/barcode4j-2.0-bin.zip?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fbarcode4j%2Ffiles%2F&#038;ts=1281700033&#038;mirror=ufpr">enlace directo</a>.<br />
2) Al descomprimir el Zip, copiamos el contenido del directorio <b>Build</b> al directorio /lib de nuestra instalación de JRuby</p>
<p>3) Ahora vamos al código:</p>
<pre name="code" class="ruby">

require 'java'

#Importamos algunas librerías que vamos a utilizar
import 'java.awt.image.BufferedImage'
import 'java.io.OutputStream'
import 'java.io.FileOutputStream'

#Importamos las librerías de los códigos de barras (Barcode4j) que necesitamos
import 'org.krysalis.barcode4j.impl.code39.Code39Bean'
import 'org.krysalis.barcode4j.impl.code128.Code128Bean'
import 'org.krysalis.barcode4j.impl.int2of5.Interleaved2Of5Bean'
import 'org.krysalis.barcode4j.impl.codabar.CodabarBean'
import 'org.krysalis.barcode4j.impl.code128.EAN128Bean'
import 'org.krysalis.barcode4j.impl.pdf417.PDF417Bean'
import 'org.krysalis.barcode4j.impl.upcean.EAN13Bean'
import 'org.krysalis.barcode4j.impl.upcean.EAN8Bean'
import 'org.krysalis.barcode4j.impl.upcean.UPCABean'
import 'org.krysalis.barcode4j.impl.datamatrix.DataMatrixBean'
import 'org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider'
import 'org.krysalis.barcode4j.tools.UnitConv'

#Creamos el Bean y establecemos los dpi y wide_factor
bean = Interleaved2Of5Bean.new()
dpi = 150
bean.wide_factor = 3

#Creamos la imagen
ofile = java.io.File.new('/home/laptop/barcodes/barcode.png')
out = FileOutputStream.new(ofile)
canvas = BitmapCanvasProvider.new(out,"image/x-png", dpi, BufferedImage::TYPE_BYTE_BINARY, false, 0)

#Generamos el código de barras
#El segundo parámetro que pasamos es el número del que deseamos generar el codigo de barras
bean.generate_barcode(canvas, '1234567890');
canvas.finish
out.close
</pre>
<p>Con esto, generamos una imagen con nuestro codigo de barras en <b>/home/laptop/barcodes/barcode.png</b> la cual se puede incluir en cualquier pdf/html/odf, etc.</p>
<p>Espero les sea útil. Cualquier duda, no duden en comentar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/08/13/barcode4j-en-jruby-y-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JasperReports con Jruby y Rails</title>
		<link>http://www.ipcorp.com.ar/blog/2010/07/29/jasperreports-con-jruby-y-rails/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/07/29/jasperreports-con-jruby-y-rails/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 23:34:44 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[datasource]]></category>
		<category><![CDATA[i-report]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=716</guid>
		<description><![CDATA[Uno de los grandes problemas en el desarrollo con Ruby on Rails son los reportes multipágina. Debido a que el HTML (inclusive HTML 5) no soporta multipágina, si utilizamos Jruby tenemos la posibilidad de usar cualquier librería Java en nuestro desarrollo.
Afortunadamente en Java tenemos JasperReports (http://jasperforge.org/), una excelente solución al problema antes mencionado.
Para poder incluir [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los grandes problemas en el desarrollo con Ruby on Rails son los reportes multipágina. Debido a que el HTML (inclusive HTML 5) no soporta multipágina, si utilizamos Jruby tenemos la posibilidad de usar cualquier librería Java en nuestro desarrollo.<br />
Afortunadamente en Java tenemos JasperReports (http://jasperforge.org/), una excelente solución al problema antes mencionado.</p>
<p>Para poder incluir un reporte realizado con JasperReports en nuestra aplicación Jruby necesitamos:</p>
<p>1) Descargar I-Report, la herramienta de administracion de reportes de JasperReports. <a href="http://jasperforge.org/projects/ireport">http://jasperforge.org/projects/ireport</a> y descomprimirlo.</p>
<p>2) Dentro del directorio del i-report, ir a modules/ext/ y copiar todos los archivos .jar (si, todos <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) al directorio lib de la instalación de JRuby. De esta manera, ya incluimos las librerías necesarias y tenemos preparado nuestro JRuby para utilizar JasperReports.</p>
<p>3) Nos resta crear un reporte para prueba, si nunca hiciste un reporte con i-report: <a href="http://jasperforge.org//website/ireportwebsite/IR%20Website/ir_design_a_report.html?header=project&amp;target=ireport">http://jasperforge.org//website/ireportwebsite/IR%20Website/ir_design_a_report.html?header=project&amp;target=ireport</a></p>
<p>4) Finalmente el código para correr nuestro reporte es el siguiente:</p>
<pre name="code" class="ruby">require 'java'
import 'oracle.jdbc.OracleDriver' #Aqui necesitas Utilizar el Driver de la Base de datos que estas usando, en mi caso es oracle
import 'net.sf.jasperreports.engine.JasperCompileManager'
import 'org.apache.commons.dbcp.BasicDataSource'
import'java.util.HashMap'
import'net.sf.jasperreports.engine.JasperFillManager'
import'net.sf.jasperreports.engine.JasperExportManager'                                                                             

#Creo el datasource
basicdatasource = BasicDataSource.new
basicdatasource.driver_class_name = 'oracle.jdbc.OracleDriver'
basicdatasource.username = 'usuario'
basicdatasource.password = 'password'
basicdatasource.url = 'jdbc:oracle:thin:@localhost:1521:XE'
basicdatasource.connection
conexion = basicdatasource.connection

#Compilamos el reporte
jasperReport = JasperCompileManager.compile_report('/url_de_tu_archivo_jrxml/reporte.jrxml')
#Para pasar los parámetros, definimos un objeto HashMap
m = HashMap.new
m.put('parametro_1','valor_parametro_1')
m.put('parametro_2','valor_parametro_2')
m.put('parametro_n','valor_parametro_n')

#Genero el reporte
jasperPrint = JasperFillManager.fill_report(jasperReport, m,conexion)                           

#Exporto el PDF
JasperExportManager.export_report_to_pdf_file(jasperprint, 'path_al_archivo_PDF.pdf')</pre>
<p>Si deseamos generar reportes en Rails, podemos por ejemplo ubicar los reportes en el directorio public/reportes y utilizar  send_file para enviarlos, por ejemplo:</p>
<pre name="code" class="ruby">
JasperExportManager.export_report_to_pdf_file(jasperprint, RAILS_ROOT+"/public/reportes/reporte.pdf")
send_file RAILS_ROOT+"/public/reportes/reporte.pdf"
</pre>
<p>Espero les sea de utilidad, cualquier cosa comenten y trataré de despejar dudas <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/07/29/jasperreports-con-jruby-y-rails/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>EGit: plugin de git para Eclipse</title>
		<link>http://www.ipcorp.com.ar/blog/2010/03/26/egit-plugin-de-git-para-eclipse/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/03/26/egit-plugin-de-git-para-eclipse/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 20:13:09 +0000</pubDate>
		<dc:creator>Roxana Pintos</dc:creator>
				<category><![CDATA[Herramientas]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=686</guid>
		<description><![CDATA[ 
Para aquellos desarrolladores que utilizan el IDE Eclipse y el sistema de control de versiones git les va a interesar esta info:  org.eclipse hizo pública la primera versión del plug-in EGit que proporciona soporte integrado para el SCM distribuído git, utilizando JGit.
JGit es una biblioteca que implementa Git en Java. EGit, a diferencia [...]]]></description>
			<content:encoded><![CDATA[<p><span><span><span style="background-color: #ffffff;"><span><span><span style="background-color: #ffffff;"> </span></span></span></span></span></span></p>
<p><span id="e43j"><span><span style="background-color: #ffffff;"><span id="dxj-"><span><span style="background-color: #ffffff;">Para aquellos desarrolladores que utilizan el IDE Eclipse y el sistema de control de versiones git les va a interesar esta info: <span id="yw78"><span><span style="background-color: #ffffff;"><span id="u0rz"><span><span style="background-color: #ffffff;"> <em>org.eclipse</em></span></span></span></span></span></span> hizo pública <span id="x9ys"><span><span style="background-color: #ffffff;"><span id="aj7v"><span><span style="background-color: #ffffff;">la primera versión </span></span></span></span></span></span>del plug-in EGit que proporciona soporte integrado para el SCM distribuído git, utilizando JGit.</span></span></span></span></span></span><span id="e43j"><span><span style="background-color: #ffffff;"><span id="dxj-"><span><span style="background-color: #ffffff;"><br />
<span id="w113"><span><span style="background-color: #ffffff;">JGit es una biblioteca que implementa Git en Java. </span></span></span><span id="aegj"><span><span style="background-color: #ffffff;"><span id="mh:4"><span><span style="background-color: #ffffff;"><span id="hhg0"><span><span style="background-color: #ffffff;">EGit, a diferencia de Eclipse Subversion, no tiene dependencias externas o de los requisitos del código nativo.</span></span></span><br />
</span></span></span><br />
En la página del proyecto hay un <a id="hcvo" title="manual" href="http://wiki.eclipse.org/EGit/User_Guide">manual</a> muy completo.</span></span></span></span></span></span></span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/03/26/egit-plugin-de-git-para-eclipse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

