<?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>La Sombra de Dijkstra</title>
	<atom:link href="http://www.programando.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.programando.org/blog</link>
	<description>Sobre el arte y la práctica de la programación</description>
	<lastBuildDate>Fri, 07 Dec 2012 02:21:46 +0000</lastBuildDate>
	<language>es-CL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Warmup Fibonacci (desafío)</title>
		<link>http://www.programando.org/blog/2012/12/warmup-fibonacci-desafio/</link>
		<comments>http://www.programando.org/blog/2012/12/warmup-fibonacci-desafio/#comments</comments>
		<pubDate>Tue, 04 Dec 2012 00:53:28 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Destacados]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=555</guid>
		<description><![CDATA[Este ejercicio es un calentamiento para los ejercicios que vendrán y los desafíos que tendremos el próximo año.
Recordemos que los números de Fibonacci se definen ...]]></description>
			<content:encoded><![CDATA[<p>Este ejercicio es un calentamiento para los ejercicios que vendrán y los desafíos que tendremos el próximo año.</p>
<p>Recordemos que los números de Fibonacci se definen como la secuencia de números que se construyen de la siguiente manera:</p>
<blockquote><p>Fib(1) = 1</p>
<p>Fib(2) = 1</p>
<p>Fib(3) = 2</p>
<p>Fib(4) = 3</p>
<p>Fib(i) = Fib(i-1)+Fib(i-2)  (para i&gt;= 3)</p></blockquote>
<p>Es decir, cada número de fibonacci es la suma de los números previos de Fibonacci.</p>
<p>El ejercicio consiste en lo siguiente: construir un programa que reciba 2 números a y b, la salida del programa debe ser la cantidad de números de Fibonacci que hay entre a y b.</p>
<p>Por ejemplo, para los siguientes valores  a=1234567890 y  b=9876543210 el programa debe entregar el valor 4, porque hay sólo 4 números de fibonacci entre a y b.</p>
<p>En otras palabras, para los número a y b, se debe contar los números de Fibonacci Fi tales que a &lt;= Fi &lt;= b.</p>
<p>Tienen 2 semanas de plazo para resolver este desafío.</p>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/12/fibonacci-shell.jpg"><img class="aligncenter size-full wp-image-558" title="fibonacci-shell" src="http://www.programando.org/blog/wp-content/uploads/2012/12/fibonacci-shell.jpg" alt="" width="375" height="250" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/12/warmup-fibonacci-desafio/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Tu jefe es un programador funcional</title>
		<link>http://www.programando.org/blog/2012/11/tu-jefe-es-un-programador-funcional/</link>
		<comments>http://www.programando.org/blog/2012/11/tu-jefe-es-un-programador-funcional/#comments</comments>
		<pubDate>Thu, 22 Nov 2012 00:58:30 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Programación Funcional]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[lenguajes de programación]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=548</guid>
		<description><![CDATA[Probablemente tu jefe, y mi jefe, sin ser informáticos, ni programadores sean mejores programadores funcionales que tu mismo, claro, porque es probable que ellos utilicen ...]]></description>
			<content:encoded><![CDATA[<p>Probablemente tu jefe, y mi jefe, sin ser informáticos, ni programadores sean mejores programadores funcionales que tu mismo, claro, porque es probable que ellos utilicen uno de los lenguajes funcionales más populares que existen: Excel.</p>
<p>Sí, Excel, ese que usan muchos de tus colegas no informáticos, soporta perfectamente el paradigma funcional.</p>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/11/excel.jpg"><img class="aligncenter size-full wp-image-549" title="excel" src="http://www.programando.org/blog/wp-content/uploads/2012/11/excel.jpg" alt="" width="480" height="360" /></a></p>
<p>Primero en Excel tienes <strong>valores</strong>, números, o a veces textos, que colocas en celdas. Por ejemplo, puedes colocar en la celda A1 el valor 2, y en la celda A2 el valor 3.</p>
<p>Después tienes <strong>funciones</strong>, u operaciones que trabajan sobre valores que se encuentran en una celda, por ejemplo, puedes definir que el valor de la celda A3 se calcula como A3 = A1 * A2. Excel te mostrará el valor de aplicar esta operación a los valores disponibles en ese momento en las celdas A1 y A2, en nuestro caso se verá en A3 el número 6.</p>
<div id="attachment_3123" class="wp-caption aligncenter" style="width: 151px"><a href="http://www.lnds.net/blog/wp-content/uploads/2012/11/Captura-de-pantalla-2012-11-21-a-las-20.54.00.png"><img class="size-full wp-image-3123" title="Definiendo el valor de una celda en función de otras dos" src="http://www.lnds.net/blog/wp-content/uploads/2012/11/Captura-de-pantalla-2012-11-21-a-las-20.54.00.png" alt="Definiendo el valor de una celda en función de otras dos" width="141" height="81" /></a><p class="wp-caption-text">Definiendo el valor de una celda en función de otras dos</p></div>
<p>Lo &#8220;<em>interesante&#8221;</em> es que esta operación  no cambia el valor de las celdas que son usadas como <strong>argumentos. </strong>Esto quiere decir que en Excel no hay <strong>efectos laterales</strong>, el resultado de la función sólo afecta a aquellos que usen el resultado, pero no a los argumentos de entrada.</p>
<p style="text-align: left;">Veamos que pasa si agregamos otras ecuaciones a nuestra planilla, haciendo que unos valores dependan de resultados previos.</p>
<p style="text-align: left;">Por ejemplo: A4=A1+2, B3=A2*A2, B4=A1-A2, C3 = B3-B4, C4 = B3*B4.</p>
<p style="text-align: left;">Excel nos permte ver las dependencias de esta secuencia de cálculos:</p>
<div id="attachment_3124" class="wp-caption aligncenter" style="width: 313px"><a href="http://www.lnds.net/blog/wp-content/uploads/2012/11/Captura-de-pantalla-2012-11-21-a-las-21.03.11.png"><img class="size-full wp-image-3124" title="Dependencias entre las celdas" src="http://www.lnds.net/blog/wp-content/uploads/2012/11/Captura-de-pantalla-2012-11-21-a-las-21.03.11.png" alt="Dependencias entre las celdas" width="303" height="120" /></a><p class="wp-caption-text">Dependencias entre las celdas</p></div>
<p>Decimos que el orden de evaluación está dado por las dependencias de los datos.</p>
<p>Otra cosa interesante es que dados los mismos valores de entrada el resultado final no cambia, en nuestro caso, si A1 contiene el valor 1, y A2 contiene el valor 2, entonces la celda C4 siempre tendrá el valor -4, <em>no hay sorpresas</em>, el valor de la celda C4 depende sólo de los argumentos de entrada y la secuencia de cálculos intermedios.</p>
<p>Consideren la siguiente función en C:</p>
<blockquote><p>int calc(int x, int y)<br />
{<br />
static int z = 0;<br />
z = z + x * y;<br />
return z;</p>
<p>}</p></blockquote>
<p>&nbsp;</p>
<p>Si invocamos esta función la primera vez con los valores 1 y 2, el resultado será 2, pero si lo invocamos por segunda vez, con los argumentos 2 y 3, el resultado será 8, si la invocamos por tercera vez, con los valores 1 y 2, ¡el resultado será 10!</p>
<p>Esto pasa porque C permite efectos laterales, en particular al declarar la variable z como static hace que ese valor se mantenga a lo largo de cada invocación a la función.</p>
<p>Los lenguajes de programación funcional prohiben esta opción, no pueden haber efectos laterales como estos, el resultado de la función solo debe ser el mismo para los mismos argumentos de entrada.</p>
<p>Ahora bien, excel, usada a este nivel, junto con algunas funciones pre definidas, opera como lenguaje funcional, pero no todo excel es funcional, por ejemplo, cuando se usan macros, o se crean funciones con lenguajes de extensión en VBA u otros lenguajes (como C#), podemos violar el paradigma funcional, que exige que no hayan &#8220;efectos laterales&#8221;, y todo se obtenga mediante el proceso de reducción y combinación.</p>
<p>Pero la mayor parte de los usuarios la usan a este nivel, y sin darse cuenta, programan usando el paradigma funcional.</p>
<p>Las propiedades más importantes de la programación funcional están disponibles en Excel a nivel básico. Lo demás, todo lo complicado, que asusta a tantos programadores, como los combinadores, la monadas, el currying,  las reducciones, el lambda cálculus, etc, son temas más avanzados, que a pesar de sus nombres intimidantes, y de la costumbre de la comunidad funcional de &#8220;hablar en difícil&#8221;, son temas perfectamente abordables por cualquier programador.</p>
<p>Pero si nunca te has animado a aprender la programación funcional, quizás es hora de que abras una planilla de cálculo y empieces a jugar con ella, verás que es muy iluminador.</p>
<p>Ejercicios:</p>
<ul>
<li>Calcula la <a href="http://es.wikipedia.org/wiki/Sucesi%C3%B3n_de_Fibonacci">sucesión de Fibonacci</a> en Excel</li>
<li>¿Es posible crear funciones recursivas en Excel? (sin usar VB  o algún lenguaje de programación para &#8220;extender&#8221; excel).</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/11/tu-jefe-es-un-programador-funcional/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adios Daniel</title>
		<link>http://www.programando.org/blog/2012/11/adios-daniel/</link>
		<comments>http://www.programando.org/blog/2012/11/adios-daniel/#comments</comments>
		<pubDate>Thu, 15 Nov 2012 00:47:23 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Coding Dojo]]></category>
		<category><![CDATA[Desarrollo Humano]]></category>
		<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Testimonios]]></category>
		<category><![CDATA[amigos]]></category>
		<category><![CDATA[Daniel Molina Wegener]]></category>
		<category><![CDATA[Hackers]]></category>
		<category><![CDATA[programadores]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=542</guid>
		<description><![CDATA[Daniel Molina dejó este mundo este lunes, de forma inexplicable, este joven brillante ya no estará con nosotros.
Daniel era un programador extraordinario, que nos regaló ...]]></description>
			<content:encoded><![CDATA[<div id="attachment_543" class="wp-caption alignleft" style="width: 310px"><a href="http://www.programando.org/blog/wp-content/uploads/2012/11/damowe.png"><img class="size-full wp-image-543" title="Daniel Molina" src="http://www.programando.org/blog/wp-content/uploads/2012/11/damowe.png" alt="" width="300" height="322" /></a><p class="wp-caption-text">Daniel Molina Wegener, @damowe, dmw</p></div>
<p>Daniel Molina dejó este mundo este lunes, de forma inexplicable, este joven brillante ya no estará con nosotros.</p>
<p>Daniel era un programador extraordinario, que nos regaló probablemente su último post, que salió publicado este domingo en este mismo sitio.</p>
<p><a href="http://www.programando.org/blog/2012/11/que-es-la-programacion-funcional/">Qué es la programación funcional</a>.</p>
<p>&nbsp;</p>
<p>Daniel era brillante, y ganó desafíos, de hecho participaba activamente resolviendo algunos de los desafíos que planteamos.</p>
<p>Su trabajo en estos desafíos está en <a href="https://github.com/dmw/dmw-programando-org">este repositorio GitHub</a>, de hecho me he encargado de clonar ese repositorio en particular, ante la eventualidad de que desaparezca dada su partida.</p>
<p>En particular su trabajo en el desafío de Octubre es notable, a pesar de que el problema tenía una solución sencila, y pretendía medir otra cosa, él fue más allá, esta imagen muestra el análisis que estaba haciendo para parsear programas en Fortran IV, este grafo se genera a partir de su analizador del código recibido en la entrada:</p>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/11/example1.f90.png"><img class="alignleft  wp-image-544" title="example1.f90" src="http://www.programando.org/blog/wp-content/uploads/2012/11/example1.f90-1024x415.png" alt="" width="614" height="249" /></a></p>
<p>No sólo hemos perdido a una gran mente, a un gran programador y hacker, también a una buena persona, por lo poco que pude conocerlo, y por el testimonio de los que lo conocieron.</p>
<p>Humildemente, este espacio mantendrá su nombre, los desafíos volverán, y una vez al año entregaremos el premio Daniel Molina Wegener al mejor competidor, si me ayudan podemos hacer algo muy bonito y conmemorativo por él. Veré la manera de conseguir un premio adecuado que honre su memoria. Ustedes pueden honrarlo participando o promoviendo la participación entre sus amigos programadores o hackers. Estoy seguro que el sonreiría feliz con la idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/11/adios-daniel/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Qué es la Programación Funcional?</title>
		<link>http://www.programando.org/blog/2012/11/que-es-la-programacion-funcional/</link>
		<comments>http://www.programando.org/blog/2012/11/que-es-la-programacion-funcional/#comments</comments>
		<pubDate>Mon, 12 Nov 2012 00:20:28 +0000</pubDate>
		<dc:creator>damowe</dc:creator>
				<category><![CDATA[Destacados]]></category>
		<category><![CDATA[Programación Funcional]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=481</guid>
		<description><![CDATA[La programación funcional, o mejor dicho, los lenguajes de programación funcionales, son aquellos lenguajes donde las variables no tienen estado — no hay cambios en ...]]></description>
			<content:encoded><![CDATA[<p>La programación funcional, o mejor dicho, los lenguajes de programación funcionales, son aquellos lenguajes donde las variables no tienen estado — no hay cambios en éstas a lo largo del tiempo — y son inmutables — no pueden cambiarse los valores a lo largo de la ejecución. Además los programas se estructuran componiendo <em>expresiones</em> que se evalúan como funciones. Dentro de los lenguajes funcionales tenemos Lisp, Scheme, Clojure, Haskell, OCaml y Standard ML, entre otros. Estos lenguajes están diversidad de tipificación, donde se encuentran lenguajes dinámicos, estáticos y estáticos fuertes.</p>
<p style="text-align: center;"><a href="http://www.programando.org/blog/wp-content/uploads/2012/11/976083_74231444.jpg"><img class="wp-image-531 aligncenter" title="976083_74231444" src="http://www.programando.org/blog/wp-content/uploads/2012/11/976083_74231444-1024x682.jpg" alt="" width="430" height="286" /></a></p>
<p>En los lenguajes funcionales las instrucciones cíclicas como <strong>for</strong>, <strong>while</strong> y <strong>do-while</strong> no existen. Todo se procesa usando recursividad y funciones de alto orden. Esto se debe a los fundamentos matemáticos de la mayoría de los lenguajes funcionales, principalmente con bases en el sistema formal diseñado por Alonzo Church para definir <em>cómputos</em> y estudiar las <em>aplicaciones</em> de las funciones llamado Cálculo Lambda. En este sistema formal se puede expresar recursividad en las funciones, y entre otras cosas interesantes, se pueden expresar combinadores — funciones sin variables libres — como el Combinador de Punto Fijo o Y-Combinator, que expresa recursividad sin hacer llamadas recursivas. En el Cálculo Lambda existen tres transformaciones esenciales, la conversión α, la reducción β y la conversión η. En la conversión α se sustituyen los nombres de las variables para dar mas claridad a la aplicación de las funciones, por ejemplo evitando duplicados en sus nombres. En la reducción β se traza el llamado de las funciones sustituyendo las funciones por sus expresiones resultantes. Finalmente en las conversiones η se busca las equivalencias de trazado de funciones sustituyéndolas por sus equivalentes. Estas <em>transformaciones</em> también pueden ser aplicadas en los lenguajes funcionales — o en su mayoría — dando lugar lenguajes que cuentan con una gran <em>expresividad</em> y <em>consistencia</em>.</p>
<p>Les pondré el clásico ejemplo del chiste geek del castigo <em>“Debo poner atención en clases”</em>. La respuesta geek expresada en PHP esta escrita a continuación. Donde PHP es un lenguaje dinámico, no necesita declarar variables y es un lenguaje orientado a objetos con raíces imperativas. Sus instrucciones son <em>paso a paso</em>, y no constituyen una única expresión reducible.</p>
<pre>&lt;?php

    /* codigo PHP */
    for ($i = 0; $i &lt; 500; $i++) {
        echo "Debo poner atencion en clases";
    }

 ?&gt;</pre>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/11/haskell-logo.png"><img class="alignleft size-full wp-image-526" title="haskell-logo" src="http://www.programando.org/blog/wp-content/uploads/2012/11/haskell-logo.png" alt="" width="128" height="128" /></a></p>
<p>&nbsp;</p>
<p>Si usamos Haskell como ejemplo, que es un lenguaje funcional con tipificación estática fuerte, requiere que las variables sean declaradas con un tipo — la mayoría de las veces — y es muy expresivo, donde el siguiente ejemplo dice repetir la cadena, tomar 500 elementos y con esa lista ejecutar la función monádica putStrLn, que esta hecha para el Monad IO e imprime la el mensaje las 500 veces solicitada.</p>
<pre></pre>
<pre></pre>
<pre>module Main (main) where

-- codigo Haskell

main :: IO ()
main = mapM_ putStrLn $ take 500 $ repeat "Debo poner atencion en clases"</pre>
<p>En Lisp sería similar, pero Lisp es de tipificación dinámica y no necesita declarar variables, dando lugar a un programa muy simple de una sola linea. Donde también tenemos lenguajes como Clojure, que es un dialecto de Lisp y soporta construcciones muy similares a las del ejemplo en Lisp, dando lugar a programas expresivos y simples, pero que corren sobre la máquina virtual de Java o JVM.</p>
<pre>;;; codigo Lisp

(loop repeat 500 do (format t "Debo poner atencion en clases~%"))</pre>
<p>Un ejemplo clásico para la conversión η en Haskell, es reducir las llamadas a funciones en su combinador de identidad. Por ejemplo se tiene la función <em>f(g(x))</em>, que en Cálculo Lambda se expresa como <em>λx.(λy.y)x</em>, se puede reducir a <em>g(x)</em>, que se expresa como <em>λy.y</em> en Cálculo Lambda. Esto expresado en Haskell, se vería como el siguiente ejemplo, donde <tt>absN</tt> y <tt>absN'</tt> son funciones <em>equivalentes</em> y <tt>absN'</tt> es la reducción η de <tt>absN</tt>.</p>
<pre>absN :: Num a =&gt; a -&gt; a
absN n = abs n

absN' :: Num a =&gt; a -&gt; a
absN' = abs</pre>
<p>Actualmente los lenguajes orientados a objetos más comunes están integrando características funcionales, como Java, que acaba de incluir <em>funciones anonimas</em>. Pero también están los lenguajes que a lo largo de su historia han sido multi-paradigma, como Python, e implementa características funcionales, procedurales y orientadas a objetos. El bien conocido algoritmo para verificar si un RUT es válido o no, se puede expresar funcionalmente en Python como esta escrito en el siguiente ejemplo.</p>
<pre>def val_rut(rut):
    """
    Valida un string con un RUT con el guion incluido, retornando
    cero si es valido.

    Ejemplo: print(val_rut("22222222-2"))
    """
    return cmp(rut[-1],
               str((range(10) + ['K'])[
                   (11 - sum(map(lambda x: (int(x[0]) * x[1]),
                                 zip(reversed(rut[:-2]),
                                     (2 * range(2, 8))))) % 11)]))</pre>
<p>Como se aprecia en el ejemplo, la validación se realiza utilizando <em>expresiones</em> o <em>llamadas a funciones</em>, sin uso de variables con estado y mutabilidad, donde cada llamada a una función se puede reducir a un valor determinado, y como resultado final se tiene un valor cero o distinto de cero que indica si el RUT es válido. Este mismo <em>algoritmo funcional</em>, se puede expresar en Haskell con llamadas muy similares, debido a que los nombres de las funciones y funciones de alto orden son bastante comunes entre los lenguajes funcionales.</p>
<pre>valRut :: String -&gt; Bool
valRut s = (((['0'..'9'] ++ ['K'])
             !! (11 - sum(zipWith (*)
                          (fmap digitToInt $ drop 2 $ reverse s)
                          (take 10 $ cycle [2..7])) `mod` 11)) == (last s))</pre>
<p>De estos dos ejemplos, se puede decir que son funciones <em>puras</em>, principalmente debido a que no tienen variables libres y son una única expresión sin estado y no mutable a lo largo de la ejecución. El problema de la <em>pureza</em> es conceptualmente algo que se idealiza en la programación funcional, siendo abordado de diferentes formas por diferentes lenguajes. El objetivo es mantener las funciones y rutinas puras. En Haskell, con su abstracción más clásica conocida con el nombre de Mónada, permite entregar <em>pureza</em> a expresiones que parecen no ser puras, y en términos muy sencillos el Mónada reúne una identidad y una composición de funciones del tipo <em>f(g(x))</em>, todo a través de un tipo de dato que permite componer funciones sin abandonar ese tipo de dato y darle un aspecto procedural.</p>
<p>Personalmente creo que es importante aprender algo de programación funcional porque de alguna forma cambia la perspectiva que uno tiene de los programas. Uno generalmente esta acostumbrado a pensar en los programas como si fuesen una lista ordenada de instrucciones a seguir, cuando generalmente esa misma lista ordenada de instrucciones a seguir puede ser expresada como una función y más aun, como una función pura.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/11/que-es-la-programacion-funcional/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reboot</title>
		<link>http://www.programando.org/blog/2012/11/reboot/</link>
		<comments>http://www.programando.org/blog/2012/11/reboot/#comments</comments>
		<pubDate>Mon, 12 Nov 2012 00:13:52 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Destacados]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=525</guid>
		<description><![CDATA[Hola, bienvenidos al reboot de La Sombra De Dijsktra, a partir de hoy este sitio tendrá un nuevo estilo. La idea es reformular este proyecto ...]]></description>
			<content:encoded><![CDATA[<p>Hola, bienvenidos al reboot de La Sombra De Dijsktra, a partir de hoy este sitio tendrá un nuevo estilo. La idea es reformular este proyecto invitando a participar a nuevos autores. Además tendremos otro tipo de material no tan técnico, pero necesario para desarrollar otras habilidades necesarias para todo profesional de la programación.</p>
<p>Durante un tiempo vamos a tener algunos baches, y puede que algunas cosas no estén funcionando tan bien como esperamos. Les pido paciencia.</p>
<p>Inicialmente se incorpora a este blog Daniel Molina Wegener , quien escribirá algunos artículos con mayor frecuencia en este sitio, y estará además a cargo de la sección Programación Funcional.</p>
<p>En esta nueva etapa este sitio funcionará más como una revista, con secciones permanentes las que aparecen destacadas en el front page.</p>
<p>Los invito a visitarnos, porque vamos a tener muchas novedades y una mayor cantidad de contenido útil para todos los apasionados de la programación en habla hispana.</p>
<p>Esperamos  que les guste esta nueva etapa.</p>
<p><a href="http://www.programando.org/blog/wp-content/uploads/2012/11/288950_8598.jpg"><img class="wp-image-527 aligncenter" title="288950_8598" src="http://www.programando.org/blog/wp-content/uploads/2012/11/288950_8598-1024x768.jpg" alt="" width="402" height="301" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/11/reboot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Codear</title>
		<link>http://www.programando.org/blog/2012/11/codear/</link>
		<comments>http://www.programando.org/blog/2012/11/codear/#comments</comments>
		<pubDate>Mon, 05 Nov 2012 00:12:06 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Aprendiendo a programar]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codificar]]></category>
		<category><![CDATA[programar]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=474</guid>
		<description><![CDATA[Tomado de la Real Academia de la Lengua:
codear.
1. intr. Mover los codos.
2. intr. Dar golpes con los codos frecuentemente.
3. intr. Am. Mer. Pedir con insistencia.
4. prnl. Dicho de una persona: Tener trato habitual, de ...]]></description>
			<content:encoded><![CDATA[<p>Tomado de la Real Academia de la Lengua:</p>
<blockquote><p><strong>codear</strong><strong>.</strong></p>
<p><strong>1.</strong> intr. Mover los codos.</p>
<p><strong>2.</strong> intr. Dar golpes con los codos frecuentemente.</p>
<p><strong>3.</strong> intr.<em> Am. Mer.</em> Pedir con insistencia.</p>
<p><strong>4.</strong> prnl. Dicho de una persona: Tener trato habitual, de igual a igual, con otra o con cierto grupo social.</p></blockquote>
<p>&nbsp;</p>
<p>Usted programa, los necios codean frente a sus computadores, se van a cansar y no lograrán alzar vuelo nunca.</p>
<p>Codear sería en inglés algo así como <strong>jostle</strong>, <strong>hustle</strong> o p<strong>rod. </strong>Code es es código, y Coding sería codificar, o escribir código, también se podría decir desarrollar, pero eso es más amplio, o los profesionales simplemente preferimos traducirlo como programar.</p>
<p>Porque codificar denota transcribir código, en cambio programar implica más, mucho más.</p>
<p>Pronto la solución al último desafío (cuyo premio queda desierto) y la reformulación de este blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/11/codear/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wat</title>
		<link>http://www.programando.org/blog/2012/10/wat/</link>
		<comments>http://www.programando.org/blog/2012/10/wat/#comments</comments>
		<pubDate>Mon, 22 Oct 2012 00:49:35 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=465</guid>
		<description><![CDATA[Disfrútenlo:
wat

      
        
      
    
/Via ...]]></description>
			<content:encoded><![CDATA[<p>Disfrútenlo:<br />
<a href="https://www.destroyallsoftware.com/talks/wat">wat</a></p>
<p class="video">
      <video class="sublime sv_force_flash" width="640" height="480" controls="controls"><br />
        <source src="https://s3.amazonaws.com/destroyallsoftware-talks/wat.mov?AWSAccessKeyId=AKIAIKRVCECXBC4ZGHIQ&amp;Expires=1350868571&amp;Signature=vzuWZ%2B0mb6Ct9sO2lCI7uAqv%2FH0%3D" /><br />
      </video>
    </p>
<p>/Via <a href="https://www.destroyallsoftware.com/talks">Destroy All Software</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/10/wat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desafío Octubre: Código Spaghetti</title>
		<link>http://www.programando.org/blog/2012/10/desafio-octubre-codigo-spaghetti/</link>
		<comments>http://www.programando.org/blog/2012/10/desafio-octubre-codigo-spaghetti/#comments</comments>
		<pubDate>Tue, 09 Oct 2012 23:56:44 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Sin categoría]]></category>
		<category><![CDATA[Fortran IV]]></category>
		<category><![CDATA[interpretes]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=457</guid>
		<description><![CDATA[Después de una larga pausa volvemos con los desafíos, esta vez vamos a jugar con Fortran IV  .
Hay lenguages antiguos, como Fortran IV que ...]]></description>
			<content:encoded><![CDATA[<p>Después de una larga pausa volvemos con los desafíos, esta vez vamos a jugar con Fortran IV <img src='http://www.programando.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Hay lenguages antiguos, como Fortran IV que usan sentencias goto condicionales e incondicionales, en vez de estructuras como if y while. </p>
<p>Además en Fortran IV cada sentencia ocupa una linea de código. Las primeras 5 posiciones están reservadas para colocar una etiqueta numérica, que corresponde a un número entero. La posición 6 está reservada para una marca de continuación, pero no la vamos a considerar en este ejercicio, la dejaremos en blanco. Por lo tanto las sentencias propiamente tal empiezan a partir de las posiciones 7 en adelante. </p>
<p>Una sentencia goto se ve así:<br />
<tt><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto etiqueta<br />
</tt><br />
y una sentencia condicional se escribe así:<br />
<tt><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (expresion)goto etiqueta<br />
</tt></p>
<p>Donde &#8220;etiqueta&#8221; es un número.</p>
<p>Hay otras sentencias, pero sólo los goto condicionales empiezan con &#8220;if(&#8221; y finalizan con &#8220;)goto etiqueta&#8221;. En Fortran IV los espacios se ignoran. Consideraremos que la sentencia &#8220;stop&#8221; sólo aparece al final de un programa, y detiene la ejecución del programa.</p>
<p>Si les interesan conocer las posibles operaciones de un programa Fortran IV consideren las descritas en <a href="http://www.math-cs.gordon.edu/courses/cps323/FORTRAN/fortran.html">este enlace</a>.</p>
<p><strong>Desafío</strong><br />
El desafío es determinar si dos programas Fortran IV son equivalentes. Diremos que dos programas son equivalentes si, para todas las entradas posibles, ejecutan exactamente la misma secuencia de sentencias, ignorando los gotos incondicionales y las etiquetas. Diremos que dos secuencias de sentencias son las mismas si son textualmente identicas después de eliminar espacios y etiquetas.<br />
Asuman que cada goto condicional se tomará en algunos casos y no en otros. Los gotos incondicionales se ejecutan siempre. </p>
<p>Los siguientes programas de ejemplo son equivalentes:</p>
<p><b>Programa 1:</b><br />
<script src="https://gist.github.com/3862218.js?file=gistfile1.f90"></script></p>
<p><b>Programa 2:</b><br />
<script src="https://gist.github.com/3862222.js?file=gistfile1.f90"></script></p>
<p>Se debe crear un programa que reciba como entradas dos programas Fortran IV y escriba en pantalla: &#8220;los programas son equivalentes&#8221; o &#8220;los programas no son equivalentes&#8221;.</p>
<p>El plazo para este desafío es el 30 de octubre, los programas deben ser capaces de procesar programas de hasta 1.000 lineas.</p>
<p>Ganará el programa  más rápido y más sencillo (menor cantidad de lineas de código) que resuelva este desafío. Si hay suficientes participantes (más de 6) habrá premio <img src='http://www.programando.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&#8220;May the odds be ever in your favor&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/10/desafio-octubre-codigo-spaghetti/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Cierre del Desafío Julio Agosto</title>
		<link>http://www.programando.org/blog/2012/09/cierre-del-desafio-julio-agosto/</link>
		<comments>http://www.programando.org/blog/2012/09/cierre-del-desafio-julio-agosto/#comments</comments>
		<pubDate>Sun, 16 Sep 2012 16:21:52 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Destacados]]></category>
		<category><![CDATA[desafío]]></category>
		<category><![CDATA[ganador]]></category>
		<category><![CDATA[L-System]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=453</guid>
		<description><![CDATA[Ayer se cerró el desafío Julio Agosto, con sólo dos participantes, el ganador del anterior desafío Daniel Molina (damowe), y Hector Rodriguez(hrodrigu), quien me envió ...]]></description>
			<content:encoded><![CDATA[<p>Ayer se cerró <a href="http://www.programando.org/blog/2012/07/desafio-julio-agosto-2012-l-systems/">el desafío Julio Agosto</a>, con sólo dos participantes, el ganador del anterior desafío Daniel Molina (damowe), y Hector Rodriguez(hrodrigu), quien me envió su solución por correo electrónico y que <a href="https://github.com/lnds/programando.org/tree/master/l-systems/hrodrigu">he publicado en GitHub</a>.</p>
<p>Son dos soluciones muy buenas, la de Daniel como siempre en Haskell con un código bastante elegante, la pueden ver en <a href="https://github.com/dmw/dmw-programando-org/tree/master/lsystem">su repositorio GitHub</a>. Sin embargo, hasta ahora no contiene la solución a la flor.</p>
<p>La versión de Hector es sorprendente, al menos para mi, porque no esperaba una solución en JavaScript! Lo otro que me gusta es la elegancia y concisión del código, 70 lineas de javascript. Excelente! <img src='http://www.programando.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hector además entrega la solución al L-System de la flor:</p>
<p><script src="https://gist.github.com/3733032.js?file=flor.lsys"></script></p>
<p>Así que el ganador de esta oportunidad de Hector Rodriguez, felicitaciones! Gracias también a Daniel por participar. </p>
<p>Me pondré en contacto con Hector para hacerle entrega de su GiftCard.</p>
<p>Al parecer este desafío estuvo bastante difícil, espero que en el próximo tengamos más participantes. Les pido a todos ustedes que me ayuden a promover esta actividad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/09/cierre-del-desafio-julio-agosto/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Entre Algoritmos y Patrones</title>
		<link>http://www.programando.org/blog/2012/08/entre-algoritmos-y-patrones/</link>
		<comments>http://www.programando.org/blog/2012/08/entre-algoritmos-y-patrones/#comments</comments>
		<pubDate>Sat, 25 Aug 2012 14:06:02 +0000</pubDate>
		<dc:creator>ediaz</dc:creator>
				<category><![CDATA[Desarrollo Humano]]></category>
		<category><![CDATA[aprender]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[innovación]]></category>

		<guid isPermaLink="false">http://www.programando.org/blog/?p=443</guid>
		<description><![CDATA[La mayor parte de los programadores corporativos del mundo tienen un rutinario trabajo que se puede super simplificar en uno de estos dos modelos:

Transaccional: crear ...]]></description>
			<content:encoded><![CDATA[<p>La mayor parte de los programadores corporativos del mundo tienen un rutinario trabajo que se puede super simplificar en uno de estos dos modelos:</p>
<ul>
<li>Transaccional: crear un formulario y copiar los datos ingresados a través de este a una base de datos.</li>
<li>Batch: leer o escribir archivos desde o hacia una base de datos.</li>
</ul>
<p>Niklaus Wirth expresó una famosa ecuación como título a uno de sus <a href="http://amzn.to/OcAn8s">libros</a>:</p>
<p style="text-align: center;"> Algoritmos + Estructuras de Datos = Programas</p>
<p style="text-align: left;">Eso puede haber sido cierto en 1976, pero ¿sigue siéndolo aún en el siglo XXI?</p>
<p style="text-align: left;">Hemos evolucionado mucho en un desarrollo espiral, para un observador poco atento pareciera que la computación se moviera como un péndulo, van de un paradigma al opuesto y vuelven, pero yo no creo que sea así, con cada ciclo aprendemos algo y lo incorporamos.</p>
<p style="text-align: left;">Sin embargo hay que reconocer que hay mucho de re inventar la rueda, muy poco de investigación profunda, la urgencia por resolver el problema lleva a muchos a rehacer una solución que ya existía, y con peor desempeño muchas veces.</p>
<p style="text-align: left;">En su discurso de recepción del premio Turing de 1968 Richard Hamming dijo lo siguiente:</p>
<blockquote>
<p style="text-align: left;"><em>Whereas Newton could say, &#8220;If I have seen a little farther than others, it is because I have stood on the shoulders of giants,&#8221; I am forced to say, &#8220;Today we stand on each other&#8217;s feet.&#8221; Perhaps the central problem we face in all of computer science is how we are to get to the situation where we build on top of the work of others rather than redoing so much of it in a trivially different way.</em></p>
<p style="text-align: left;">Mientras que Newton podía decir, &#8220;Si he visto más lejos que otros, es porque me paré sobre hombros de gigantes¨, yo estoy forzado a decir, &#8220;Hoy en día nos paramos sobre los pies de los otros&#8221;. Quizás el problema principal que enfrentamos en toda la ciencia de la computación es cómo llegaremos a la situación donde construyamos sobre el trabajo de otros más que rehaciendo tanto de aquello de una forma trivialmente diferente.</p>
</blockquote>
<p style="text-align: left;">Así que ahí está el desafío de todo gran programador, construir a partir de lo que ya existe, no reinventar la rueda para que le salga cuadrada <img src='http://www.programando.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p style="text-align: left;">Nos movemos entre algoritmos y patrones de diseño, estamos llamados a innovar a partir de las herramientas básicas de nuestra profesión y a partir del trabajo previo de quienes nos precedieron. Domina los algoritmos, estudia los patrones, conoce tus frameworks, sus fortalezas, sus limitaciones, juega en el área chica, donde se aplican esos conocimientos para crear una solución a un problema, o una gran innovación. Pero preocúpate de aprender de los que estuvieron antes que tú en este mundo, no seas tan soberbio, la rueda te puede salir cuadrada.</p>
<p style="text-align: left;">Off Topic: queda una semana para el cierre del <a href="http://www.programando.org/blog/2012/07/desafio-julio-agosto-2012-l-systems/">desafío Julio Agosto</a>, espero sus respuestas&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.programando.org/blog/2012/08/entre-algoritmos-y-patrones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
