<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-825083662910521106</id><updated>2011-04-21T13:45:22.500-07:00</updated><category term='ruby'/><category term='videos nerds'/><category term='reflexiones'/><category term='agile'/><category term='javascript'/><category term='ror'/><category term='videos non-nerds'/><category term='programacion'/><category term='ides'/><category term='tdd'/><category term='introducción'/><category term='curiosidades'/><category term='nerd'/><category term='networking'/><category term='libros non-nerds'/><title type='text'>Pisadas</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-1743323741321707123</id><published>2009-03-02T12:59:00.000-08:00</published><updated>2009-03-02T13:12:40.454-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Justificación Cognitiva del TDD?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oHqmo47ywk0/SaxLo0NT9OI/AAAAAAAAAdU/FFlUPggwAks/s1600-h/tdd.jpeg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 284px; height: 176px;" src="http://1.bp.blogspot.com/_oHqmo47ywk0/SaxLo0NT9OI/AAAAAAAAAdU/FFlUPggwAks/s200/tdd.jpeg" alt="" id="BLOGGER_PHOTO_ID_5308701225344300258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Actualmente, me encuentro trabajando en un aplicación legacy desarrollada en C++ con una interfaz en Java. La parte de C++ no está muy felizmente desarrollada por lo que percibo un ambiente muy propicio para la aplicación de Test-Driven Design/Development, por lo que decidí &lt;i&gt;agiornarme&lt;/i&gt; en estas aguas con un poco más de investigación.&lt;br /&gt;&lt;br /&gt;En mi recorrido, me encontré con un &lt;a title="artículo" href="http://www.m3p.co.uk/blog/2008/06/15/test-driven-development-a-cognitive-justification/" id="pnp9"&gt;artículo&lt;/a&gt; no muy reciente que intenta "justificar cognitivamente" el TDD, a lo cual quiero aportar, humildemente, mi opinión.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a title="justificación" href="http://es.wikipedia.org/wiki/Justificaci%C3%B3n_%28religi%C3%B3n%29" id="w:iz"&gt;justificación&lt;/a&gt; &lt;/b&gt;: Expresar las razones por las cuales se va a realizar el trabajo, y los beneficios que se espera obtener del mismo. Término judicial que significa absolver, declarar justo, o proporcionar sentencia favorable.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a title="cognitivo" href="http://www.definicion.org/cognitivo" id="uush"&gt;cognitivo&lt;/a&gt; &lt;/b&gt;: término utilizado por la psicología moderna, concediendo mayor&lt;br /&gt;importancia a los aspectos intelectuales que a los afectivos y&lt;br /&gt;emocionales, en este sentido se tiene un doble significado:                primero, se&lt;br /&gt;refiere a una representación conceptual de los objetos. La segunda, es&lt;br /&gt;la comprensión o explicación de los objetos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En pocas palabras, Steve Freeman, uno de los impulsores de &lt;a title="MockObjects" href="http://www.planningcards.com/Thoughts/smock.html" id="wq4l"&gt;MockObjects&lt;/a&gt; y &lt;a title="Need-Driven Development" href="http://www.planningcards.com/Thoughts/Papers/pra25-MockRoles.pdf" id="kowo"&gt;Need-Driven Development&lt;/a&gt;, intenta atrapar el desafío intelectual del practicante de TDD al momento de racionalizar la práctica, basándose en la ruptura de los preconceptos y ensayos mentales iniciales. El propio Michael Feathers comenta el post asimilando una pequeña "vuelta de tuerca" sobre TDD.&lt;br /&gt;&lt;br /&gt;Kent Beck y Dave Astels dan un impulso al TDD en el 2003, y Astels un año antes con &lt;a title="Extremme Programming" href="http://en.wikipedia.org/wiki/Extreme_programming" id="us.j"&gt;Extremme Programming&lt;/a&gt; con base en &lt;a title="the Agile Manifesto" href="http://www.agilemanifesto.org/" id="ja2h"&gt;the Agile Manifesto&lt;/a&gt; (2001) como corriente de pensamiento (Beck es singatario del manifiesto ágil).&lt;br /&gt;&lt;br /&gt;Si bien los signatarios del mencionado manifiesto proponen ideas muy importantes que están revolucionando la Ingeniería del Software, tengo la percepción de que se están omitiendo algo que &lt;a title="Bertrand Meye" href="http://en.wikipedia.org/wiki/Bertrand_Meyer" id="zd.7"&gt;Bertrand Meyer&lt;/a&gt; sí tuvo en cuenta al teorizar &lt;a title="Design by Contract" href="http://www.eiffel.com/developers/design_by_contract.html" id="si75"&gt;Design by Contract&lt;/a&gt;, basándose en postulados teórico-matemáticos anteriores a esta nueva ola de técnicas de diseño de software.&lt;br /&gt;&lt;br /&gt;Una de las claves diferenciadoras de TDD es que los tests se preparan antes de desarrollar la mejora o el código nuevo, al contrario de como se venía haciendo en la práctica. Este concepto clave se entiende en las corrientes de TDD como una mejora muy racional a la práctica de diseño y testeo de software en relación de "como se viene haciendo", pero mi sensación es que esto no es tan revolucionario o nuevo como se lo encuentra en la web.&lt;br /&gt;&lt;br /&gt;Me refiero a los conceptos de &lt;a title="especificación formal" href="http://en.wikipedia.org/wiki/Formal_specification" id="osmw"&gt;especificación formal&lt;/a&gt;, &lt;a title="verificación formal" href="http://en.wikipedia.org/wiki/Formal_verification" id="s0n2"&gt;verificación formal&lt;/a&gt; , &lt;a title="derivación de programa" href="http://en.wikipedia.org/wiki/Program_derivation" id="u1x4"&gt;derivación de programa&lt;/a&gt; y la &lt;a title="lógica de Hoare" href="http://en.wikipedia.org/wiki/Hoare_logic" id="kdky"&gt;lógica de Hoare&lt;/a&gt;. Salvando las distancias, podemos analogar la especificación de un requerimiento con una especificacion formal. De la misma manera, es posible relacionar a la verificación formal con la forma de testear software a la "manera usual". ¿Se ve dónde me dirijo? La derivación de programa se puede analogar con el concepto clave de TDD, y la logica de Hoare como base del testeo unitario y DbC. Ya &lt;a title="Dijkstra" href="http://en.wikipedia.org/wiki/Edsger_W._Dijkstra" id="p4eu"&gt;Dijkstra&lt;/a&gt; criticaba la verificación formal y propugnaba la eliminación de la sentencia &lt;i&gt;&lt;a title="go to" href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/EWD215.html" id="n5mr"&gt;go to&lt;/a&gt; &lt;/i&gt; en 1968.&lt;br /&gt;&lt;br /&gt;Desde este punto de vista, sería mas viable alguna justificación, inclusive cognitiva, colocando las distancias y medidas en su lugar sin tener q pasar por las subjetividades en que los autores podrían incurrir para defender sus valores por sobre otros, pasando por alto conclusiones previas que pueden dar basamento sólido a la teorización técnicas.&lt;br /&gt;&lt;br /&gt;Al fin y al cabo, se trata de eso: una batalla no violenta por la imposición de valores, que no es más que lo que una de las definiciones de la palabra &lt;i&gt;política.&lt;/i&gt; Podemos hacer política en cualquier campo, incluyendo en la ingeniería del software, por mal que suene, y es un alivio que así sea.&lt;br /&gt;&lt;br /&gt;Considero al TDD una herramienta valiosísima en el desarrollo de software, indispensable en el arsenal de cualquier programador que desee al nivel profesional. Todavía me queda mucho por leer, probar y pensar, pero no quiero perder el sentido teórico-crítico a medida que avanzo entre el pragmatismo influenciante de las nuevas corrientes.&lt;br /&gt;&lt;br /&gt;Concluyendo, me quedo con la gran frase anónima "para novedad... los clásico".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-1743323741321707123?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/1743323741321707123/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=1743323741321707123' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1743323741321707123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1743323741321707123'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2009/03/justificacion-cognitiva-del-tdd.html' title='Justificación Cognitiva del TDD?'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oHqmo47ywk0/SaxLo0NT9OI/AAAAAAAAAdU/FFlUPggwAks/s72-c/tdd.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-1452097669866244135</id><published>2008-11-05T05:06:00.001-08:00</published><updated>2008-11-05T05:41:38.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='curiosidades'/><title type='text'>Mate querido</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://biblioteca.idict.villaclara.cu/UserFiles/Image/ARGENTINA/miscelaneas/mate.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 253px; height: 381px;" src="http://biblioteca.idict.villaclara.cu/UserFiles/Image/ARGENTINA/miscelaneas/mate.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;No sé si lo sabían, pero existe una guerra silenciosa entre el mate y el café. Desde siempre se ha dicho que la infusión conocida como &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;mate &lt;/span&gt;&lt;/span&gt;tiene un alcaloide llamado &lt;span style="font-weight: bold; font-style: italic;"&gt;mateína &lt;/span&gt;en mayor medida que cafeína. Esto se discute bastante, quizá hasta el fanatismo.&lt;br /&gt;&lt;br /&gt;Me encontré con un &lt;a href="http://www.erowid.org/plants/yerba_mate/yerba_mate_chemistry1.shtml"&gt;artículo&lt;/a&gt; que intenta explicar que la mateína es un "alias" de la cafeína, por no decir q no existe.&lt;br /&gt;&lt;br /&gt;La palabra clave acá es &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;estereoisómero.&lt;/span&gt;&lt;/span&gt;  Se dice que la mateína es un &lt;a href="http://es.wikipedia.org/wiki/Estereois%C3%B3mero"&gt;estereoisómero&lt;/a&gt; de la cafeína, esto es, una molecula de iguales componentes, pero distintas conexiones entre sí. Algo como un 4-4-2 y un 5-3-2 en fulbo; tienen los mismos jugadores pero formación diferente.&lt;br /&gt;&lt;br /&gt;El artículo en cuestión intenta decir que la cafeína carece de estereoisómeros, por lo tanto la mateína o no existe o es otro nombre de la misma.&lt;br /&gt;&lt;br /&gt;Para que un químico tenga estereoisómeros debe tener un estereocentro, un centro alrededor del cual rotan las moléculas para formar los isómeros, y la cafeína no lo posee.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.erowid.org/chemicals/caffeine/images/caffeine_2d_sm.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 250px; height: 209px;" src="http://www.erowid.org/chemicals/caffeine/images/caffeine_2d_sm.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Sin embargo, hay muchas afirmaciones que contradicen este estamento, y provienen de latitudes latinas. La mayoría se basa en la prueba de que personas con hipersensibilidad a la cafeína toman mate sin efectos aversos atribuídos a ella.&lt;br /&gt;&lt;br /&gt;Al final de cuentas, no se sabe por que estricticismo guiarse. Y uno que pensaba que la química era exacta y seria...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-1452097669866244135?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/1452097669866244135/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=1452097669866244135' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1452097669866244135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1452097669866244135'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/11/mate-querido.html' title='Mate querido'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-9220721645661666196</id><published>2008-10-24T06:15:00.000-07:00</published><updated>2008-10-24T06:26:19.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ror'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='ides'/><title type='text'>IDE para Ruby On Rails</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oHqmo47ywk0/SQHMpTLIK8I/AAAAAAAAAcA/JUWdvhxBsaQ/s1600-h/jedit.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 264px;" src="http://1.bp.blogspot.com/_oHqmo47ywk0/SQHMpTLIK8I/AAAAAAAAAcA/JUWdvhxBsaQ/s320/jedit.JPG" alt="" id="BLOGGER_PHOTO_ID_5260710849639099330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando comencé con RoR, hice los mismo que todos: google -&gt; aptana + radrails + InstantRails. InstantRails fue y es un golazo... útil, rápido, integrado y liviano. Estaba acostumbrado a hacer todo a partir de un eclipse, así que aptana no fue más que una descarga, extracción e instalación de plugins para que todo funcione por primera vez.&lt;br /&gt;Mi problema fue que aptana demoró mucho en hincharme las pelotas. Así que decidí hacer una investigación del ide más popular para el desarrollo en RoR.&lt;br /&gt;Los que conozco q usan aptana, lo usan con desazón o ya se han cambiado de editor. Como uso microchot winXP en la maquina, tenia 3 opciones: RadRails, Scite o JEdit.&lt;br /&gt;&lt;br /&gt;Me tiré del lado de JEdit desde que ví la comunidad de gente que ya estuvo en el tema intentando adaptar este editor al desarrollo RoR. Está hecho en java, por lo que se siente pesado aunque menos que un eclipse.&lt;br /&gt;&lt;br /&gt;Pasos:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;1- descargar jedit&lt;br /&gt;2- instalar y configurar los siguientes plugins:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.phipster.com/2007/02/03/jedit-for-ruby-on-rails/"&gt;jedit for ruby on rails&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://wshaddix.wordpress.com/2007/12/17/updating-jedit-syntax-highlighting-for-rails-201/"&gt;highlight para ruby&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; instalar SuperAbbrevs y colocar un archivo con abreviaciones en .junit/superabbrevs. Luego colocar el shortcut q no se pise con el show completion popup del sidekick (yo lo tengo en crtl + enter).&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;     &lt;br /&gt;Hasta acá tenes el entorno, pero para cambiar un poco, se puede instalar el plugin de Editor Scheme Selector, q dispone de varios skins para poner al editor.. queda cheto.&lt;br /&gt;&lt;br /&gt;Otra cosa q es útil, es un manejador de tabs, como BufferTabs y un buscador de archivos en el proyecto actual, yo uso el FastOpen porq nunca pude bajar el EBrowse para probar; algún día andará.&lt;br /&gt;&lt;br /&gt;Por ahora anda muy bien, integrado con InstantRails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-9220721645661666196?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/9220721645661666196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=9220721645661666196' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/9220721645661666196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/9220721645661666196'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/10/ide-para-ruby-on-rails.html' title='IDE para Ruby On Rails'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oHqmo47ywk0/SQHMpTLIK8I/AAAAAAAAAcA/JUWdvhxBsaQ/s72-c/jedit.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-2408260097956504484</id><published>2008-10-21T14:46:00.000-07:00</published><updated>2008-10-21T15:05:03.016-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='nerd'/><title type='text'>Closures</title><content type='html'>Estos días sentí la necesidad de definir lo que es una "closure". Si bien conozco su uso, no conocía la definición ni las implicaciones de esta técnica.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://martinfowler.com/bliki/Closure.html"&gt;Martin Fowler&lt;/a&gt; dice que una closure es "essentially a block of code that can be passed as an argument to a function call." (no sé q tiene Don Fowler q vuelve a escribir "essentially" cada 2 parrafos).&lt;br /&gt;Como el lo puso:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;File.open(filename) {|f| doSomethingWithFile(f)}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Buenísimo. Realmente estamos enviando un bloque de código como parámetro a una función. Esto ya lo había visto en JavaScript, cuando mandábamos como argumento un bloque de código junto con una llamada ajax para que se ejecutara como callback.&lt;br /&gt;&lt;br /&gt;A entender de Fowler, hay 2 grandes diferencias entre las closures y técnicas similares.&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;    una closure es "a block of code plus the bindings to the environment they came from." y, &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;    "languages that support closures allow you to define them with very little syntax.", lo que no es poca cosa. Y eso me hace recuerdo a &lt;a href="http://redhanded.hobix.com/bits/mudIn15LinesOfRuby.html"&gt;algo...&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Pero.. ¿que significa que "the bindings to the enviroment they came from"?&lt;br /&gt;Neal Gaftner tiene un &lt;a href="http://gafter.blogspot.com/2007/01/definition-of-closures.html"&gt;artículo &lt;/a&gt;en su blog sobre la historia de las closures. Me encanta la historia, asi que lo ataqué.&lt;br /&gt;&lt;br /&gt;Resumiendo: todo empezó con Lisp, sus function-valued expressions (lambda), y su scope dinámico (cuando la ejecución encuentra una variable, recorre el stack en busca de una definición para la misma). Uno de sus dialectos, Scheme, era lexically scoped (una variable se enlaza con la definicion lexicográfica del bloque que la contiene) y supuso un antes y un después en la programación. Las variables enviadas como argumentos al bloque se llamaron free variables; entonces:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"A closure is a function that captures the bindings of free variables in its lexical context."&lt;/blockquote&gt;  &lt;br /&gt;El "pero" vino con Smalltalk. Se podía encontrar más que free variables dentro de una closure, como "return" o "self". Así que la definición de closure se tuvo que generalizar, y ahí se ofuscó:&lt;br /&gt;&lt;blockquote&gt;"&lt;span style="font-style: italic;"&gt;A closure is a function that captures lexically scoped semantic language constructs."&lt;/span&gt;&lt;/blockquote&gt;En realidad, sabiendo a que se refiere, la definición se amplía, pero tambien se vuelve más estricta. Veamos: ¿que es una expresión lambda? El &lt;a href="http://es.wikipedia.org/wiki/C%C3%A1lculo_lambda"&gt;concepto&lt;/a&gt;  sería:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"Se puede considerar al cálculo lambda como el más pequeño lenguaje universal de programación. Consiste en una regla de transformación simple (sustitución de variables) y un esquema simple para definir funciones."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En un sentido general, una closure es un bloque que captura una expresión lambda junto con construcciones semánticas lexicográficamente vinculadas de un lenguaje específico. Se va complicando, ¿no?&lt;br /&gt;&lt;br /&gt;Pero tambien entra en juego el lenguaje: en Java y C no se pueden mandar o retornar funciones como objetos, es decir, las funciones no son first-class citizens (objects/functions).&lt;br /&gt;&lt;br /&gt;Bueno, entonces una closure es más que una construcción de un bloque independiente y anónimo que lexicográficamente vincula valores a variables, sino que además esos bloques deben poder ser tratados como objetos.&lt;br /&gt;&lt;br /&gt;Una closure "encierra" su scope en su definición, es cerrada, realiza una "closure" de su entorno de definición. Pero cuando su scope no cuenta con nada para encerrar, ¿sigue siendo una closure o es simplemente una funcion lambda?&lt;br /&gt;&lt;br /&gt;def suma(x)&lt;br /&gt;   return {x = x + 1}&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def suma()&lt;br /&gt;   x = 1&lt;br /&gt;   return {x = x + 1}&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def suma(y)&lt;br /&gt;   x = 1&lt;br /&gt;   return {x = x + y}&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;¿Cual de estos bloques devuelve una closure? Por lo menos sabemos que son expresiones lambda, y una es abierta.&lt;br /&gt;&lt;br /&gt;Este bloque de Groovy:&lt;br /&gt;&lt;br /&gt;class C {&lt;br /&gt;   private int i = 10;&lt;br /&gt;&lt;br /&gt;   void f() {&lt;br /&gt;       def c = {println i}&lt;br /&gt;       ......&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;¿Es {prntln i} una closure o una expresión lambda? Estrictamente, es una expresión lambda. Pero no se convierte en closure sino hasta que es evaluada en run-time, pues es en ese momento que realiza el binding. Creo que acá está la cuestión:&lt;br /&gt; &lt;br /&gt;   "A door may be open or closed. An open door may be closed by pushing; this achieves closure. A closed door cannot be closed any further; pushing on a closed door has no effect (and thus is not a closure). In both cases, the door remains a door at all times; it does not become a closure. A closure is the combination of a door and pushing."&lt;br /&gt;&lt;br /&gt;Entonces:&lt;br /&gt; &lt;br /&gt;   Si una expresión lambda cerrada (condición necesaria) que es tratada como una first-class object (condición necesaria) es evaluada en run-time (condición necesaria), ésta produce una closure propiamente dicha.&lt;br /&gt;&lt;br /&gt;Estrictamente hablando, esa sería la definición de una closure. Seguro que se van a encontrar mas restricciones. Algunos pueden decir que una lambda es una closure por mas que el número de variables que encierre se aproxime a cero.&lt;br /&gt;&lt;br /&gt;Por lo menos pude llegar a algo más concreto que cuando empecé la investigación.&lt;br /&gt;&lt;br /&gt;Aún así, existen muchas interpretaciones sobre lo que es una closure y lo que no, y viene del convencimiento de cada programador de lo que una closure es según el lenguaje en el que las realiza.&lt;br /&gt;&lt;br /&gt;En &lt;a href="http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby"&gt;ruby&lt;/a&gt; se puede hacer varios tipos de expresiones que devuelvan closures, como dice Martin Fowler, pero no siempre son estrictamente eso (tampoco en otros lenguajes), sino una "forma" de llamar a esta muy útil técnica de programación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-2408260097956504484?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/2408260097956504484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=2408260097956504484' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/2408260097956504484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/2408260097956504484'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/10/closures.html' title='Closures'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-1561373031142729552</id><published>2008-10-20T07:17:00.000-07:00</published><updated>2008-11-03T04:36:12.264-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos non-nerds'/><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>Zeitgeist</title><content type='html'>Me encantan los documentales; tanto o más que las películas. Como no tengo cable, me las tengo q ingeniar para encontrar alguno por la web. Si bien Discovery/History Channel son mis favoritos, descubrí que hay toda una corriente (por no decir industria) de documentales de producción "independiente". Los sitios &lt;a href="http://www.blogger.com/freedocumentaries.org"&gt;freedocumentaries.org&lt;/a&gt; y &lt;a href="http://www.blogger.com/freedocumentaries.org"&gt;freedocumentaries.net&lt;/a&gt; son muy recomendables para esto.&lt;br /&gt;Lo valioso del material de estos sitios es el concepto de contra-información.&lt;br /&gt;&lt;br /&gt;Pero a donde quería llegar es a que encontré la segunda parte de Zeitgeist, el documental (en mi opinión) que más puede hacer pensar a una persona sobre la realidad.&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=8883910961351786332"&gt;Zeitgeist&lt;/a&gt; es un documental q consta de 3 partes. Ninguna tiene desperdicio.&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotsub.com/view/4cff20d5-f55b-4009-bb74-d04f8e907671"&gt;Zeitgeist Addendum&lt;/a&gt; es la segunda parte de este documental. Se estrenó a ppios de este mes en coincidencia con el "desastre" (*) financiero en yankilandia (para el mundo).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Para muchos (como a mí), los tópicos de estos documentales pueden no ser nuevos. Con una cultura general mediana y un poco de curiosidad es posible haber pasado por estos temas anteriormente, pero de manera aislada. Juntarlo todo, y hacerlo parecer una gran y mundial conspiración, es muy "Dan Brown". La realidad viene dada con muchas falacias e ilusiones que no muestran lo importante e indispensable para romper con nuestra "mental slavery": &lt;span style="font-weight: bold;"&gt;la verdad&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Y el problema es que &lt;span style="font-style: italic;"&gt;la verdad&lt;/span&gt; no es un secreto. La historia no es una ciencia exacta, sino un &lt;span style="font-weight: bold;"&gt;ejercicio de interpretación&lt;/span&gt;. Y la realidad también lo es.&lt;br /&gt;&lt;br /&gt;Lastimosamente, la educación que tenemos, el sistema en q vivimos, nuestra "realidad", está alimentada y virtualizada por nosotros mismos. Hay quienes dicen q en la ignorancia no hay culpa, pero no estoy de acuerdo. La ignorancia es también desinformación.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://es.wikipedia.org/wiki/Mito_de_la_caverna"&gt;Platón&lt;/a&gt; ya se preocupaba por eso en su tiempo, y hubo muchos más que interpretaron la realidad. Algunos pocos, atinaron a advertirnos como pudieron. Una de esas "advertencias", mi preferida, es de &lt;a href="http://www.elhistoriador.com.ar/articulos/independencia/25_de_mayo_un_camino_hacia_la_independencia.php"&gt;Mariano Moreno&lt;/a&gt;, quien ya en 1810, en el &lt;a href="http://es.wikisource.org/wiki/Pr%C3%B3logo_a_la_traducci%C3%B3n_de_El_contrato_social"&gt;prólogo&lt;/a&gt; para su traducción del "Contrato Social" de Rosseau, nos advertía:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;(...) &lt;span style="font-weight: bold;"&gt;si los pueblos no se ilustran, si no se vulgarizan sus derechos&lt;/span&gt;, si cada hombre no conoce lo que vale, lo que puede y lo que se le debe, nuevas ilusiones sucederán a las antiguas, y después de vacilar algún tiempo entre mil incertidumbres, será tal vez nuestra suerte mudar de tiranos, sin destruir la tiranía&lt;/span&gt;.&lt;/blockquote&gt;Entonces, ilustrémonos sin prisa y sin pausa.&lt;br /&gt;&lt;br /&gt;Vuelvo a citar al groso de Goethe:&lt;i&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;"None are more hopelessly enslaved than those who falsely believe they are free.&lt;/blockquote&gt;&lt;/i&gt;&lt;br /&gt;(*) desastre: es el miedo q tenian los antiguos a q los astros (fuente de toda su cultura) se desplomaran sobre sus cabezas&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-1561373031142729552?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/1561373031142729552/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=1561373031142729552' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1561373031142729552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1561373031142729552'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/10/zeitgeist.html' title='Zeitgeist'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-1561340168365813690</id><published>2008-10-16T12:44:00.000-07:00</published><updated>2008-10-16T14:29:46.095-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='videos nerds'/><title type='text'>Scrum notes</title><content type='html'>En mi trabajo, estoy propuesto como integrante de un equipo de personas que involucraría liderazgo. No se sabe mas que eso (?). Con la experiencia que tengo en el tema de liderazgo, seguro que no me van a dar el traje rojo de los Power Rangers, pero siempre tuve como premisa que se hace camino al andar. Es por eso que en un intento (des) esperado quisiera atomizarme de sapiencias mas menesterosas en el ámbito del liderazgo en la industria del sofware.&lt;br /&gt;&lt;div style="text-align: left;"&gt;Ok, voy al punto: ví un &lt;a href="http://video.google.com/videoplay?docid=-7230144396191025011"&gt;video&lt;/a&gt; de Scrum, disertado por el mismo &lt;a href="http://www.controlchaos.com/"&gt;Ken Shwaber&lt;/a&gt; en Google Inc.&lt;br /&gt;La verdad, muy interesante. Alguna vez estuve en un sprint de Scrum en el trabajo par aun proyecto interno como una especie de Team/Technical Leader... no mucho más para contar.&lt;br /&gt;&lt;br /&gt;De esta disertación pude extraer algunas cosas interesantes sobre Scrum:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;"Everything is a timebox and it's done with cross-functional teams that are responsible for managing themselves"&lt;/span&gt;. Clarísimo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;"Scrum is a manager process for managing product development"&lt;/span&gt;&lt;/span&gt;. ¿Es Scrum una &lt;a href="http://marcelomendoza.wikidot.com/metodologias"&gt;metodología&lt;/a&gt;, en el sentido estricto de la palabra? No. Es un método. Y lo mencionan en el video. Si fuera una metodología, casi cualquier problema estaría resuelto (qué y como) en una documentación.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Scrum tiene un goal, un target al cabo de una iteración. Ese target o goal es un producto HECHO, Q ANDA. Si al final de esa iteración se testeó, se documentó, se validaron los estándares a utilizar, pero el producto target no está HECHO, Scrum FALLÓ.&lt;/li&gt;&lt;li&gt;Definición de HECHO (done): "coded to standards, it's been reviewed, it's been documented, it has unit test built to it, and it's been checked in and successfuly built"&lt;/li&gt;&lt;li&gt;Scrum se basa en la &lt;span style="font-weight: bold; font-style: italic;"&gt;transparencia de comunicación&lt;/span&gt;. "No se admiten powerpoints que dicen como luciría si estuviera terminado". Se trata de saber realmente DONDE ESTAMOS.&lt;/li&gt;&lt;li&gt;Esa transparencia es &lt;span style="font-weight: bold; font-style: italic;"&gt;ambivalente&lt;/span&gt;: transparencia con el cliente y con los team members. El cliente debe saber en que estado está el desarrollo en cualquier momento, y los team members "pueden reunirse diariamente y comentar q hicieron, q no, y q tienen planeado hacer".&lt;/li&gt;&lt;li&gt;En Scrum hay una persona q coordina el sprint, y al final de cada uno mide la diferencia entre "donde estamos" y donde "queremos estar". Si algo falla, esta es la persona a la que se le piden explicaciones. De las muchas implementaciones de Scrum en empresas solamente el 30 o 35% resultaron exitosas debido a la imposibilidad de los proyectos a aceptar cosas que no quieren (malas noticias). Toda (mala o buena) noticia debe ser informada para decidir inteligentemente.&lt;/li&gt;&lt;li&gt;A cerca de las chances &lt;span style="font-weight: bold; font-style: italic;"&gt;incrementar la velocidad de desarrollo&lt;/span&gt; cuando no se llega a tiempo: hay varias técnicas&lt;br /&gt;  - podemos dejar de lado la calidad, dejar de documentar o seguir estándares, dejar de hacer refactor y corregir el diseño, y pensar que alguien volverá después (con tiempo) a hacer lo que dejamos de hacer.&lt;br /&gt;  - podemos no construir unit tests, conformarnos con tests de aceptación.&lt;br /&gt;  - podemos trabajar mas horas (y generar un 60% mas de bugs en el código).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;La importancia de la&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;Infrastructure or core code&lt;/span&gt;: Cada nueva funcionalidad demora 20 veces más porq el infrastructure code tiene 3 caracteristicas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    &lt;span style="font-weight: bold; font-style: italic;"&gt;fragilidad&lt;/span&gt;&lt;span style="font-style: italic;"&gt;: &lt;/span&gt;cualquier cambio en ese core, tiende a romper otras cosas.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;    &lt;span style="font-weight: bold; font-style: italic;"&gt;testability&lt;/span&gt;&lt;span style="font-style: italic;"&gt;: &lt;/span&gt;el core no tiene "test harnesses", o "automated test harnesses". Si se rompe algo no nos damos cuenta hasta q está puesto funcionando y el cliente te avisa q no anda.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;    (&lt;span style="font-style: italic;"&gt;buscar palabra&lt;/span&gt;): hay pocos q saben y tienen ganas de trabajar en ese código, porq el resto se fue a desarrollo. Por eso el infrastructure code tiene menos velocidad de avance. Menor velocidad del core, menos funcionalidades se pueden colgar de él. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En fin, me está empezando a gustar Scrum como metodologia ágil y calculo que se vendrán otros post sobre adoption y management.&lt;br /&gt;&lt;br /&gt;In boca veritas.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-1561340168365813690?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/1561340168365813690/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=1561340168365813690' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1561340168365813690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1561340168365813690'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/10/scrum-notes.html' title='Scrum notes'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-1067649094046583142</id><published>2008-09-05T16:00:00.000-07:00</published><updated>2008-09-06T09:15:50.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libros non-nerds'/><title type='text'>La alternativa dentro del estilo</title><content type='html'>&lt;div style="text-align: left;"&gt;Si tuviera q nombrar un libro q nunca pude terminar, ese sería "A sangre fría" de &lt;a href="http://es.wikipedia.org/wiki/Truman_Capote"&gt;Truman Capote&lt;/a&gt;. Me lo regaló mi vieja cuando tenía 23 años y lo empezé como 5 veces, pero no pude pasar las 250 páginas en ninguna de las oportunidades. Con verguenza, lo dejé encapsulado en la cajita de los "por leer", nunca me había pasado. Al final de cuentas, el chabón revolucionó la literatura al crear un nuevo estilo literario, la &lt;i&gt;non-fiction-novel, &lt;/i&gt;que les rompió la cabeza a todos en su momento (1966). ¿Cómo puede ser q no lo pueda leer? Se lo comenté a un amigo, inmensamente más leído q yo, y me recomendó "dejá ese libro insulso... comprate 'Operacion Masacre' de Rodolfo Walsh y vas a ver quien inventó ese estilo."&lt;br /&gt;&lt;br /&gt;Curiosamente para mí, "Operación Masacre" fue publicada en julio de 1957, y es una &lt;i&gt;non-fiction-novel. &lt;/i&gt;Es más, la segunda edición del libro salió en 1964, ¡2 años antes de que Truman hubiera publicado por primera vez "A sangre fría"!&lt;br /&gt;&lt;br /&gt;La lección: no mires sólo para afuera. Acá tenemos de todo...&lt;br /&gt;&lt;br /&gt;El libro en sí facinante, fácil de leer y en castellano "argentino". El argumento (los fusilamientos de leon zarez) es desgarrador, indignante y crudo. Ya en las primeras páginas se advierte al autor y su bronca e indignacion. A diferencia de Truman, Walsh se metió a investigar cosas que no tenia que investigar en un país como el nuestro (si sos argentino ya sabrás de que hablo).&lt;br /&gt;&lt;br /&gt;Es un libro q recomiendo, y no por su belleza justamente. Es, ppalmente, un documento histórico, con fechas nombres, datos de juicios, investigaciones, testimonios, etc, que se molestó en recopilar SIN MIEDO. El género literario es innovador, y eso uno no puede perdérselo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-1067649094046583142?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/1067649094046583142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=1067649094046583142' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1067649094046583142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/1067649094046583142'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/09/la-alternativa-dentro-del-estilo.html' title='La alternativa dentro del estilo'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-589358264652014182</id><published>2008-02-26T05:14:00.000-08:00</published><updated>2008-02-26T09:24:19.472-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>IE querido</title><content type='html'>En el proyecto en el que vengo trabajando desde hace y un poco más de un año, tuvimos un problemita con una llamada ajax que no debía traer más inconvenientes.&lt;br /&gt;&lt;br /&gt;La tarea era reemplazar un "div" con una tabla con updates para un producto que se seleccionaba en un combo. En FireFox anduvo perfecto desde el ppio, pero asumimos que también andaría en Internet Explorer, ya que no introdujimos codigo js nuevo sino que reutilizamos nuestra api de actualización de elementos del dom -una simple callback-.&lt;br /&gt;&lt;br /&gt;El problema surgió al testear;  en IE no estaba funcionando la actualización. Luego de googlear un poco descubrimos que se trataba de un &lt;a style="color: rgb(51, 51, 255);" href="http://www.456bereastreet.com/archive/200802/beware_of_id_and_name_attribute_mixups_when_using_getelementbyid_in_internet_explorer/"&gt;bug&lt;/a&gt;&lt;span style="color: rgb(255, 102, 102);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;,&lt;/span&gt; que es en resumen &lt;/span&gt;&lt;/span&gt;"&lt;span style="font-style: italic;"&gt;IE treats name and id attributes as interchangeable&lt;/span&gt;". Esto es, si ponés &lt;span style="color: rgb(0, 0, 0); font-style: italic; font-weight: bold;"&gt;el id de un elemento igual al name de otro elemento&lt;/span&gt;&lt;span style="color: rgb(102, 51, 0);"&gt;,&lt;/span&gt; mandále un mail al tío Bill preguntándole que elemento va a devolver  &lt;span style="font-weight: bold; font-style: italic;"&gt;getElementById() &lt;/span&gt;cuando le pidas el elemento.&lt;br /&gt;&lt;br /&gt;Ah, y no importa si usás el $() de Prototype o el YAHOO.util.Dom.get() de YUI, no va a funcionar. En el caso de YUI de YAHOO, en la version 2.2.2 -usamos ésta-, se comieron el bug: no tienen una simple documentación del caso en el fuente del método que publican en los helps online, y terminan usando &lt;span style="font-style: italic; color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;getElementById&lt;/span&gt;.&lt;/span&gt; &lt;/span&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;No me fijé en Dojo, pero calculo que pasa lo mismo.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Ojo, no estoy relajando a las librerías js más copadas del terreno, ya que, honestamente, la &lt;a style="color: rgb(51, 51, 255);" href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-getElBId"&gt;spec&lt;/a&gt; no dice que hay q soportar bugs de IE. El ánimo proviene de un problema de la falta de acatamiento de estándares en un browser de mierda, entonces confiamos -o queremos confiar- en estas librerías que se han preocupado -y mucho- por dar soluciones cross-browser que al fin de cuentas descuidan un bug tan estúpido y grosero.&lt;br /&gt;&lt;br /&gt;En definitiva, el método devolvía otro elemento, así que la actualización del DOM se hacía en cualquier lado.&lt;br /&gt;&lt;br /&gt;¿Cuáles eran nuestras opciones?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tomar la &lt;a style="color: rgb(51, 51, 255);" href="http://www.sixteensmallstones.org/ie-javascript-bugs-overriding-internet-explorers-documentgetelementbyid-to-be-w3c-compliant-exposes-an-additional-bug-in-getattributes"&gt;sugerencia&lt;/a&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;de sniffear el browser y sobreescribir el metodo getElementById para cuando no se use gecko,&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;redefinir los parámetros para hacer un getElementsByTagName + for + if y así encontrar el elemento, o&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;revisar y cambiar los names y ids de los elementos que sean necesarios&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;La primera opción es, en mi opinión, entretenida para un desarrollador; un hack de js, sobreescribir una función usada mil veces antes -y que se va a seguir usando- por culpa de un bug de IE -otro más-. Ok, sobreescribamos la función, recorremos todo el dom en búsqueda del elemento y lo devolvemos al encontralo, o la volvemos a sobreescribir si se trata de un gecko.&lt;br /&gt;&lt;br /&gt;Suena lindo, funciona muy bien cuando la cantidad de elementos de un DOM dado es pequeño... lamentablemente no es nuestro caso, y la performance de js es importante.&lt;br /&gt;&lt;br /&gt;Creo que no hace falta agregar mucho comentario para la segunda opción -es lo mismo que la primera-.&lt;br /&gt;&lt;br /&gt;La tercera opción es laboriosa por donde se mire: debería llevar a reveer todos los elementos que reciben y/o potencialmente puedan recibir referenciamiento y "serializarlos" para de alguna manera mejorar la estructura del DOM que se tira en el browser y empezar a dejar de preocuparse por inconsistencias js en distintos browsers.&lt;br /&gt;&lt;br /&gt;¿Cual parece ser la mejor decisión, en términos de estructura, comportamiento y performance?&lt;br /&gt;En nuestro caso, reestructurar el DOM fue la decisión que seguimos. A mí, la idea de hacer el hack me agradó al ppio, pero es verdad de que si se ordena un poco mejor la estructura del html que generamos en la vista, este tipo de problemas se evitan.&lt;br /&gt;&lt;br /&gt;El tip acá es el siguiente: estructurá bien tu html.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(153, 153, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-589358264652014182?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/589358264652014182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=589358264652014182' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/589358264652014182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/589358264652014182'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2008/02/ie-querido.html' title='IE querido'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-4175510054691651945</id><published>2007-10-24T08:22:00.001-07:00</published><updated>2007-10-24T08:34:23.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos nerds'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Una diferente mirada al networking</title><content type='html'>Dando vueltas por del.icio.us links, intentando ver que tipo de solucion de request-headers le convenia a la aplicación en la que trabajo, me encontré con este videito bastante interesante. Contiene una retrospectiva crítica hacia los orígenes de las telecomunicaciones y el networking. El disertante va más allá de la mera historia, para dar su opinión sobre las debilidades y fortalezas de TCP/IP,  proponiendo la búsqueda de upgrades al protocolo en lugar de reemplazos.&lt;br /&gt;El videito dura 1 hora 20'.... así que pónganse cómodos!&lt;br /&gt;&lt;br /&gt;El video: &lt;a href="http://video.google.com/videoplay?docid=-6972678839686672840"&gt;link&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-4175510054691651945?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/4175510054691651945/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=4175510054691651945' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/4175510054691651945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/4175510054691651945'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2007/10/una-diferente-mirada-al-networking.html' title='Una diferente mirada al networking'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-2903743385479649349</id><published>2007-10-19T09:09:00.000-07:00</published><updated>2007-10-19T09:38:26.061-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reflexiones'/><title type='text'>No seas necio/a</title><content type='html'>Si hay algo q considero poco sensato es querer (sí, querer) cometer errores. La trillada frase "dejame equivocarme, quiero cometer mis propios errores" es por un lado estúpida y por otro inspirante. No tengo nada en contra del libre albedrío, pero si tengo contra la necedad. ¿Quién es tan estúpido como para anhelar fallar para aprender? Muy a menudo escucho personas que lucen ávidas en realizar alguna actividad nueva en sus vidas, pero tienen la pereza de reflexionar a cerca de los consejos, avisos, advertencias, etc, de los que disponen de manera GRATIS, esto es, sin pagar el precio de las lecciones aprendidas a los palos, con frustraciones y todo el circo.&lt;br /&gt;&lt;br /&gt;El lema deberia ser: "si meto la pata, quiero meterla de manera original... no quiero hacer las mismas cagadas que hicieron otros". ¿No suena mejor?&lt;br /&gt;&lt;br /&gt;Las personas realmente interesadas en aprender, primero aprenden de sus errores y de los errores de los demas, las incorporan a su conocimiento y las aplican en cada intento de hacer algo nuevo. De esta manera, se puede evitar andar pegándose la cabeza contra paredes que ya tienen pintadas flechas que indican hacia donde dirigirse cuando se llega a ellas...&lt;br /&gt;&lt;br /&gt;"El vino puro hace al hombre un necio, el diluído lo hace alegre..." Goethe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-2903743385479649349?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/2903743385479649349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=2903743385479649349' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/2903743385479649349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/2903743385479649349'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2007/10/no-seas-necioa.html' title='No seas necio/a'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-825083662910521106.post-7924840337960664883</id><published>2007-10-19T08:57:00.000-07:00</published><updated>2007-10-19T09:02:33.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introducción'/><title type='text'>Prueba</title><content type='html'>Este es el primer post serio de mi vida. Este blog quiero destinarlo a comentar mis pasos a traves de todas cosas q me me llamaron la atencion, sea trabajo u ocio, lo compartiré con el objeto de poder inspirar hambre por lo nuevo y lo novedoso...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/825083662910521106-7924840337960664883?l=mjmendo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mjmendo.blogspot.com/feeds/7924840337960664883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=825083662910521106&amp;postID=7924840337960664883' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/7924840337960664883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/825083662910521106/posts/default/7924840337960664883'/><link rel='alternate' type='text/html' href='http://mjmendo.blogspot.com/2007/10/prueba.html' title='Prueba'/><author><name>MensSanaInCorporeSano</name><uri>http://www.blogger.com/profile/15826036421739327286</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
