<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Eliseo Ocampos</title>
	<atom:link href="http://eocampos.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://eocampos.wordpress.com</link>
	<description>Brand new blog :)</description>
	<lastBuildDate>Thu, 15 Apr 2010 19:32:42 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='eocampos.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Eliseo Ocampos</title>
		<link>http://eocampos.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://eocampos.wordpress.com/osd.xml" title="Eliseo Ocampos" />
	<atom:link rel='hub' href='http://eocampos.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Useful OSM scripts</title>
		<link>http://eocampos.wordpress.com/2010/04/15/useful-osm-scripts/</link>
		<comments>http://eocampos.wordpress.com/2010/04/15/useful-osm-scripts/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 19:21:32 +0000</pubDate>
		<dc:creator>eocampos</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[osm]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://eocampos.wordpress.com/?p=50</guid>
		<description><![CDATA[I want to share with you the repository where I&#8217;ll put those scritps that I use while editing OpenStreetMap data. Right now I pushed only one script that helps you to delete duplicate nodes that you may encounter in way intersections, it was really useful while I was updating data from my country (Paraguay). You [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=eocampos.wordpress.com&amp;blog=5882732&amp;post=50&amp;subd=eocampos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I want to share with you the repository where I&#8217;ll put those scritps that I use while editing <a href="http://www.openstreetmap.org/">OpenStreetMap</a> data.</p>
<p>Right now I pushed only one script that helps you to delete duplicate nodes that you may encounter in way intersections, it was really useful while I was updating data from my country (<a href="http://wiki.openstreetmap.org/wiki/Paraguay">Paraguay</a>).</p>
<p>You can access the repository <a href="http://github.com/roskoff/osm-scripts">at GitHub</a>, I hope it can help you too.</p>
<p>(If you are from Paraguay I invite you to join us in the <a href="http://wiki.openstreetmap.org/wiki/Paraguay">WikiProject &#8211; Paraguay</a>, just create an account on OpenStreetMap and begin to upload your mapping data!)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/eocampos.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/eocampos.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/eocampos.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/eocampos.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/eocampos.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/eocampos.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/eocampos.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/eocampos.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=eocampos.wordpress.com&amp;blog=5882732&amp;post=50&amp;subd=eocampos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://eocampos.wordpress.com/2010/04/15/useful-osm-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/803ea00e2f85d634e2f281345a1f9e33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">eocampos</media:title>
		</media:content>
	</item>
		<item>
		<title>PyKata &amp; Google Summer of Code Proposal</title>
		<link>http://eocampos.wordpress.com/2010/04/09/pykata-google-summer-of-code-proposal/</link>
		<comments>http://eocampos.wordpress.com/2010/04/09/pykata-google-summer-of-code-proposal/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 07:16:44 +0000</pubDate>
		<dc:creator>eocampos</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[pykata]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://eocampos.wordpress.com/?p=45</guid>
		<description><![CDATA[A few weeks ago I found PyKata and I was surprised with the similarities of some ideas that I had in mind some time ago. PyKata aims to be the principal tool for learn and practice Python, and as a project that is in early stages it has plenty of room for improvements. I realized [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=eocampos.wordpress.com&amp;blog=5882732&amp;post=45&amp;subd=eocampos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I found <a href="http://pykata.appspot.com">PyKata</a> and I was surprised with the similarities of some ideas that I had in mind some time ago.</p>
<p>PyKata aims to be the principal tool for learn and practice <a href="http://www.python.org">Python</a>, and as a project that is in early stages it has plenty of room for improvements. I realized too that they are accepting proposals for the upcoming <a href="http://code.google.com/soc/">Google Summer of Code 2010</a> so I decided (thanks to <a href="http://crodas.org/">César Rodas</a>) to contact the mentor to discuss a proposal.</p>
<p>And here I am, just hours before the dead line for submitting students&#8217; proposals, to announce that I submitted my first proposal to GSoC. I hope I can help this very interesting project in the future.</p>
<p>Finally, I have to thank to Andrew Harrington and David McQuigg for all the suggestions they gave to me.</p>
<p>If you want to see my proposal go here: <a href="http://socghop.appspot.com/gsoc/student_proposal/show/google/gsoc2010/eocampos/t127079203228">Learning Python In The Fun Way: PyKata</a></p>
<p>And if you want to see the discussion forum go here: <a href="http://groups.google.com/group/pywhip/browse_thread/thread/c8a871f04d530b03/fe655c5d72de7bca#fe655c5d72de7bca">GSoC 2010 &#8211; PyKata Proposal </a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/eocampos.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/eocampos.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/eocampos.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/eocampos.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/eocampos.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/eocampos.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/eocampos.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/eocampos.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=eocampos.wordpress.com&amp;blog=5882732&amp;post=45&amp;subd=eocampos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://eocampos.wordpress.com/2010/04/09/pykata-google-summer-of-code-proposal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/803ea00e2f85d634e2f281345a1f9e33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">eocampos</media:title>
		</media:content>
	</item>
		<item>
		<title>Manteniendo elementos en tiempo de ejecución en un programa Haskell</title>
		<link>http://eocampos.wordpress.com/2008/12/31/manteniendo-elementos-en-tiempo-de-ejecucion-en-un-programa-haskell/</link>
		<comments>http://eocampos.wordpress.com/2008/12/31/manteniendo-elementos-en-tiempo-de-ejecucion-en-un-programa-haskell/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 22:41:40 +0000</pubDate>
		<dc:creator>eocampos</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://eocampos.wordpress.com/?p=7</guid>
		<description><![CDATA[Introducción y bienvenida Les presento a mi recién nacido blog , un espacio donde voy a tratar de compartir algunos conocimientos que espero sean de utilidad a la mayor cantidad posible de personas. Mayormente estaría posteando cosas relativas a programación y temas afines. En este primer post voy a estar tratando el problema de mantener [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=eocampos.wordpress.com&amp;blog=5882732&amp;post=7&amp;subd=eocampos&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h4>Introducción y bienvenida</h4>
<p>Les presento a mi recién nacido blog <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , un espacio donde voy a tratar de compartir algunos conocimientos que espero sean de utilidad a la mayor cantidad posible de personas. Mayormente estaría posteando cosas relativas a programación y temas afines.</p>
<p>En este primer post voy a estar tratando el problema de mantener elementos (de algún tipo) durante la ejecución de un programa escrito en <a href="http://www.haskell.org" target="_blank">Haskell</a>. Al escribir esto, estoy asumiendo que ya tienes un conocimiento considerable sobre el lenguaje, sus construcciones, librerías, entornos, etc. Si no tienes este conocimiento es buen momento para aprender este interesante lenguaje, el punto de partida es la página principal de <a href="http://www.haskell.org" target="_blank">Haskell</a>.</p>
<h4>El problema y un enfoque para solucionarlo</h4>
<p>Debido a que Haskell es un lenguaje de programación <em>puramente funcional,</em> nuestros programas estarán compuestos únicamente por funciones, y la manera en que vamos resolviendo problemas es mediante las llamadas a estas funciones. En un lenguaje funcional, el concepto de imperatividad se cambia por la aplicación de funciones a parámetros, esto es, al programar nos centramos en describir lo que queremos hacer, y no cómo queremos que se haga. Además de esto, como no estamos modificando <em>el estado</em> del programa, éste carece de variables, como normalmente se conocen en los lenguajes de programación imperativos.</p>
<p>A esto viene el planteamiento del problema: cómo mantener elementos disponibles siempre en tiempo de ejución entre las llamadas a las funciones? Muchas veces, necesitamos tener disponibles un conjunto de elementos durante el transcurso de la ejecución para poder utilizarlos, y adicionalmente tal vez deseemos tambien modificarlos, agregar otros, elminarlos, etc.<br />
<span id="more-7"></span><br />
Un ejemplo de este patrón sería manejar una &#8220;tabla de símbolos&#8221; para un intérprete sencillo, digamos un evaluador aritmético, que permita definir <em>nombres</em> que puedan tener <em>valores </em>asociados (variables), y que tengan que estar disponibles para su utilización posterior. O digamos tal vez que implementamos un gestor de citas en un calendario, en donde las <em>citas</em>, deben estar disponibles para su chequeo, para posponerlas a otra <em>fecha</em> del calendario, o para descartarlas, etc.</p>
<p>Bien, en este punto identificamos los elementos (variables y citas) que necesitamos disponibles, como necesitamos un conjunto de ellos, debemos buscar la manera de que esté disponible una lista de estos elementos. Gracias a que en Haskell nos manejamos con llamadas a funciones, podemos utilizar el paso de parámetros y la recursividad para plantear una solución a la problemática.</p>
<h4>Aplicación paso a paso: linedit, un editor de texto sencillo</h4>
<p>En este ejemplo, haremos un editor de texto muy (pero muy) simple (y a pesar de esto, funcional). Para editar un texto, necesitamos tener disponible obviamente el texto mismo, pero para poder aplicar el patrón identificaremos a <em>cada linea</em> como un elemento, de esta manera, nuestra intención será mantener una lista de lineas del texto que estemos editando durante la ejecución.</p>
<p>Nuestro editor será capaz de:</p>
<ul>
<li>Cargar un archivo para su edición</li>
<li>Mostrar el archivo en pantalla</li>
<li>Guardar el archivo con un nombre dado</li>
<li>Agregar texto al final del archivo</li>
<li>Borrar lineas del archivo</li>
<li>Editar lineas del archivo</li>
</ul>
<h4>Esqueleto principal del programa</h4>
<p>Escribimos la función principal, con una cabecera de bienvenida y una llamada a otra función que se encargará de recibir los comandos y mantener la lista en tiempo de ejecución:</p>
<pre>1	main = do
2	  imprimirCabecera
3	  main_ []
4
5	main_ xs = do
6	  cmd &lt;- prompt "linedit&gt; "
7	  let comando = trim cmd
8	  case comando of
9	    "help" -&gt; do
10	             mostrarAyuda
11	             main_ xs
12	    "?"    -&gt; do
13	             mostrarAyuda
14	             main_ xs
15	    "quit" -&gt; return ()
16	    ""     -&gt; main_ xs
17	    otherwise -&gt; do
18	                newXs &lt;- catch (evaluar comando xs) manejador
19	                main_ newXs
20	                where
21	                  manejador e = do
22	                    putStrLn ("Error al evaluar \"" ++ comando ++ "\"" )
23	                    print e
24	                    return xs</pre>
<p>En 3, llamamos a <strong>main_</strong> con una lista vacía, pues inicialmente no estamos editando ningún archivo, pero si nos fijamos mejor, podemos ver el truco en 11, 14 y 16. En esos puntos estamos haciendo una llamada recursiva a <strong>main_</strong> con el mismo parámetro que recibió luego de haber ejecutado el comando (help, ?, y comando vacío respectivamente), ya que estos comandos no modifican las líneas que guardaremos. Por otro lado, es más interesante 18 y 19, donde vemos que hay una llamada a la función <strong>evaluar</strong>, la cual toma los comandos que sí modificarán la lista (editar, agregar, etc.) y retorna una nueva lista con las modificaciones, por lo que en la siguiente llamada a <strong>main_ </strong>se le debe pasar <strong>newXs</strong>. Un caso particular ocurre si surge alguna excepción, teniendo que ejecutarse el manejador, en este caso termina devolviéndose la lista sin modificación alguna.</p>
<p>Pasemos a ver ahora la funcion evaluar:</p>
<pre>1	-- evaluar: Recibe un comando del prompt y lo interpreta
2       -- llamando a la funcion correspondiente.
3	evaluar cmd xs = do
4	   let tokens = words cmd
5	   case (tokens !! 0) of
6	     "mostrar" -&gt; do
7	                 mostrarArchivo xs
8	                 return xs
9	     "cargar"  -&gt; do
10	                 archivo &lt;- catch (cargarArchivo (tokens !! 1)) handler
11	                 let newXs = numerarLineas archivo
12	                 return newXs
13	                   where handler e = do
14	                           putStrLn ("No se pudo leer \"" ++ tokens !! 1 ++ "\"")
15	                           print e
16	                           return []
17	     "guardar" -&gt; do
18	                 guardarArchivo (tokens !! 1) xs
19	                 return xs
20	     "agregar" -&gt; return (agregarLinea (unwords (tail tokens)) xs)
21	     "editar"  -&gt; return (editarLinea (read (tokens !! 1))
22	                                      (unwords(drop 2 tokens))
23	                                       xs)
24	     "borrar"  -&gt; return (borrarLineas (read (tokens !! 1))
25	                                       (read (tokens !! 2))
26	                                       xs)
27	     otherwise -&gt; do
28	                 putStrLn $ "No reconozco este comando: \"" ++ tokens !! 0 ++ "\""
29	                 return xs</pre>
<p>Dentro de evaluar, como se puede ver, ya no hay llamadas a <strong>main_</strong>, sin embargo, hay que notar que las funciones de edición <em>necesitan</em> las líneas, y luego deben retornar el resultado de su operación, es por eso que en 20, 21 y 24 las llamadas a <strong>agregarLinea</strong>, <strong>editarLinea </strong>y <strong>borrarLineas </strong>todas reciben respectivamente como parámetro a la lista, y terminan devolviéndola modificada para que de esta manera siempre estén disponibles.</p>
<p>Para ir adentrándonos más en el código de nuestro programa, vamos a ver una de las funciones que editan nuestra lista, en este caso agregar:</p>
<pre>1	-- agregarLinea: Agrega una linea al final del archivo
2	agregarLinea linea xs = xs ++ [(n, linea)]
3	  where n = (fst (last xs)) + 1</pre>
<p>Algo raro que notar? Hasta este momento no hemos dicho el tipo exacto de los elementos de nuestra lista, pudieron haber sido simples Strings, pero para ejemplificar mejor se optó por una lista de tuplas de un entero y un String, donde cada entero es el número de la línea en tiempo de ejecución (así también se puede ver mejor como se aplicaría a los elementos {nombre, valor} para el caso de las variables y digamos {fecha, cita} para el ejemplo del calendario). Lo que hacemos en esta función es simplemente encontrar el número de la última línea, sumarle 1, y concatenar como una tupla (el número y la línea) a la lista recibida inicialmente.</p>
<p>De esta forma, podemos ver como siempre tenemos disponible algún &#8220;xs&#8221;, es decir, alguna lista a la que siempre podemos acceder para hacer las modificaciones que necesitemos.</p>
<h4>Ventajas y Desventajas</h4>
<p>Este enfoque dista mucho de ser el mejor posible, como ventaja tenemos que es muy fácil comprenderlo, es decir, consta nada más de un parámetro adicional a las funciones que van a necesitar la lista aprovechando la posibilidad de llamadas recursivas si fuera necesario. Por otro lado, no es muy &#8220;escalable&#8221;, es decir, en funciones o módulos sencillos es perfectamente manejable y hasta cómodo si se quiere, pero ni pensar en utilizarlo en un programa con una cantidad considerable de funciones, pues la depuración sería dificultosa.</p>
<p>El código completo de <strong>linedit</strong> lo pueden bajar de <a href="http://gist.github.com/42129">aquí</a>, está publicado bajo la licencia GPL, por lo que pueden disponer del código para lo que gusten (si es que les sirve <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), cualquier bug, mejora, sugerencia o preguntas que puedan surgir pueden agregar un comentario.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/eocampos.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/eocampos.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/eocampos.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/eocampos.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/eocampos.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/eocampos.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/eocampos.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/eocampos.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=eocampos.wordpress.com&amp;blog=5882732&amp;post=7&amp;subd=eocampos&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://eocampos.wordpress.com/2008/12/31/manteniendo-elementos-en-tiempo-de-ejecucion-en-un-programa-haskell/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/803ea00e2f85d634e2f281345a1f9e33?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">eocampos</media:title>
		</media:content>
	</item>
	</channel>
</rss>
