<?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-11818694</id><updated>2011-11-11T16:14:13.843+01:00</updated><category term='Windows XP'/><category term='control'/><category term='multiproceso'/><category term='DAMA'/><category term='triple arranque'/><category term='clausura'/><category term='bugs'/><category term='bug'/><category term='DIY'/><category term='MacMini'/><category term='ROOT'/><category term='verificación'/><category term='atención parcial continuada'/><category term='interfaces'/><category term='Windows'/><category term='SQLite'/><category term='memoria'/><category term='Apple'/><category term='Paul Graham'/><category term='chrome'/><category term='ASP.NET'/><category term='mecánica cuántica'/><category term='win32'/><category term='compilador'/><category term='Reeves'/><category term='memoria transaccional'/><category term='TDD'/><category term='TCP'/><category term='principios'/><category term='Elizabeth Loftus'/><category term='impresión'/><category term='sky2'/><category term='física'/><category term='concurrencia'/><category term='extensiones'/><category term='¿programadores?'/><category term='contenidos'/><category term='unicode'/><category term='ACE'/><category term='libro'/><category term='errores'/><category term='sistemas operativos'/><category term='Postel'/><category term='leyes'/><category term='gcc4.4'/><category term='en caliente'/><category term='CSP'/><category term='tipado'/><category term='dark matter'/><category term='ISO C++'/><category term='bloqueos'/><category term='escalabilidad'/><category term='mathematical'/><category term='reproducibilidad'/><category term='compatibilidad hacia atrás'/><category term='cilk++'/><category term='morarejas'/><category term='optimización'/><category term='HPC'/><category term='falsa compartición'/><category term='diff'/><category term='lambda'/><category term='Drepper'/><category term='OSX'/><category term='djb'/><category term='C++09'/><category term='lenguajes'/><category term='errores fatales'/><category term='cilk'/><category term='GPL'/><category term='triple'/><category term='dinámico'/><category term='bala de plata'/><category term='Paul Graham Facts'/><category term='visualización'/><category term='varios'/><category term='estándares'/><category term='reescritura'/><category term='ser humano'/><category term='presentación'/><category term='OOP'/><category term='dnsdjb'/><category term='patrones'/><category term='clúster'/><category term='asignador de memoria'/><category term='programadores'/><category term='ubuntu'/><category term='versionitis'/><category term='pruebas'/><category term='Mario Bunge'/><category term='svn'/><category term='subversion'/><category term='google'/><category term='.NET'/><category term='ensamblador'/><category term='complejidad'/><category term='ruby'/><category term='Python'/><category term='bloggers'/><category term='navegadores'/><category term='conceptos'/><category term='Microsoft'/><category term='reinicio'/><category term='Stroustrup'/><category term='cluster'/><category term='W3C'/><category term='ley'/><category term='eval'/><category term='ANSI C'/><category term='FriendFeed'/><category term='divulgación'/><category term='blogstar'/><category term='BSD'/><category term='promoción social'/><category term='GUI'/><category term='OpenMP'/><category term='filosofía'/><category term='evaluar'/><category term='lógico'/><category term='frases'/><category term='frameworks'/><category term='simplicidad'/><category term='plugin'/><category term='ANSI C++'/><category term='OTP'/><category term='bazar'/><category term='optimizar'/><category term='SSL'/><category term='introducción'/><category term='VC10'/><category term='falsabilidad'/><category term='Facebook'/><category term='Mac OSX'/><category term='corrección'/><category term='driver'/><category term='Alexandrescu'/><category term='yacc'/><category term='TBB'/><category term='memcpy'/><category term='bitácoras'/><category term='programación orientada a objetos'/><category term='Frets on Fire'/><category term='mitos'/><category term='especificaciones'/><category term='tolerancia'/><category term='GoF'/><category term='biología'/><category term='Bjarne Stroustrup'/><category term='abstracción no perfecta'/><category term='entrevistas'/><category term='hot fixes'/><category term='C++0x'/><category term='licencias'/><category term='gtk'/><category term='mutexes'/><category term='multicore'/><category term='estándar'/><category term='Sam Ruby'/><category term='mantras'/><category term='tolerancia a fallos'/><category term='parodia'/><category term='sistema de ficheros'/><category term='paralelismo'/><category term='ruby on rails'/><category term='código como diseño'/><category term='ANAIS'/><category term='seekdir'/><category term='Clang'/><category term='expresión'/><category term='kernel'/><category term='closure'/><category term='gtk+'/><category term='matemática'/><category term='EASTL'/><category term='arquitectos'/><category term='¿humor?'/><category term='WxWidgets'/><category term='gcc'/><category term='ICE'/><category term='Joe Armstrong'/><category term='Dapper'/><category term='P2P'/><category term='excepciones'/><category term='Erlang'/><category term='cuerdas'/><category term='estático'/><category term='universos paralelos'/><category term='sobrecarga informativa'/><category term='caché'/><category term='false sharing'/><category term='DNS'/><category term='software libre'/><category term='recolección de basura'/><category term='web'/><category term='método científico'/><category term='hilos'/><category term='planificador de linux'/><category term='C'/><category term='seguridad'/><category term='peopleware'/><category term='plug-in'/><category term='código'/><category term='CORBA'/><category term='rendimiento'/><category term='Clojure'/><category term='desarrollo'/><category term='Threading Building Blocks'/><category term='Dracón'/><category term='usuario'/><category term='redes sociales'/><category term='humildad'/><category term='Communicating Sequential Processes'/><category term='VC++'/><category term='Ralph Johnson'/><category term='borrador'/><category term='vulnerabilidad'/><category term='firefox'/><category term='pensar'/><category term='programación funcional'/><category term='testeo'/><category term='libros'/><category term='Python 2.6'/><category term='UDP'/><category term='recolector de basura'/><category term='AWK'/><category term='investigación'/><category term='programación concurrente'/><category term='copy/paste'/><category term='automático'/><category term='Mac'/><category term='volatile'/><category term='ecosistema'/><category term='modestia'/><category term='recuerdos falsos'/><category term='Mono'/><category term='humano'/><category term='diseño'/><category term='pcc'/><category term='MPI'/><category term='bsw'/><category term='humor'/><category term='no bloqueante'/><category term='ext3'/><category term='STM'/><category term='Herb Sutter'/><category term='portabilidad'/><category term='threads'/><category term='POO'/><category term='logic'/><category term='cortar y pegar'/><category term='Beautiful Code'/><category term='gurús'/><category term='bayesiano'/><category term='bases de datos'/><category term='estética'/><category term='primeras impresiones'/><category term='escepticismo'/><category term='sincronización'/><category term='bash'/><category term='hechos'/><category term='paradigmas'/><category term='abstracción'/><category term='capas'/><category term='Gang of Four'/><category term='POSIX'/><category term='programación'/><category term='VCS'/><category term='principio de responsábilidad única'/><category term='barrapunto'/><category term='intel'/><category term='digg'/><category term='STL'/><category term='software'/><category term='materia oscura'/><category term='IE8'/><category term='cuellos de botella'/><category term='memcached'/><category term='Qt'/><category term='falsos recuerdos'/><category term='navegador'/><category term='middleware'/><category term='cuántica'/><category term='ciencia'/><category term='FoF'/><category term='Visual C++'/><category term='licencia'/><category term='evaluate'/><category term='exploit'/><category term='programación paralela'/><category term='bindiff'/><category term='corner case'/><category term='fs'/><category term='UNIX'/><category term='módulos'/><category term='texto'/><category term='Facts'/><category term='refactorización'/><category term='recuperación'/><category term='Jack Reeves'/><category term='falacias'/><category term='cache'/><category term='actualización'/><category term='Python 3.0'/><category term='fsync'/><category term='filessystem'/><category term='Robustez'/><category term='Epigramas'/><category term='arranque'/><category term='memcache'/><category term='C++'/><category term='LLVM'/><category term='yukon'/><category term='obsolescencia'/><category term='logica'/><category term='recursos'/><category term='CPU'/><category term='promoción'/><category term='bases de datos relacionales'/><category term='parche'/><category term='internet'/><category term='tecnología'/><category term='Sutter'/><category term='AMQP'/><category term='metodología'/><category term='existencialismo'/><category term='multiplataforma'/><category term='tipado estático'/><category term='HTML5'/><category term='linux'/><category term='patrones de diseño'/><category term='Ada'/><category term='allocator'/><category term='me'/><category term='JVM'/><category term='paso de mensajes'/><category term='lock-free structures'/><category term='belleza'/><category term='¿programación?'/><category term='servidor web'/><category term='FSF'/><category term='multitarea'/><category term='VB6'/><category term='videos'/><category term='usabilidadad'/><category term='blogueros'/><category term='expression'/><category term='amor'/><category term='Java'/><category term='blog'/><category term='SMP'/><category term='herramientas'/><category term='reddit'/><category term='D'/><category term='VLC'/><category term='menéame'/><category term='gcc4.5'/><category term='autorreferencia'/><category term='garbage collector'/><category term='Code as Design'/><category term='ingeniería de software'/><category term='vistazo'/><category term='slurm'/><category term='Fail Fast'/><category term='tipado dinámico'/><category term='noticias'/><category term='flame'/><category term='ror'/><category term='TLS'/><category term='sk98lin'/><category term='ficheros'/><category term='Objetive-C'/><category term='marvell'/><category term='apología'/><title type='text'>Yet Another Programming Weblog</title><subtitle type='html'>Como su propio nombre indica, aún otro weblog de programación más</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default?start-index=101&amp;max-results=100'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11818694.post-2756044429712853495</id><published>2011-09-14T16:58:00.000+02:00</published><updated>2011-09-14T17:19:07.142+02:00</updated><title type='text'>Windows 8 Developer Preview disponible para descarga</title><content type='html'>&lt;p&gt;Se puede leer vía &lt;a href="http://www.reddit.com/r/programming/comments/kejwo/windows_8_developer_preview_with_visual_studio_11/"&gt;reddit&lt;/a&gt; que &lt;a href="http://www.pcmag.com/article2/0,2817,2392860,00.asp"&gt;Microsoft ha hecho pública una versión de Windows 8 para desarrolladores&lt;/a&gt; que se puede descargar gratuitamente. Existe además la posibilidad de &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;descargarse con ella una versión previa de las herramientas de desarrollo&lt;/a&gt; para dicho sistema, incluidos Visual Studio 11 Express y un SDK para &lt;a href="http://en.wikipedia.org/wiki/Metro_(design_language)"&gt;aplicaciones con estilo Metro&lt;/a&gt;. Además se van adelantado detalles concretos de en que va a consistir &lt;a href="http://www.infoq.com/news/2011/09/WinRT-API"&gt;WinRT&lt;/a&gt;, el reemplazo orientado a objetos de la &lt;a href="http://es.wikipedia.org/wiki/API_de_Windows"&gt;API de win32&lt;/a&gt; y su &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh464947"&gt;documentación asociada&lt;/a&gt; ¿Podrá retener Microsoft a la gran base de desarrolladores que usan sus productos, algo &lt;a href="//barrapunto.com/article.pl?sid=11/06/07/155227&amp;tid=41"&gt;descontenta con los últimos anuncios estratégicos&lt;/a&gt;? ¿Logrará adaptarse con éxito a &lt;a href="//barrapunto.com/article.pl?sid=11/01/07/1540227&amp;tid=41"&gt;los dispositivos móviles&lt;/a&gt;?&lt;/p&gt;&lt;p&gt;&lt;em&gt;Publicado originalmente para &lt;a href="http://barrapunto.com/article.pl?sid=11/09/14/1450213"&gt;barrapunto&lt;/a&gt;, pero, bueno, creo que es de interés de los lectores que queden de este blog&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-2756044429712853495?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/2756044429712853495/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=2756044429712853495' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2756044429712853495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2756044429712853495'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2011/09/windows-8-developer-preview-disponible.html' title='Windows 8 Developer Preview disponible para descarga'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3303032429735659355</id><published>2011-06-13T10:21:00.004+02:00</published><updated>2011-06-13T10:28:10.029+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slurm'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='HPC'/><category scheme='http://www.blogger.com/atom/ns#' term='cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='clúster'/><title type='text'>Un Clúster con SLURM, uso y configuración</title><content type='html'>He tenido la oportunidad de poner en marcha un clúster (pequeñito) y aprovecho que he hecho una presentación para sus usuarios para colgarla aquí por si resulta de ayuda a alguien o por si alguien la encuentra interesante.&lt;div style="width:425px" id="__ss_8289890"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/miguelolivan/un-clster-con-slurm-uso-y-configuracin" title="Un Clúster con SLURM, uso y configuración"&gt;Un Clúster con SLURM, uso y configuración&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8289890" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelolivan"&gt;miguelolivan&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3303032429735659355?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3303032429735659355/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3303032429735659355' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3303032429735659355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3303032429735659355'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2011/06/un-cluster-con-slurm-uso-y.html' title='Un Clúster con SLURM, uso y configuración'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8922761136078360809</id><published>2011-05-13T23:23:00.004+02:00</published><updated>2011-05-13T23:43:30.335+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplataforma'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Lo que todo programador de C debería saber sobre el "comportamiento indefinido"</title><content type='html'>Este ha sido uno de los artículos damnificados por &lt;a href="http://barrapunto.com/article.pl?sid=11/05/13/1020214"&gt;la caída de blogger.com&lt;/a&gt; y por eso no lo he puesto aquí antes, pero me gustaría reseñar este &lt;a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html"&gt;What Every C Programmer Should Know About Undefined Behavior 1/3&lt;/a&gt; del &lt;a href="http://blog.llvm.org/"&gt;blog de LLVM&lt;/a&gt;. No solo hace una estupenda introducción al qué y al por qué del comportamiento indefinido en C sino que apunta a una serie de artículos que merece la pena mencionar también: &lt;a href="http://blog.regehr.org/archives/213"&gt;A Guide to Undefined Behavior in C and C++, Part 1&lt;/a&gt;, &lt;a href="http://blog.regehr.org/archives/226"&gt;Part 2&lt;/a&gt; y &lt;a href="http://blog.regehr.org/archives/232"&gt;Part 3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Del primero de esa serie, para que quede claro de qué va el asunto :) &lt;blockquote&gt;Of course it is physically possible to pick up a basketball and run with it. It is also possible you will get away with it during a game.  However, it is against the rules; good players won’t do it and bad players won’t get away with it for long.&lt;/blockquote&gt; Como se puede leer es uno de esos temas que conviene saber (y muy bien) si se pretende hacer código portable. Así que, para leer con detenimiento.&lt;br /&gt;&lt;br /&gt;Soy un atento seguidor del &lt;a href="http://blog.llvm.org/"&gt;blog de LLVM&lt;/a&gt;, pero esta vez lo he visto en &lt;a href="http://twitter.com/#!/toomanysecrets"&gt;el twitter de TooManySecrets&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8922761136078360809?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8922761136078360809/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8922761136078360809' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8922761136078360809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8922761136078360809'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2011/05/lo-que-todo-programador-de-c-deberia.html' title='Lo que todo programador de C debería saber sobre el &quot;comportamiento indefinido&quot;'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4498862086592975857</id><published>2011-04-29T11:59:00.003+02:00</published><updated>2011-04-29T12:04:21.816+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='estándares'/><category scheme='http://www.blogger.com/atom/ns#' term='testeo'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='corner case'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='corrección'/><category scheme='http://www.blogger.com/atom/ns#' term='especificaciones'/><title type='text'>¿Testeo o especificaciones?</title><content type='html'>¿Cómo se determina el comportamiento de un sistema? ¿Testeo o leyes, estándares, especificaciones...? Como siempre, es mi postura, &lt;a href="http://yapw.blogspot.com/2007/07/testeo-o-correccin.html"&gt;las dos&lt;/a&gt;. El ejemplo surge de una &lt;a href="http://barrapunto.com/comments.pl?sid=86932&amp;cid=1275396"&gt;incialización incompleta de un array de caracteres&lt;/a&gt; ¿Cómo se debería comportar? Mi teoría en principio, más o menos errónea, era que debía ocurrir lo mismo que con una copia de cadenas en C. Se copia hasta el cero terminador y ahí acaba el proceso. El resto de elementos del array indefinidos, sin inicializar. Pero estaba la duda... ¿Cómo se comporta y/o se debe comportar un sistema?&lt;br /&gt;&lt;br /&gt;Para responder a las dos preguntas ni los test son suficiente ni lo que diga el estándar lo es. Los dos juntos pueden calmar más :)&lt;br /&gt;&lt;br /&gt;En el punto 8.5.2.3 del &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf"&gt;estándar C++0x&lt;/a&gt; se habla de lo que ocurre si se proporcionan menos caracteres a la inicialización:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If there are fewer initializers than there are array elements, each element not explicitly initialized shall be&lt;br /&gt;zero-initialized &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo este punto está ausente en el &lt;a href="http://www-d0.fnal.gov/~dladams/cxx_standard.pdf"&gt;C++98&lt;/a&gt;. Los test aparentemente dicen que se suelen rellenar de ceros ¿Por qué? y ¿Podemos confiar en que &lt;em&gt;siempre&lt;/em&gt; sea así?&lt;br /&gt;&lt;br /&gt;Asumiendo (que quizás sea mucho asumir) que la incialización de cadenas es análoga a la incialalización en forma de lista (con llaves) esto puede tener una expliación. Según se puede leer en el punto 8.5.1.7 del &lt;a href="http://www-d0.fnal.gov/~dladams/cxx_standard.pdf"&gt;C++98&lt;/a&gt;: &lt;br /&gt;&lt;blockquote&gt;  If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be default-initialized (8.5)&lt;br /&gt;[Example:&lt;br /&gt;        struct S { int a; char* b; int c; };&lt;br /&gt;        S ss = { 1, "asdf" };&lt;br /&gt;  initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form&lt;br /&gt;  int(), that is, 0. ]&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf"&gt;C++0x&lt;/a&gt; pensaba que quizás cambia algo pero el punto 8.5.1.7 para decir básicamente lo mismo:&lt;br /&gt;&lt;blockquote&gt;If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member&lt;br /&gt;not explicitly initialized shall be initialized from an empty initializer list (8.5.4)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Las diferencias vienen de los mejoradas &lt;a href="http://en.wikipedia.org/wiki/C++0x#Initializer_lists"&gt;listas de inicialización de C++0x&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Leyendo todo esto yo tengo claro que no me fiaría de que el resto de los caracteres estuviesen a 0, aunque funcione así probablemente en casi todas las implementaciones... O sea, que no conviene fiarse de lo que hay después del cero terminador. Además ¿Para qué? Es tentar a la suerte...&lt;br /&gt;&lt;br /&gt;Lecciones a aprender, al menos tal como yo lo veo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Intentar no buscar los casos difíciles, en los que hay que consultar la ley. En ellos es probable que no todas las implementaciones la hayan leído correctamente&lt;/li&gt;&lt;li&gt;Conocer los estándares y especificaciones que usamos o al menos saber buscar en ellas en caso de duda&lt;/li&gt;&lt;li&gt;Testear. cuantas más pruebas se hagan al código más fácil es encontrar los "casos patológicos"&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4498862086592975857?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4498862086592975857/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4498862086592975857' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4498862086592975857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4498862086592975857'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2011/04/testeo-o-especificaciones.html' title='¿Testeo o especificaciones?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4736103234968108509</id><published>2010-12-02T15:41:00.006+01:00</published><updated>2010-12-03T10:31:11.691+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introducción'/><category scheme='http://www.blogger.com/atom/ns#' term='VCS'/><category scheme='http://www.blogger.com/atom/ns#' term='control'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='código'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Lo mínimo imprescindible para controlar código fuente con subversion</title><content type='html'>He realizado una presentación para ayudar a un pequeño cursito sobre &lt;a href="http://subversion.apache.org/"&gt;subversion&lt;/a&gt; que voy a dar en breve. Así que publico aquí las transparencias que quizás pueden ser de utilidad para alguien. Está fuertemente inspirado en el manual &lt;a href="http://svnbook.red-bean.com/"&gt;Version Control with Subversion&lt;/a&gt; y concretamente en el apartado del &lt;a href="http://svnbook.red-bean.com/nightly/en/svn.tour.cycle.html"&gt;ciclo básico de trabajo con svn&lt;/a&gt; con algunos añadidos de gráficos, buenas prácticas, programas auxiliares y algunos enlaces básicos. Por cierto, gracias a &lt;a href="http://blackshell.usebox.net/"&gt;Juanjo&lt;/a&gt; que le ha echado un vistazo y ha detectado alguna carencia. &lt;br /&gt;&lt;div style="width:425px" id="__ss_6006689"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/miguelolivan/sv-nbasico" title="Sistemas de control de versiones. Introducción a svn"&gt;Sistemas de control de versiones. Introducción a svn&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6006689" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=svnbasico-101202082650-phpapp01&amp;stripped_title=sv-nbasico&amp;userName=miguelolivan" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6006689" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=svnbasico-101202082650-phpapp01&amp;stripped_title=sv-nbasico&amp;userName=miguelolivan" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelolivan"&gt;miguelolivan&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El título de la presentación es "Sistemas de control de versiones. Introducción a subversion" aunque me gustaría más haberlo titulado como este post, "Lo mínimo imprescindible para controlar código fuente con subversion" o como posibles títulos alternativos, dado el público al que va dirigido "Subversion para programadores ocasionales" o "Control de código fuente para científicos". A ver si entre todos podemos hacer que &lt;a href="http://fernand0.blogalia.com//historias/68196"&gt;los científicos programen mejor&lt;/a&gt;. En beneficio de todos :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4736103234968108509?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4736103234968108509/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4736103234968108509' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4736103234968108509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4736103234968108509'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/12/lo-minimo-imprescindible-para-controlar.html' title='Lo mínimo imprescindible para controlar código fuente con subversion'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8539991393791368482</id><published>2010-11-11T10:55:00.002+01:00</published><updated>2010-11-11T10:58:42.386+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='texto'/><category scheme='http://www.blogger.com/atom/ns#' term='ficheros'/><category scheme='http://www.blogger.com/atom/ns#' term='sistema de ficheros'/><category scheme='http://www.blogger.com/atom/ns#' term='fs'/><category scheme='http://www.blogger.com/atom/ns#' term='recuperación'/><category scheme='http://www.blogger.com/atom/ns#' term='filessystem'/><title type='text'>Recuperar ficheros de texto de sistema de ficheros corrupto</title><content type='html'>Hace poco he tenido que vivir una de esas historias de terror que uno teme encontrar. Pues llegó. Un sistema de ficheros irrecuperable (RAID lineal con un par de discos que no responden) e información valiosa de la que no se hacía copia de seguridad. El hecho es que la información valiosa son ficheros de texto, código fuente que se hizo de modo improvisado y fuera de repositorios ni backups y que luego se echa de menos. La solución, está claro, sería hacer backup de lo valioso, pero eso ya se empieza a ver claro por los interesados :)&lt;br /&gt;&lt;br /&gt;Bueno, al grano ¿Cómo recuperar esos archivos de código fuente? Aquí voy a dar una solución "sencilla", pero que tiene varias precondiciones:&lt;br /&gt;- Que la controladora del disco responda y que se pueda leer del dispositivo&lt;br /&gt;- Que el texto a encontrar tenga menos del tamaño de un bloque del sistema de ficheros. De otro modo también vale, pero tendremos que buscar trozos y ensamblarlos.&lt;br /&gt;- Que dispongamos de un sistema de ficheros donde quepa el backup. (Se podría hacer este proceso por partes o "al vuelo", jugando con el skip de &lt;tt&gt;dd&lt;/tt&gt;, pero se va de la recetilla que he aplicado)&lt;br /&gt;&lt;br /&gt;Entonces lo primero de todo (aplicable a cualquier situación donde un disco empiece a hacer cosas raras) es volcar el contenido del disco&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;#dd if=/dev/sd[ndev] of=/[outfile] bs=[sizeblock] conv=sync,noerror&lt;/tt&gt; &lt;br /&gt;&lt;br /&gt;Donde ndev es el dispositivo en mal estado. En mi caso es en buen estado pero que formaba parte de un todo en mal estado. De todos modos la opción &lt;tt&gt;sync, noerror&lt;/tt&gt; trata de lidiar con errores en disco y rellenar con ceros las partes no leídas. Para este método rellenar con ceros no sería necesario porque no vamos a tratar de reparar el sistema sino hacer un método más basto, suficiente para nuestros propósitos y sin modificar el contenido del disco. Primero usamos la "magia" de &lt;tt&gt;strings&lt;/tt&gt;. En principio es un comando para encontrar información relevante en código objeto, pero va muy bien para encontrar texto en binario (que es su labor básicamente). El comando que he usado es:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ strings -n20 -a -t d outfile &gt; outfile.str&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Dónde la magia está en que consideramos como "cadena mínima". En este caso, con el n se le indica que una cadena consta de al menos veinte caracteres imprimibles. Si alguien va a usar este método puede jugar con él, sabiendo el tamaño de linea a buscar.&lt;br /&gt;Posteriormente se pueden hacer &lt;tt&gt;grep&lt;/tt&gt;s o buscar con &lt;tt&gt;less&lt;/tt&gt; sobre outfile.str con la buena noticia de que strings nos ha puesto en la primera columna (gracias al parámetro -t d) en que posición está la cadena. Ahora podemos recuperar el fichero con el mágico &lt;tt&gt;dd&lt;/tt&gt;:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;$ dd if=sdb1 bs=1 skip=[pos-offset] count=filesize 2&gt;/dev/null &gt; file.c&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente tenemos que jugar con offset (la posición en la que se encontraba la cadena encontrada en el fichero) y filesize (el tamaño del fichero). Manual y un poco a pedales, pero si los datos que hemos perdido lo merecen...&lt;br /&gt;&lt;br /&gt;Debo notar que es una técnica no destructiva y que es complementaria a la posibilidad de reparar el sistema de ficheros. Espero que le pueda servir a alguien y también se admiten sugerencias de administradores avezados acerca de cómo reparar RAIDs lineales por soft y/o recuperar información binaria de ellos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8539991393791368482?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8539991393791368482/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8539991393791368482' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8539991393791368482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8539991393791368482'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/11/recuperar-ficheros-de-texto-de-sistema.html' title='Recuperar ficheros de texto de sistema de ficheros corrupto'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8227888490251591566</id><published>2010-10-27T22:40:00.004+02:00</published><updated>2010-10-28T09:29:17.894+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EASTL'/><category scheme='http://www.blogger.com/atom/ns#' term='STL'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><title type='text'>Electronic Arts publica EASTL como software libre</title><content type='html'>Ya lo he &lt;a href="http://softlibre.barrapunto.com/article.pl?sid=10/10/27/2016236"&gt;publicado en barrapunto&lt;/a&gt;, pero por a alguien más le interesa y como me ha costado un poquillo hacer la entrada con sus enlaces pues la aprovecho para aquí :)&lt;br /&gt;&lt;br /&gt;El tema es que un pobrecito hablador ha envíado un enlace con la noticia de que &lt;a href="http://github.com/paulhodge/EASTL"&gt;Electronic Arts (EA) ha publicado EASTL como software libre&lt;/a&gt;. La &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html"&gt;EASTL&lt;/a&gt; es la versión de EA de la &lt;a href="http://en.wikipedia.org/wiki/Standard_Template_Library"&gt;STL&lt;/a&gt;, la biblioteca estándar de plantillas de C++. Fue desarrollada por &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html#Motivation"&gt;EA motivados por las exigencias extremas del uso de la memoria y CPU en el ámbito de los juegos&lt;/a&gt;. Ha sido publicada en la web &lt;a href="http://gpl.ea.com/"&gt;de software libre de EA en formato zip&lt;/a&gt;. &lt;a href="http://github.com/paulhodge/EASTL"&gt;Paul Hodge ha creado posteriormente un repositorio en github con el mismo código&lt;/a&gt;. En la &lt;a href="http://www.reddit.com/r/programming/search?q=EASTL"&gt;sección de desarrollo de juegos de reddit&lt;/a&gt; han publicado algunos enlaces y comentarios que me han parecido interesantes y los pego a continuación.&lt;br /&gt;&lt;br /&gt;Se puede leer allí &lt;a href="http://www.reddit.com/r/gamedev/comments/dssua/gamedev_thought_you_might_know_eastl_has_been/"&gt;la propia noticia&lt;/a&gt;,  &lt;a href="http://www.reddit.com/r/gamedev/comments/dw6po/analysis_of_a_day_integrating_eastl_in_a_simple/"&gt;las experiencias de un desarrollador tratando de integrarla en un pequeño proyecto existente&lt;/a&gt; y también &lt;a href="http://www.reddit.com/r/gamedev/comments/duuhl/eastl_benchmarked/"&gt;se apunta&lt;/a&gt; a &lt;a href="http://msinilo.pl/blog/?p=668"&gt;una comparativa de rendimiento&lt;/a&gt; con otras bibliotecas como la STL estándar o como &lt;a href="http://code.google.com/p/rdestl/"&gt;RDE STL&lt;/a&gt; hecha por el autor de esta última.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización y bola extra:&lt;/strong&gt; Me he encontrado con este artículo que también puede interesar a los lectores de este blog y de la noticia anterior: &lt;a href="http://gamesfromwithin.com/start-pre-allocating-and-stop-worrying"&gt;Start Pre-allocating And Stop Worrying&lt;/a&gt;. Los que vistan el blog físicamente (si es que existen) ya saben que estas cosas las suelo poner en mis &lt;a href="http://www.google.com/reader/shared/miguelolivan"&gt;compartidos de google.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8227888490251591566?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8227888490251591566/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8227888490251591566' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8227888490251591566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8227888490251591566'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/10/electronic-arts-publica-eastl-con.html' title='Electronic Arts publica EASTL como software libre'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5637218783289849603</id><published>2010-06-28T13:22:00.006+02:00</published><updated>2010-06-28T16:24:07.653+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ROOT'/><category scheme='http://www.blogger.com/atom/ns#' term='expression'/><category scheme='http://www.blogger.com/atom/ns#' term='evaluate'/><category scheme='http://www.blogger.com/atom/ns#' term='ANAIS'/><category scheme='http://www.blogger.com/atom/ns#' term='mathematical'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='eval'/><category scheme='http://www.blogger.com/atom/ns#' term='logic'/><title type='text'>Using the magic behind TFormula</title><content type='html'>I wanted to evaluate conditions at runtime and I'm a happy user of &lt;a href="http://root.cern.ch/drupal/"&gt;ROOT&lt;/a&gt;. So I was thinking to use the "magic" behind &lt;a href="http://root.cern.ch/root/html/TFormula.html"&gt;TFormula&lt;/a&gt;. But &lt;a href="http://root.cern.ch/root/html/TFormula.html"&gt;TFormula&lt;/a&gt; has some limitations: the name of the variables are "x, y z, t" and I need to use arbitrary names...&lt;br /&gt;&lt;br /&gt;Doing some research I found &lt;a href="http://root.cern.ch/root/htmldoc/RooFormulaVar.html"&gt;RooFormulaVar&lt;/a&gt;, a class that is part of &lt;a href="http://root.cern.ch/drupal/content/roofit"&gt;RooFit&lt;/a&gt; and it does the job :) I think that &lt;a href="http://root.cern.ch/root/htmldoc/RooFormulaVar.html"&gt;RooFormulaVar&lt;/a&gt; lacks proper documentation, so I'm going to describe briefly how to use it to evaluate mathematical and logic expressions at runtime. Using it is easy, if you know how :)&lt;br /&gt;&lt;br /&gt;A simple example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;RooRealVar a("a","a",3.);&lt;br /&gt;RooRealVar b("b","b",7.);&lt;br /&gt;RooFormulaVar plus(“aplusb”,”a+b”,RooArgSet(a,b));&lt;br /&gt;//10&lt;br /&gt;cout &lt;&lt; plus.getVal() &lt;&lt; endl;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Evaluating bitwise operations and passing a set of arguments in a more dynamic way:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;TClonesArray tca("RooRealVar",2)&lt;br /&gt;RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); &lt;br /&gt;RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);&lt;br /&gt;&lt;br /&gt;RooFormulaVar opor("var1orvar2","var1&amp;var2",RooArgSet(tca));&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(2.);&lt;br /&gt;var2-&gt;setVal(7.);&lt;br /&gt;//2&lt;br /&gt;cout &lt;&lt; opor.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(5.);&lt;br /&gt;var2-&gt;setVal(1.);&lt;br /&gt;//1&lt;br /&gt;cout &lt;&lt; opor.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(8.);&lt;br /&gt;var2-&gt;setVal(1.);&lt;br /&gt;//0&lt;br /&gt;cout &lt;&lt; opor.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally, evaluating logical expressions:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;TClonesArray tca("RooRealVar",2)&lt;br /&gt;RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); &lt;br /&gt;RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);&lt;br /&gt;&lt;br /&gt;RooFormulaVar cond("var1littvar2big","var1&lt;1 || var2&gt;10",RooArgSet(tca));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(0.);&lt;br /&gt;var2-&gt;setVal(17.);&lt;br /&gt;&lt;br /&gt;//true&lt;br /&gt;cout &lt;&lt; cond.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(3.);&lt;br /&gt;var2-&gt;setVal(11.);&lt;br /&gt;&lt;br /&gt;//true&lt;br /&gt;cout &lt;&lt; cond.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(8.);&lt;br /&gt;var2-&gt;setVal(1.);&lt;br /&gt;//false&lt;br /&gt;cout &lt;&lt; cond.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I hope that this blog entry will be useful and someone will save time and code. Cheers and happy coding! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5637218783289849603?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5637218783289849603/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5637218783289849603' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5637218783289849603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5637218783289849603'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/06/using-magic-behind-tformula.html' title='Using the magic behind TFormula'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-996259700701887394</id><published>2010-06-28T08:57:00.010+02:00</published><updated>2010-06-28T13:19:20.213+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matemática'/><category scheme='http://www.blogger.com/atom/ns#' term='ROOT'/><category scheme='http://www.blogger.com/atom/ns#' term='estático'/><category scheme='http://www.blogger.com/atom/ns#' term='ANAIS'/><category scheme='http://www.blogger.com/atom/ns#' term='expresión'/><category scheme='http://www.blogger.com/atom/ns#' term='dinámico'/><category scheme='http://www.blogger.com/atom/ns#' term='logica'/><category scheme='http://www.blogger.com/atom/ns#' term='lógico'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='evaluar'/><title type='text'>Cómo evaluar expresiones lógico-matemáticas en tiempo de ejecución (y usar la magia de TFormula)</title><content type='html'>C++ es un lenguaje poco dinámico. En otros lenguajes se dispone del propio lenguaje en tiempo de ejecución y, usando &lt;a href="http://en.wikipedia.org/wiki/Eval"&gt;Eval&lt;/a&gt; o análogos, se puede evaluar cualquier expresión válida del lenguaje. Esto que puede ser una ventaja y puede ahorrar líneas de código puede ser también peligroso si se usa con poca cabeza. Como casi todo :)&lt;br /&gt;&lt;br /&gt;Bueno, de todos modos lo que yo necesitaba no era eval como tal, sino evaluación de condiciones en tiempo de ejecución: poder decirle al programa qué condición debe evaluar en función de una serie de variables que dependen también de una configuración. Todo demasiado dinámico para que resultase sencillo de programar en C++. Había por lo menos tres alternativas, aparte  de una cuarta que es la que he elegido :)&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Programar una especie de ejecutor de reglas. Para el que tiene un martillo todo son clavos y si sólo te centras en el código la solución pasa por ahí. Mi intuición me dice que hiciese lo que hiciese me iba a quedar corto o introduciría bugs gordos potenciales. Mejor aprovechar algo existente...&lt;/li&gt;&lt;li&gt;Dejar la parte dinámica para un lenguaje dinámico. Hacer librerías que puedan ser llamadas desde dicho lenguaje. La descarté por varias razones, entre ellas el esfuerzo "librerizar" el código y la posible pérdida de rendimiento: la condición ha de evaluarse en le bucle principal y el rendimiento es un requisito clave.&lt;/li&gt;&lt;li&gt;Embeber un lenguaje dinámico dentro de programa. Introduciría dependencias nuevas. Sonaba seductor :), pero seguramente demasiado arriesgado&lt;/li&gt;&lt;/ul&gt; &lt;br /&gt;Prácticamente todas las soluciones son matar moscas a cañonazos y la que he elegido creo que es la más elegante de todas: usar una librería que ya estaba usando, cuya funcionalidad no conocía del todo (y que no está especialmente documentada...)&lt;br /&gt;&lt;br /&gt;Así que esta entrada servirá además para mostrar una funcionalidad interesante de &lt;a href="http://root.cern.ch/drupal/"&gt;ROOT&lt;/a&gt; que podría ser usada por separado. Más o menos. El hecho es que &lt;a href="http://root.cern.ch/drupal/"&gt;ROOT&lt;/a&gt;, una librería de gestión y análisis de datos (en grandes cantidades) ya posee un evaluador de formulas que se llama &lt;a href="http://root.cern.ch/root/html/TFormula.html"&gt;TFormula&lt;/a&gt;. Es capaz de evaluar tanto expresiones matemáticas como lógicas o a nivel de bit. Cubre sobradamente mis exigencias. Al &lt;a href="http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/first_steps/tformula.html"&gt;informarme más sobre su uso&lt;/a&gt;, vi que tenía inconvenientes: el nombre de las variables es fijo (x, y, z ,t) y no creía conveniente configurar las formulas basadas en esos nombres de variables o reemplazar a mano el nombre de las variables por las "por defecto". Entonces, buscando un poquito más encontré que en un sublibrería de ROOT, &lt;a href="http://root.cern.ch/drupal/content/roofit"&gt;RooFit&lt;/a&gt;, existía una no muy documentada &lt;a href="http://root.cern.ch/root/htmldoc/RooFormulaVar.html"&gt;RooFormulaVar&lt;/a&gt;, que hace básicamente lo que yo quería, evaluar condiciones (y de paso formulas matemáticas) en base a una cadena de definición. El uso es relativamente sencillo una vez que se descubre cómo, porque no hay una documentación directa de cómo hacerlo. Un uso fácil sería:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;RooRealVar a("a","a",3.);&lt;br /&gt;RooRealVar b("b","b",7.);&lt;br /&gt;RooFormulaVar plus(“aplusb”,”a+b”,RooArgSet(a,b));&lt;br /&gt;//10&lt;br /&gt;cout &lt;&lt; plus.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si se quiere usar con un número variable de argumentos, se puede usar otro constructor y da más juego, es un poquito más dinámico. Este ejemplo además usa operaciones a nivel de bit:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;TClonesArray tca("RooRealVar",2)&lt;br /&gt;RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); &lt;br /&gt;RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);&lt;br /&gt;&lt;br /&gt;RooFormulaVar opor("var1orvar2","var1&amp;var2",RooArgSet(tca));&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(2.);&lt;br /&gt;var2-&gt;setVal(7.);&lt;br /&gt;//2&lt;br /&gt;cout &lt;&lt; opor.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(5.);&lt;br /&gt;var2-&gt;setVal(1.);&lt;br /&gt;//1&lt;br /&gt;cout &lt;&lt; opor.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(8.);&lt;br /&gt;var2-&gt;setVal(1.);&lt;br /&gt;//0&lt;br /&gt;cout &lt;&lt; opor.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Por último y más importante para mí, evaluar condiciones lógicas, por ejemplo:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;TClonesArray tca("RooRealVar",2)&lt;br /&gt;RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); &lt;br /&gt;RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);&lt;br /&gt;&lt;br /&gt;RooFormulaVar cond("var1littvar2big","var1&lt;1 || var2&gt;10",RooArgSet(tca));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(0.);&lt;br /&gt;var2-&gt;setVal(17.);&lt;br /&gt;&lt;br /&gt;//true&lt;br /&gt;cout &lt;&lt; cond.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(3.);&lt;br /&gt;var2-&gt;setVal(11.);&lt;br /&gt;&lt;br /&gt;//true&lt;br /&gt;cout &lt;&lt; cond.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt;var1-&gt;setVal(8.);&lt;br /&gt;var2-&gt;setVal(1.);&lt;br /&gt;//false&lt;br /&gt;cout &lt;&lt; cond.getVal() &lt;&lt; endl;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero que sirva a alguien y que esa persona se pueda ahorrar tiempo y código :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-996259700701887394?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/996259700701887394/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=996259700701887394' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/996259700701887394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/996259700701887394'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/06/como-evaluar-expresiones-logico.html' title='Cómo evaluar expresiones lógico-matemáticas en tiempo de ejecución (y usar la magia de TFormula)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-186563273119871455</id><published>2010-05-18T11:53:00.005+02:00</published><updated>2010-05-18T13:58:15.666+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='materia oscura'/><category scheme='http://www.blogger.com/atom/ns#' term='ROOT'/><category scheme='http://www.blogger.com/atom/ns#' term='dark matter'/><category scheme='http://www.blogger.com/atom/ns#' term='ANAIS'/><category scheme='http://www.blogger.com/atom/ns#' term='física'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='DAMA'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><title type='text'>Diseño del software de adquisición de datos para ANAIS</title><content type='html'>Creo que puede ser de interés para la audiencia potencial de este blog las transparencias que he preparado para presentar mi trabajo de estos últimos tres meses. Se trata del diseño del software de adquisición de datos para el experimento ANAIS:&lt;br /&gt;&lt;div style="width:425px" id="__ss_4136133"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/miguelolivan/diseo-sw-anais-4136133" title="Diseño del software de adquisición de datos para ANAIS"&gt;Diseño del software de adquisición de datos para ANAIS&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4136133" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=diseoswanais-100518040342-phpapp02&amp;stripped_title=diseo-sw-anais-4136133" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4136133" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=diseoswanais-100518040342-phpapp02&amp;stripped_title=diseo-sw-anais-4136133" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelolivan"&gt;miguelolivan&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;No tiene que ver con la temática usual del blog pero quizás pueda ser interesante contextualizar el experimento. Se trata de replicar el &lt;a href="http://en.wikipedia.org/wiki/DAMA/LIBRA"&gt;experimento DAMA&lt;/a&gt; que dio un resultado positivo en la búsqueda de candidatos a la materia oscura, pero &lt;a href="http://resonaances.blogspot.com/2010/04/more-trouble-with-dama.html"&gt;cuyos resultados son problemáticos en su interpretación&lt;/a&gt;, dado que detectores distintos que usan otro tipo de detección no han sido capaces de medir lo mismo. De ahí que el experimento deba repetirse independientemente, para corroborar que los resultados son similares. Para más información sobre &lt;a href="http://es.wikipedia.org/wiki/Materia_oscura"&gt;la materia oscura se puede leer la wikipedia&lt;/a&gt; y para profundizar más en lo que se hace en el el laboratorio de Canfranc: &lt;a href="http://www.unizar.es/acz/05Publicaciones/Revistas/Revista63/p041.pdf"&gt;"Dos décadas de búsqueda de materia oscura en el Laboratorio Subterráneo de Canfranc" de María Luisa Sarsa&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-186563273119871455?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/186563273119871455/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=186563273119871455' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/186563273119871455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/186563273119871455'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/05/diseno-del-software-de-adquisicion-de.html' title='Diseño del software de adquisición de datos para ANAIS'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1896567162421502561</id><published>2010-04-15T13:05:00.002+02:00</published><updated>2010-04-15T13:11:38.085+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc4.5'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Publicado GCC 4.5</title><content type='html'>&lt;a href="http://gcc.gnu.org/gcc-4.5/"&gt;GCC 4.5 acaba de ser publicado&lt;/a&gt;. En la &lt;a href="http://gcc.gnu.org/gcc-4.5/changes.html"&gt;lista de cambios&lt;/a&gt; se pueden leer las novedades de esta versión. De ellas las más visibles para los usuarios pueden ser las mejoras en el mostrado de errores como indicar la columna por defecto, evitar mostrar más errores en caso de falta de un fichero de inclusión o no mostrar los parámetros por defecto de las plantillas, con la ganancia de legibilidad que eso supondrá. Además viene con mejoras en las optimizaciones, en los lenguajes y plataformas soportadas y con &lt;a href="http://gcc.gnu.org/gcc-4.5/cxx0x_status.html"&gt;un gran avance en el soporte experimental de C++0x&lt;/a&gt; además de la inclusión en la rama principal del &lt;a href="http://gcc.gnu.org/wiki/plugins"&gt;sistema de plugins&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Al hilo del sistema de plugins ha surgido una acalorada discusión a raíz de una propuesta de &lt;a href="http://gcc.gnu.org/ml/gcc/2010-04/msg00171.html"&gt;incluir en un futuro por defecto el plugin DragonEgg en la distribución de GCC&lt;/a&gt;. &lt;a href="http://dragonegg.llvm.org/"&gt;DragonEgg&lt;/a&gt; en un plugin que reeemplaza las optimizaciones y la generación de código de GCC por las de &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La misma entrada y previsiblemente más comentarios en &lt;a href="http://softlibre.barrapunto.com/article.pl?sid=10/04/15/114213"&gt;Publicado GCC 4.5&lt;/a&gt; en barrapunto. Desde que estoy de editor por allí, por aquí se mueve menos la cosa. Espero que sepan perdonarme, pero no me olvido de este otro lugar :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1896567162421502561?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1896567162421502561/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1896567162421502561' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1896567162421502561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1896567162421502561'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/04/publicado-gcc-45.html' title='Publicado GCC 4.5'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5417015803900370041</id><published>2010-02-10T00:06:00.004+01:00</published><updated>2010-02-10T09:29:58.946+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='plug-in'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='Clang'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><title type='text'>Clang ya se autocompila y GCC ya tiene sus primeros plugins</title><content type='html'>Como puede leer en el &lt;a href="http://blog.llvm.org/2010/02/clang-successfully-self-hosts.html"&gt;blog de LLVM/Clang&lt;/a&gt;, el compilador con &lt;a href="http://en.wikipedia.org/wiki/University_of_Illinois/NCSA_Open_Source_License"&gt;licencia similar a la BSD&lt;/a&gt; patrocinado por Apple:&lt;br /&gt;&lt;blockquote&gt;¡Clang ha completado su primera &lt;a href="http://en.wikipedia.org/wiki/Self-hosting"&gt;autocompilación&lt;/a&gt;! Hemos compilado toda la &lt;a href="http://en.wikipedia.org/wiki/Low_Level_Virtual_Machine"&gt;LLVM&lt;/a&gt; y el propio &lt;a href="http://en.wikipedia.org/wiki/Clang"&gt;Clang&lt;/a&gt; con Clang, unas 550k líneas de código en C++. Los binarios resultantes han pasado todos los test de regresión y el Clang resultante puede además generar toda la LLVM y Clang de nuevo. Este tercer Clang resultó plenamente funcional completando así el &lt;a href="http://en.wikipedia.org/wiki/Bootstrapping_(compilers)"&gt; &lt;i&gt;bootstraping&lt;/i&gt; &lt;/a&gt;.&lt;/blockquote&gt;Más comentarios en &lt;a href="http://www.osnews.com/story/22838/LLVM_Clang_Successfully_Self-Hosts_"&gt;OSNews&lt;/a&gt; y &lt;a href="http://www.reddit.com/r/programming/comments/ayaoi/clang_successfully_selfhosts/"&gt;reddit&lt;/a&gt;. En noticias relacionadas, &lt;a href="//softlibre.barrapunto.com/article.pl?sid=09/01/29/1121248&amp;tid=30"&gt;el sistema de plugins de GCC&lt;/a&gt; va dando sus frutos y la fundación Mozilla ha desarrollado &lt;a href="https://developer.mozilla.org/En/Dehydra"&gt;Dehydra&lt;/a&gt; y &lt;a href="https://developer.mozilla.org/En/Treehydra"&gt;Treehydra&lt;/a&gt;, unos &lt;a href="http://lwn.net/Articles/370717/"&gt;plugins para hacer análisis estático de código C++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/article.pl?sid=10/02/09/2149250"&gt;La misma entrada y espero que más comentarios en &lt;em&gt;Clang ya se autocompila&lt;/em&gt; en barrapunto&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5417015803900370041?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5417015803900370041/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5417015803900370041' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5417015803900370041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5417015803900370041'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2010/02/clang-ya-se-autocompila-y-gcc-ya-tiene.html' title='Clang ya se autocompila y GCC ya tiene sus primeros plugins'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4486571126191653840</id><published>2009-12-23T22:32:00.005+01:00</published><updated>2009-12-24T13:38:20.962+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arranque'/><category scheme='http://www.blogger.com/atom/ns#' term='OSX'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OSX'/><category scheme='http://www.blogger.com/atom/ns#' term='triple arranque'/><category scheme='http://www.blogger.com/atom/ns#' term='triple'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows XP'/><category scheme='http://www.blogger.com/atom/ns#' term='MacMini'/><title type='text'>Triple arranque en un MacMini</title><content type='html'>Pues conseguí un MacMini basado en Intel de 80 Gb y lo primero que decidí hacer es ponerle tres sistemas operativos ¿Para qué dejarse opciones? El caso es que instalar dos es más o menos fácil, basta con mirar el documento que describe como usar el asistente de BootCamp y/o alguna guía de cómo instalar linux en un MacIntel. Pero instalar tres no es tan sencillo, si uno de ellos es Windows (XP) y existen una serie de sutilezas con las que me he encontrado que quizás le viene bien saber a alguien que busque "por ahí" soluciones.&lt;br /&gt;&lt;br /&gt; - Windows (XP al menos) sólo se instala bien en la última partición&lt;br /&gt; - Windows (XP al menos) sólo se instala bien si existen menos de cuatro particiones&lt;br /&gt;&lt;br /&gt;Bajo estas dos premisas, el particionado del sistema da muy poco juego, sabiendo que &lt;a href="http://es.wikipedia.org/wiki/Tabla_de_partici%C3%B3n_GUID"&gt;GPT&lt;/a&gt; ya crea una que no se puede obviar. Los pasos, muy resumidos, que he seguido para dejarlo funcionando con triple arranque:&lt;br /&gt;&lt;br /&gt; - Instalar OSX&lt;br /&gt; - Ejecutar el asistente de BootCamp&lt;br /&gt; - Instalar &lt;a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAoQFjAA&amp;url=http%3A%2F%2Frefit.sourceforge.net%2F&amp;ei=-YoyS6imJpiqjAf41bifBw&amp;usg=AFQjCNEA3P6D87LPFNxSsnCoYf_ps0po3Q&amp;sig2=UkMajx19mJUtoaeYoNSzhQ"&gt;rEFIt&lt;/a&gt;&lt;br /&gt; - Reparticionar para dejar cuatro particiones&lt;br /&gt; - Instalar windows en la última&lt;br /&gt; - Instalar Linux en la penúltima, instalar grub&lt;br /&gt; - Editar desde OSX el fichero &lt;a href="http://refit.sourceforge.net/doc/c3s3_config.html"&gt;refit.conf&lt;/a&gt; para que no arranque por defecto OSX&lt;br /&gt; - En Debian al menos no instala por defecto un par de módulos que, en un equipo de estas características puede estar bien para monitorizar la temperatura y la velocidad del ventilador: applesmc y coretemp. Metiéndolos en /etc/modules se soluciona.&lt;br /&gt;&lt;br /&gt;Para todo el proceso he seguido varios enlaces, pero los más importantes son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://giingo.org/bitacora/pivot/entry.php?id=326"&gt; Linux en un Mac Mini (Intel Core Duo)&lt;/a&gt; que va bastante bien si solo quieres instalar Linux.&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.onmac.net/index.php/Triple_Boot_via_BootCamp"&gt;Triple Boot via BootCamp&lt;/a&gt; en donde se explica bastante bien todos los problemas que me había encontrado previamente y cómo solucionarlos, sobre todo el famoso &lt;tt&gt;cannot find hall.dll&lt;/tt&gt; que salía cuando trataba de instalar Windows en una partición que no era la última&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Bueno, en el camino he aprendido algo, aunque no demasiado, de &lt;a href="http://es.wikipedia.org/wiki/Extensible_Firmware_Interface"&gt;EFI&lt;/a&gt;, &lt;a href="http://es.wikipedia.org/wiki/Tabla_de_partici%C3%B3n_GUID"&gt;GTP&lt;/a&gt; y otras hierbas. Quizás haya alguien que encuentre algún error, omisión, que le resulte útil o que quiera añadir algo...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/33585"&gt;La misma entrada y algún comentario más en &lt;em&gt;Triple arranque en un MacMini&lt;/em&gt; en barrapunto&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4486571126191653840?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4486571126191653840/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4486571126191653840' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4486571126191653840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4486571126191653840'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/12/triple-arranque-en-un-macmini.html' title='Triple arranque en un MacMini'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-687331825973261502</id><published>2009-09-12T00:16:00.004+02:00</published><updated>2009-09-12T08:27:58.548+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FriendFeed'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='no bloqueante'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='servidor web'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Facebook publica Tornado, servidor web usado en FriendFeed</title><content type='html'>Como cuentan en &lt;a href="http://lwn.net/Articles/352056/"&gt;LWN&lt;/a&gt;, &lt;a href="http://developers.facebook.com/news.php?blog=1&amp;story=301&amp;_fb_noscript=1"&gt;Facebook ha anunciado el lanzamiento de su servidor web Tornado bajo la licencia Apache&lt;/a&gt;. &lt;a href="http://www.tornadoweb.org/"&gt;Tornado&lt;/a&gt; es un servidor Web &lt;a href="http://en.wikipedia.org/wiki/Non-blocking_I/O"&gt;no bloqueante&lt;/a&gt; escrito en Python, diseñado para gestionar miles de conexiones simultáneas, lo que lo hace ideal para servicios Web de "tiempo real". Tornado es la pieza central de la infraestructura de "tiempo real" de &lt;a href="http://friendfeed.com/"&gt;FriendFeed&lt;/a&gt;, que tienen previsto mantener activamente. Tornado es similar a "frameworks" Web ya existentes (&lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt;, &lt;a href="http://code.google.com/appengine/"&gt;webapp de Google&lt;/a&gt;, &lt;a href="http://webpy.org/"&gt;web.py&lt;/a&gt;) pero se centra en &lt;a href="http://bret.appspot.com/entry/tornado-web-server"&gt;la velocidad y en manejar grandes cantidades de tráfico simultáneo&lt;/a&gt;. El código se puede obtener de &lt;a href="http://www.tornadoweb.org/"&gt;tornadoweb.org&lt;/a&gt;. Lo comentan también en &lt;a href="http://www.reddit.com/r/programming/comments/9j8yp/facebook_opensources_friendfeeds_python_web/"&gt;reddit&lt;/a&gt;, &lt;a href="http://developers.slashdot.org/story/09/09/11/0256233/Facebook-Releases-Open-Source-Web-Server?from=rss"&gt;Slashdot&lt;/a&gt; y &lt;a href="http://news.ycombinator.com/item?id=815665"&gt;Hacker News&lt;/a&gt; entre otros.&lt;br /&gt;&lt;br /&gt;Hay que recordar además que &lt;a href="http://yapw.blogspot.com/2008/12/facebook-publica-su-versin-modificada.html"&gt;Facebook publicó su versión modificada de memcached&lt;/a&gt;, después de haber &lt;a href="http://barrapunto.com/article.pl?sid=08/06/03/0015205"&gt;publicado parte de su código&lt;/a&gt;. También recordar que &lt;a href="http://barrapunto.com/article.pl?sid=09/08/10/2017235"&gt;hace poco más de un mes que Facebook ha adquirido Friendfeed&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://softlibre.barrapunto.com/article.pl?sid=09/09/11/2157220"&gt;Más comentarios en &lt;em&gt;Facebook publica Tornado, servidor web usado en FriendFeed&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-687331825973261502?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/687331825973261502/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=687331825973261502' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/687331825973261502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/687331825973261502'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/09/facebook-publica-tornado-servidor-web.html' title='Facebook publica Tornado, servidor web usado en FriendFeed'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-316990514998847811</id><published>2009-07-27T23:31:00.002+02:00</published><updated>2009-07-27T23:35:07.672+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='conceptos'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='excepciones'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='diff'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='bindiff'/><title type='text'>Enlaces varios (VI)</title><content type='html'>Hace muchos días que no he podido escribir por aquí, así que quizás a alguien le pueda parecer interesante el &lt;em&gt;dump&lt;/em&gt; de cosas que tenía &lt;a href="http://www.google.com/reader/shared/08374875025225505515"&gt;semi-guardadas&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sobre el lío de la eliminación de los conceptos en el borrador C++0x y su retraso en general: &lt;ul&gt;&lt;li&gt;&lt;a  href="http://herbsutter.wordpress.com/2009/07/21/trip-report/"&gt;'Trip Report: Exit Concepts, Final ISO C++ Draft in ~18 Months' de Herb Sutter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ddj.com/architect/218600111"&gt;'The C++0x "Remove Concepts" Decision' de Bjarne Stroustrup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;También en &lt;a href="http://tech.slashdot.org/story/09/07/23/1817225/Stroustrup-Says-New-C-Standard-Delayed-Until-2010-Or-Later"&gt;Slashdot&lt;/a&gt; y &lt;a href="http://www.reddit.com/r/programming/comments/92tnd/concepts_removed_from_c0x/"&gt;reddit&lt;/a&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html"&gt;Smaller is Faster (and Safer Too)&lt;/a&gt;. De cómo chromium se auto-parchea con diferencias binarias.&lt;/li&gt;&lt;li&gt;&lt;a href="http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/to/~3/5GHlbSt87cU/Tech-Or-Management-Beyond-Age-39"&gt;Tech Or Management Beyond Age 39?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Dos sobre concurrencia y excepciones: &lt;a href="http://herbsutter.wordpress.com/2009/06/23/answering-email-about-error-handling-in-concurrent-code/"&gt;'Answering email about error handling in concurrent code' de Herb Sutter&lt;/a&gt; y &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,652962f1-5073-49a4-b233-9ca24b494742.aspx"&gt;'Concurrency and exceptions' de Joe Duffy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/32802"&gt;La misma noticia y más comentarios en &lt;em&gt;Enlaces varios (VI)&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-316990514998847811?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/316990514998847811/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=316990514998847811' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/316990514998847811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/316990514998847811'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/07/enlaces-varios-vi.html' title='Enlaces varios (VI)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-2406545680858133939</id><published>2009-06-25T23:25:00.006+02:00</published><updated>2009-06-26T09:18:41.932+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win32'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc4.4'/><category scheme='http://www.blogger.com/atom/ns#' term='excepciones'/><title type='text'>MinGW publica GCC 4.4.0</title><content type='html'>El equipo de &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt; ha publicado &lt;a href="http://sourceforge.net/project/shownotes.php?release_id=691876"&gt;los binarios de GCC 4.4.0 para Windows&lt;/a&gt;. De entre las novedades destacan un mejor tratamiento de excepciones, una versión de libstdc++ en forma de librería compartida, y soporte para &lt;a href="http://en.wikipedia.org/wiki/Thread-local_storage"&gt;TLS (thread-local storage)&lt;/a&gt;, además de todas las novedades de &lt;a href="http://gcc.gnu.org/gcc-4.4/"&gt;la versión 4.4.0&lt;/a&gt;. Hay que recordar que la anterior versión soportada oficialmente era GCC 3.4.5. Más en &lt;a href="http://www.reddit.com/r/programming/comments/8v5dz/mingw_updates_to_gcc_440/"&gt;reddit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El manejo de las excepciones ha mejorado drásticamente debido a que se ha usado una implementación basada en &lt;a href="http://en.wikipedia.org/wiki/DWARF"&gt;DWARF&lt;/a&gt;, dejando de lado el viejo modelo &lt;a href="http://en.wikipedia.org/wiki/Setjmp.h"&gt;SJLJ&lt;/a&gt;, que ya no estará disponible. Además con esta versión las excepciones ya pueden atravesar las fronteras de las DLL sin problemas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/article.pl?sid=09/06/25/2121226"&gt;La misma noticia y más comentarios en &lt;em&gt;MinGW publica GCC 4.4.0&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-2406545680858133939?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/2406545680858133939/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=2406545680858133939' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2406545680858133939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2406545680858133939'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/06/mingw-publica-gcc-440.html' title='MinGW publica GCC 4.4.0'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1909560237886703182</id><published>2009-05-26T22:40:00.003+02:00</published><updated>2009-05-26T23:51:23.511+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='memcpy'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción no perfecta'/><category scheme='http://www.blogger.com/atom/ns#' term='capas'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción'/><title type='text'>memcpy y la concurrencia</title><content type='html'>Si el otro día comentaban en barrapunto que &lt;a href="http://barrapunto.com/article.pl?sid=09/05/15/2146205"&gt;en MS marcaban como peligroso el uso de &lt;tt&gt;memcpy&lt;/tt&gt;&lt;/a&gt; hoy podemos encontrar otra razón para usarlo con precaución. En &lt;a href="http://blogs.sun.com/dave/entry/memcpy_concurrency_curiosities"&gt;memcpy() concurrency curiosities&lt;/a&gt; David Dice habla de un comportamiento antiintuitivo de dicha función que sale a la luz en entornos fuertemente concurrentes: sobreescribir la misma secuencia constante en memoria puede tener valores no válidos temporalmente durante su llamada, leídos por otros threads con resultado catastrófico si no se tiene cuidado. Otro caso más en el que &lt;a href="http://yapw.blogspot.com/2008/05/demasiadas-capas-de-abstraccin.html"&gt;las abstracciones que usamos evolucionan a su manera&lt;/a&gt;, quizás con explicación pero con resultados que contradicen la intuición y exigen, a veces, conocer que se cuece allá abajo. (No mucho) más en &lt;a href="http://www.reddit.com/r/programming/comments/8n8we/memcpy_concurrency_curiosities/"&gt;reddit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/32465"&gt;La misma entrada y más comentarios en &lt;em&gt;memcpy y la concurrencia&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1909560237886703182?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1909560237886703182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1909560237886703182' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1909560237886703182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1909560237886703182'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/05/memcpy-y-la-concurrencia.html' title='memcpy y la concurrencia'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3846353203461199018</id><published>2009-05-05T19:48:00.002+02:00</published><updated>2009-05-05T21:48:14.392+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='C++09'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc4.4'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual C++'/><category scheme='http://www.blogger.com/atom/ns#' term='VC10'/><category scheme='http://www.blogger.com/atom/ns#' term='VC++'/><title type='text'>Avances en las implementaciones de C++0x</title><content type='html'>Por lo que he leído hace un tiempo y ahora puedo comentar aquí, tanto gcc como VC++ se están &lt;em&gt;poniendo las pilas&lt;/em&gt; en la implementación de &lt;a href="http://en.wikipedia.org/wiki/C++0x"&gt;C++0x&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vía &lt;a href="http://icewinddale.blogspot.com/2009/04/qt-451-y-gcc-44.html"&gt;Drizzt, Qt 4.5.1 y gcc 4.4&lt;/a&gt; leo que &lt;a href="http://gcc.gnu.org/gcc-4.4/changes.html"&gt;entre las más notables novedades de gcc4.4 se incluyen muchas características del C++0x&lt;/a&gt;, entre las cuales están declaraciones con &lt;tt&gt;auto&lt;/tt&gt; y la inicialización de objetos con listas. Bien :) Se puede saber más en la página de status de la implementación de &lt;a href="http://gcc.gnu.org/gcc-4.4/cxx0x_status.html"&gt;c++0x en gcc 4.4&lt;/a&gt; donde se puede ver que la concurrencia no es una de las características más adelantadas, empezando por el modelo de memoria. Tiempo al tiempo...&lt;/li&gt;&lt;li&gt;En VC++ también van a buen ritmo, lo cual es bueno para el estándar, no como pasó con el VC++6 de infausto recuerdo y larga duración :). En &lt;a href="http://blogs.msdn.com/vcblog/archive/2009/04/22/decltype-c-0x-features-in-vc10-part-3.aspx"&gt; el blog oficial de &lt;em&gt;VisualC&lt;/em&gt; hablan de decltype (C++0x Features in VC10, Part 3)&lt;/a&gt; repasando &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf"&gt;esa característica de C++0x&lt;/a&gt; que por cierto ya está implementada también en gcc. Además apuntan a las dos entradas anteriores, que también resultan instructivas &lt;a href="http://blogs.msdn.com/vcblog/archive/2008/10/28/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx"&gt;Lambdas, auto, and static_assert: C++0x Features in VC10, Part 1&lt;/a&gt; y &lt;a href="http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx"&gt;Rvalue References: C++0x Features in VC10, Part 2&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Y ya que estamos en el tema dos enlaces de propina: &lt;a href="http://www.justsoftwaresolutions.co.uk/files/designing_mt_programs.pdf"&gt;Designing Multithreaded Programs in C++0x de Anthony Williams&lt;/a&gt; y &lt;a href="http://blog.cplusplus-soup.com/2009/03/gcc-c0x-features-exploration.html"&gt;GCC C++0x Features Exploration en C++ Soup!&lt;/a&gt; y por supuesto la imprescindible wikipedia que tiene un estupendo punto de entrada: &lt;a href="http://en.wikipedia.org/wiki/C++0x"&gt;C++0x&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/32316"&gt;La misma entrada y más comentarios en &lt;em&gt;Avances en las implementaciones de C++0x&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3846353203461199018?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3846353203461199018/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3846353203461199018' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3846353203461199018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3846353203461199018'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/05/avances-en-las-implementaciones-de-c0x.html' title='Avances en las implementaciones de C++0x'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5654573397901275010</id><published>2009-04-20T23:04:00.006+02:00</published><updated>2009-04-21T09:56:20.379+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bloggers'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='bitácoras'/><category scheme='http://www.blogger.com/atom/ns#' term='blogstar'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Bitácoras de Programación: selección personal</title><content type='html'>Llego tarde a la discusión generada con &lt;a href="http://barrapunto.com/~leonidas/journal/32205"&gt; la entrada en la bitácora de leonidas en barrapunto&lt;/a&gt; que &lt;a href="http://preguntas.barrapunto.com/article.pl?sid=09/04/17/121245"&gt;rvr pasó a portada&lt;/a&gt; acerca de blogs y feeds en general relacionados con la programación. Salen por supuesto muchos de los agregadores y planetas que consumo, como &lt;a href="http://www.reddit.com/r/programming/"&gt;reddit&lt;/a&gt;, &lt;a href="http://news.ycombinator.com/news"&gt;hacker news&lt;/a&gt; (uhmm, éste no sale), &lt;a href="http://www.dzone.com"&gt;dzone&lt;/a&gt; o &lt;a href="http://www.planetacodigo.com/"&gt;planeta código&lt;/a&gt;. Pero después de leer todas las respuestas me ha entrado la "necesidad" de hacer mi propia selección personal basada únicamente en gustos. Son bloggers que creo que son un poco distintos y, en su mayor parte combinan &lt;em&gt;el bloguerío&lt;/em&gt; con un alto nivel técnico que dejan ver el sus posts. Allá van:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mbpfernand0.wordpress.com/"&gt;Mbpfernand0's Blog&lt;/a&gt;, el nuevo blog técnico de "nuestro" &lt;a href="http://barrapunto.com/~fernand0/"&gt;fernand0&lt;/a&gt;. El tema fundamental es la programación y la seguridad, aunque creo que no hace ningún asco a temas relacionados. Por cierto, que &lt;a href="http://mbpfernand0.wordpress.com/2009/04/20/bitacoras-interesantes-de-programacion-i/"&gt;promete su propia selección de blogs sobre programación&lt;/a&gt;. Habrá que estar atento.&lt;/li&gt;&lt;li&gt;&lt;a href="http://icewinddale.blogspot.com/"&gt;El valle del Viento Helado  de Drizzt&lt;/a&gt;, el &lt;a href="http://barrapunto.com/~Drizzt/journal/"&gt;Drizzt de barrapunto&lt;/a&gt; también. Sistemas operativos, compiladores, administración y seguridad. Muy interesante.&lt;/li&gt;&lt;li&gt;&lt;a href="http://geeks.ms/blogs/rfog/default.aspx"&gt;.NET o no .NET, esa es la cuestión&lt;/a&gt;. Puedes no compartir sus preferencias tecnológicas, pero para mi es uno de los que mejor escribe y destila conocimiento y experiencia por todos los bits.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En inglés:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://intertwingly.net/blog/"&gt;intertwingly de Sam Ruby&lt;/a&gt;. La web y sus estándares. Para mí, imprescindible.&lt;/li&gt;&lt;li&gt;&lt;a href="http://jeffr-tech.livejournal.com/"&gt;jeffr_tech's Journal&lt;/a&gt;. Detalles internos del desarrollo de FreeBSD. No actualiza mucho pero merece la pena estar suscrito.&lt;/li&gt;&lt;li&gt;&lt;a href="http://daniel.haxx.se/blog/"&gt;daniel.haxx.se de Daniel Stenberg&lt;/a&gt;. Del autor de &lt;a href="http://curl.haxx.se/"&gt;curl&lt;/a&gt; y &lt;a href="http://www.rockbox.org/"&gt;Rockbox&lt;/a&gt; &lt;a href="http://daniel.haxx.se/projects/"&gt;entre otros&lt;/a&gt;, el blog de un desarrollador prolífico.&lt;/li&gt;&lt;li&gt;&lt;a href="http://codingrelic.geekhold.com/"&gt;Coding Relic de Denton Gentry&lt;/a&gt;. Normalmente sobre Software embebido, pero toca otros palos.&lt;/li&gt;&lt;li&gt;&lt;a href="http://udrepper.livejournal.com/"&gt;Ulrich Drepper&lt;/a&gt;. El blog del mantenedor de la glib. Poco prolífico, pero para no perderse ni una sola entrada.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nynaeve.net/"&gt;Nynaeve: Adventures in Windows debugging and reverse engineering.&lt;/a&gt; No se me ocurriría un mejor título nunca&lt;/li&gt;&lt;li&gt;Y por fin el imprescindible &lt;a href="http://herbsutter.wordpress.com/"&gt;Sutter’s Mill: Herb Sutter on software, hardware, and concurrency&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ahora no se me ocurre ninguno más, pero pueden ser las prisas...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; He publicado este texto más o menos &lt;a href="http://barrapunto.com/comments.pl?sid=80704&amp;cid=1140371"&gt;en un comentario&lt;/a&gt; por aquello de completar la información en su sitio. También lo pongo aquí y lo replicaré &lt;a href="http://barrapunto.com/~mig21/journal/32224"&gt;en mi bitácora en barrapunto&lt;/a&gt;, que a su vez se copiará en &lt;a href="http://planetacodigo.com/"&gt;planeta código&lt;/a&gt;, &lt;a href="http://fernand0.blogalia.com/historias/62592"&gt;por aquello de que lo que se replica queda y de que hay URLs que desaparecen&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5654573397901275010?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5654573397901275010/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5654573397901275010' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5654573397901275010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5654573397901275010'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/04/bitacoras-de-programacion-seleccion.html' title='Bitácoras de Programación: selección personal'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7684842718889024043</id><published>2009-03-17T22:42:00.003+01:00</published><updated>2009-03-17T23:47:50.888+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='SMP'/><category scheme='http://www.blogger.com/atom/ns#' term='multicore'/><category scheme='http://www.blogger.com/atom/ns#' term='TLS'/><category scheme='http://www.blogger.com/atom/ns#' term='OTP'/><category scheme='http://www.blogger.com/atom/ns#' term='noticias'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='WxWidgets'/><title type='text'>Erlang 5.7/OTP R13A: soporte para Unicode, mejoras en multicore y SSL</title><content type='html'>Acaba de salir la nueva versión del conjunto &lt;a href="http://erlang.org/"&gt;Erlang/OTP&lt;/a&gt;, en concreto la versión &lt;a href="http://www.erlang.org/doc/highlights.html"&gt;Erlang 5.7/OTP R13A&lt;/a&gt;. La nueva versión de un lenguaje y sus librerías no tiene por qué ser gran noticia, pero en este caso las novedades son tan notables que creo que merece una mención. Entre ellas se encuentran importantes mejoras de rendimiento en entornos multicore y SMP, que es especialmente importante teniendo en cuenta que una de las grandes bazas del lenguaje es su tratamiento de la concurrencia. Además destacan también el soporte para &lt;a href="http://es.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt;, posibilidad de usar &lt;a href="http://www.wxwidgets.org/"&gt;WxWidgets&lt;/a&gt; a través del WxErlang (de momento en beta) y reescritura del soporte para &lt;a href="http://es.wikipedia.org/wiki/Transport_Layer_Security"&gt;SSL&lt;/a&gt;. Muchas de estas características eran necesarias para la introducción de este lenguaje más allá del entorno de las telecomunicaciones que históricamente ha sido su nicho natural. Más comentarios en &lt;a href="http://www.reddit.com/r/programming/comments/85djx/erlangotp_r13a_released_unicode_multicore_and_ssl/"&gt;reddit&lt;/a&gt; y &lt;a href="http://news.ycombinator.com/item?id=520061"&gt;Hacker News&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/%7Emig21/journal/32026"&gt;La misma entrada y más comentarios en &lt;em&gt;Erlang 5.7/OTP R13A: soporte para Unicode, mejoras en multicore y SSL&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7684842718889024043?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7684842718889024043/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7684842718889024043' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7684842718889024043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7684842718889024043'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/03/erlang-57otp-r13a-soporte-para-unicode.html' title='Erlang 5.7/OTP R13A: soporte para Unicode, mejoras en multicore y SSL'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3959567982515342872</id><published>2009-03-11T23:44:00.008+01:00</published><updated>2009-03-12T00:06:42.411+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='djb'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='humildad'/><category scheme='http://www.blogger.com/atom/ns#' term='simplicidad'/><category scheme='http://www.blogger.com/atom/ns#' term='morarejas'/><category scheme='http://www.blogger.com/atom/ns#' term='dnsdjb'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='mantras'/><title type='text'>Aprendiendo de los errores (II)</title><content type='html'>&lt;a href="http://barrapunto.com/article.pl?sid=09/03/05/0653213"&gt;Dan J. Berstein reconoció una vulnerabilidad en djbdns y la recompensó con mil dólares&lt;/a&gt; y por supuesto no se han hecho esperar reflexiones acerca de la seguridad informática, su (im)posibilidad y su relación con lo disponible del código.&lt;br /&gt;&lt;br /&gt;Entonces leo con interés, vía &lt;a href="http://mbpfernand0.wordpress.com/2009/03/10/%c2%bfexisten-programas-sin-fallos-de-seguridad/"&gt;el nuevo &lt;em&gt;subarrapunto&lt;/em&gt; de fernand0&lt;/a&gt;, un &lt;a href="http://www.hispasec.com/unaaldia/3785"&gt;comentario en hispasec que no por evidente debe dejar de repetirse&lt;/a&gt;: no existe software sin fallos de seguridad, pero los que menos tienen son aquellos que han sido diseñados y programados desde su inicio con la seguridad y la simplicidad como guía.&lt;br /&gt;&lt;br /&gt;Y ello descarta a casi todo el software y probablemente más al comercial, que tiene más presiones para añadir más y más cosas. Recordemos, que como decía &lt;a href="http://yapw.blogspot.com/2009/02/epigramas-sobre-programacion.html"&gt;Alan J. Perlis &lt;em&gt;A la larga cualquier programa se vuelve rococó. Después escombros.&lt;/em&gt;&lt;/a&gt; Lo de siempre, funcionalidad contra robustez y simplicidad :)&lt;br /&gt;&lt;br /&gt;De todos modos el caso de djbdns es también interesante por el tipo de fallo encontrado. En &lt;a href="http://news.ycombinator.com/item?id=502651"&gt;Hacker News comentaban que el problema era en la implementación de la compresión que usa en el protocolo DNS para sus paquetes, para eliminar redundancias&lt;/a&gt;. Y precisamente &lt;a href="http://cr.yp.to/djbdns/notes.html"&gt;Bernstein había hablado negativamente del método de compresión&lt;/a&gt; (descrito, claro, en el &lt;a href="http://www.ietf.org/rfc/rfc1035.txt"&gt;RFC 1035, 4.1.4, página 30&lt;/a&gt;) Extractando de la crítica de Bernstein:&lt;blockquote&gt; &lt;br /&gt;Un problema con la compresión DNS es la cantidad de código necesario para analizarla. Localizar de modo fiable los nombres lleva un trabajo que habría sido evitable para una caché DNS. La compresión LZ77 habría sido mucho más fácil de implementar.&lt;br /&gt;&lt;br /&gt;Otro problema con la  compresión DNS es la cantidad de código necesario para generarlo correctamente. [...] &lt;br /&gt;&lt;br /&gt;Otro problema con la compresión DNS es que no es particularmente efectiva. LZ77 habría funcionado mejor en esos tipos de datos y funcionaría mejor con los tipos de registros que se popularizarían en el futuro [...]&lt;em&gt;(Y aquí habla de incompatibilidades de algunas versiones de BIND con el RFC)&lt;/em&gt;&lt;/blockquote&gt;Muy interesante todo el texto original, incluidas las elipsis ;) anque bastante específicas del caso DNS. Lo que no me ha quedado claro es la razón de no usar LZ77, si fue un caso de &lt;a href="http://en.wikipedia.org/wiki/Not_Invented_Here"&gt;Síndrome NIH&lt;/a&gt;, de &lt;em&gt;hackerismo&lt;/em&gt; o tenía algo que ver con las &lt;a href="http://en.wikipedia.org/wiki/LZW#Patents_and_accreditation"&gt;patentes sobre estos tipos de compresión que llevaban haciéndose desde 1984&lt;/a&gt; como la del &lt;a href="http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&amp;Sect2=HITOFF&amp;d=PALL&amp;p=1&amp;u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&amp;r=1&amp;f=G&amp;l=50&amp;s1=4464650.PN.&amp;OS=PN/4464650&amp;RS=PN/4464650"&gt;LZ78&lt;/a&gt;. Pero vamos como regla general parece mucho mejor usar un algoritmo conocido que inventar uno nuevo, a no ser que trabajes en eso, en innovar...&lt;br /&gt;&lt;br /&gt;Creo que la moraleja es clara, como se dice a veces exagerando &lt;a href="http://yapw.blogspot.com/2007/06/el-mejor-cdigo-es-el-que-no-existe.html"&gt;el mejor código es el que no existe&lt;/a&gt; sobre todo desde el punto de vista de la reducción de bugs y aún más si se trata de seguridad.&lt;br /&gt;&lt;br /&gt;(Esto se llama &lt;em&gt;Aprendiendo de los errores (II)&lt;/em&gt; porque ya escribí en su día &lt;a href="http://yapw.blogspot.com/2008/07/bugs-antiguos-y-moralejas.html"&gt;Bugs antiguos y moralejas &lt;/a&gt;, que iba sobre lo mismo, también salía DJB y el DNS, en aquel caso con el bug/error de diseño que explotó Kaminsky)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31994"&gt;La misma entrada y más comentarios en &lt;em&gt;Aprendiendo de los errores (II)&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3959567982515342872?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3959567982515342872/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3959567982515342872' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3959567982515342872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3959567982515342872'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/03/aprendiendo-de-los-errores-ii.html' title='Aprendiendo de los errores (II)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6778170496151641339</id><published>2009-02-26T20:24:00.007+01:00</published><updated>2009-02-27T11:12:33.513+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='menéame'/><category scheme='http://www.blogger.com/atom/ns#' term='reddit'/><category scheme='http://www.blogger.com/atom/ns#' term='noticias'/><category scheme='http://www.blogger.com/atom/ns#' term='Paul Graham Facts'/><category scheme='http://www.blogger.com/atom/ns#' term='promoción'/><category scheme='http://www.blogger.com/atom/ns#' term='promoción social'/><category scheme='http://www.blogger.com/atom/ns#' term='Paul Graham'/><category scheme='http://www.blogger.com/atom/ns#' term='digg'/><title type='text'>Lo que Paul Graham ha aprendido con Hacker News</title><content type='html'>&lt;a href="http://news.ycombinator.com/news"&gt;Hacker news&lt;/a&gt; es un sitio de envío y comentario de noticias muy al modo de &lt;a href="http://www.reddit.com/"&gt;reddit&lt;/a&gt; (o &lt;a href="http://digg.com/"&gt;digg&lt;/a&gt; o &lt;a href="http://meneame.net/"&gt;menéame&lt;/a&gt;), pero con temática muy definida (temática técnica, &lt;a href="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)"&gt;hacker en el sentido MIT&lt;/a&gt; ), con editores estrictos y con políticas severas de &lt;em&gt;ontopic&lt;/em&gt;. Pues Paul Graham, su creador ha escrito &lt;a href="http://www.paulgraham.com/hackernews.html"&gt;What I've Learned from Hacker News&lt;/a&gt;, o sea, lo que ha aprendido con el sitio. Se puede estar de acuerdo o en desacuerdo en algunas cosas, pero es sin duda interesante. Extracto, lo que me ha llamado la atención:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Recuerda, la motivación original pata Hacker News fue testear un lenguaje nuevo, uno centrado en experimentar con el diseño de lenguajes, no en el rendimiento. Cada vez que el sitio se vuelve lento, me refuerzo a mi mismo recordando la famosa cita de McIlroy y Bentley:&lt;blockquote&gt;La clave del rendimiento es la elegancia, no un batallón de casos especiales.&lt;/blockquote&gt;&lt;br /&gt;Y busco los cuellos de botella que puedo eliminar con menos código. Así he sido capaz de mantener un rendimiento mediocre a pesar de que el crecimiento se ha multiplicado por catorce.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Probablemente lo más importante que he aprendido acerca de la "disolución" es que se mide más por comportamiento que por usuarios. Es el mal comportamiento lo que hay que mantener alejado más que a las malas personas. El comportamiento de los usuarios es sorprendentemente maleable. Si se espera de la gente que se comporte bien tiende a hacerlo. Y viceversa.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Lo más peligroso de la portada son las que es demasiado fácil votar positivo. Si alguien prueba un nuevo teorema, le lleva tiempo al lector decidir si vota positivo o no.Un cómic divertido cuesta menos. Una crítica con un &lt;em&gt;slogan&lt;/em&gt; como título cuesta cero, porque la gente lo vota sin ni siquiera visitar el enlace.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;La forma más peligrosa de de comentario estúpido no es el argumento largo pero equivocado sino el chiste tonto. Los argumentos largos pero equivocados son bastante raros. Hay una gran correlación entre la calidad y la longitud del comentario.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[...]Visitar un foro &lt;em&gt;online&lt;/em&gt; sólo cuesta un clic y se parece mucho superficialmente a trabajar. Puedes estar gastando tu tiempo, pero no estás parado. &lt;a href="http://xkcd.com/386/"&gt;Alguien esta equivocado en Internet&lt;/a&gt;, y tú estás arreglando el problema.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Digg es conocido por su falta de trasparencia. La raíz del problema no son los tipos que llevan Digg sean especialmente furtivos, sino que usan un algoritmo equivocado para generar la portada. En lugar de subir conforme van teniendo más votos, como en Reddit, las historias empiezan arriba y las nuevas que van llegando las van empujando hacia abajo.&lt;br /&gt;&lt;br /&gt;La razón de la diferencia es que Digg deriva de Slashdot mientras que Reddit de delicious/popular. Digg es Slashdot con votos en lugar de editores y Reddit es delicious/popular con votos en lugar de &lt;em&gt;agregar a favoritos&lt;/em&gt; (Aún se pueden ver los fósiles de sus orígenes en sus diseños gráficos.)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Otra cosa que he aprendido de este experimento es que si vas a distinguir a las personas, hazlo bien. Este es uno de esos problemas en los que no funciona al prototipado rápido.&lt;br /&gt;&lt;br /&gt;De hecho este es el argumento intelectualmente honrado para no discriminar a varios tipos de personas. La razón no es que todo el mundo es igual, sino que es malo hacerlo de modo incorrecto y es difícil hacerlo bien.&lt;/blockquote&gt;Yo particularmente estoy de acuerdo en casi todo. Sólo puntualizaría que hay honrosas excepciones en la correlación entre longitud y calidad. Un enlace relevante, una cita, a veces es breve pero muy relevante en la discusión. De todos modos por eso habla de correlación :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31900"&gt;La misma entrada y más comentarios en &lt;em&gt;Lo que Paul Graham ha aprendido con Hacker News&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6778170496151641339?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6778170496151641339/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6778170496151641339' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6778170496151641339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6778170496151641339'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/02/lo-que-paul-graham-ha-aprendido-con.html' title='Lo que Paul Graham ha aprendido con Hacker News'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6076183250743052259</id><published>2009-02-17T13:01:00.003+01:00</published><updated>2009-02-17T22:31:22.153+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='principio de responsábilidad única'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='principios'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C'/><category scheme='http://www.blogger.com/atom/ns#' term='Sam Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>¿Varios pájaros de un tiro?</title><content type='html'>Vía &lt;a href="http://intertwingly.net/blog/2009/02/14/RDFa-in-HTML5"&gt;intertwingly, el blog de Sam Ruby&lt;/a&gt;, me encuentro con una &lt;a href="http://lists.w3.org/Archives/Public/public-rdf-in-xhtml-tf/2009Feb/0070.html"&gt;cita extraída de una de las listas del W3C&lt;/a&gt; que traduzco sin más:&lt;br /&gt;&lt;blockquote&gt;Un error muy común que los ingenieros de software cometen al diseñar una arquitectura es fijarse en cinco problemas, ver lo que tienen en común e intentar resolver los cinco a la vez. El resultado es casi siempre una solución por debajo de lo estándar para todos ellos.&lt;/blockquote&gt;&lt;br /&gt;Sí, una tendencia común, más acusada curiosamente en los desarrolladores que se intentan preocupar por la calidad de su trabajo. Para no caer inercialmente en ella habría que evaluar lo económico del desarrollo con lo limitado de las soluciones, algo que demasiadas veces no se hace.&lt;br /&gt;&lt;br /&gt;Me ha recordado además a un &lt;a href="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SingleResponsibilityPrinciple2_5F00_71060858.jpg"&gt;"cartel motivador"&lt;/a&gt; sobre el &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;principio de responsabilidad única&lt;/a&gt; que vi hace poco en &lt;a href="http://www.reddit.com/r/programming/comments/7ws12/motivational_posters_for_programmers/"&gt;reddit&lt;/a&gt; (&lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx"&gt;Aquí se pueden ver todos los carteles&lt;/a&gt;, por si a alguien le son de utilidad &lt;a href="http://xkcd.com/541/"&gt;:)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ah, ya que estoy aquí, recomiendo la lectura del blog de Sam y de las listas relativas al &lt;a href="http://en.wikipedia.org/wiki/HTML_5"&gt;HTML5&lt;/a&gt; para ver &lt;em&gt;flames&lt;/em&gt; de altura :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización &lt;a href="http://fernand0.blogalia.com/historias/3033"&gt;egórica&lt;/a&gt;:&lt;/strong&gt; A través de una detección automática de referencias Sam se ha enterado de mi enlace y le ha gustado mi referencia al "cartel motivador", que le da más argumentos en el flame. &lt;a href="http://intertwingly.net/blog/2009/02/14/RDFa-in-HTML5#c1234898405"&gt;Y me ha enlazado en un comentario&lt;/a&gt;. Nunca lo hubiera pensado :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31824"&gt;La misma entrada y más comentarios en &lt;em&gt;¿Varios pájaros de un tiro?&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6076183250743052259?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6076183250743052259/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6076183250743052259' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6076183250743052259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6076183250743052259'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/02/varios-pajaros-de-un-tiro.html' title='¿Varios pájaros de un tiro?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-9097789141117137753</id><published>2009-02-05T23:02:00.004+01:00</published><updated>2009-02-06T09:08:09.542+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='Epigramas'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='frases'/><title type='text'>Epigramas sobre programación</title><content type='html'>Siguiendo un enlace en &lt;a href="http://www.technovelty.org/code/complexity.html"&gt; technovelty&lt;/a&gt; he llegado a &lt;a href="http://www-pu.informatik.uni-tuebingen.de/users/klaeren/epigrams.html"&gt;un artículo de Alan J. Perlis&lt;/a&gt; en el que a través de ciento treinta &lt;a href="http://es.wikipedia.org/wiki/Epigrama"&gt;epigramas&lt;/a&gt; trató, en 1982, de capturar algunos de los aspectos más curiosos, desconcertantes y antiintuitivos de la computación en general y la programación en particular. Han pasado más de veintiséis años, pero mucha de su naturaleza creo que sigue intacta. Algunos creo haberlos leído en otra parte y supongo que al que lea esto le pueden sonar, pero me gustan, así que aquí van. Traduzco los que me han parecido mejores:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;strong&gt;Epigramas:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;7. Es más fácil escribir un programa incorrecto que entender uno correcto.&lt;br /&gt;&lt;br /&gt;8. Un lenguaje de programación es de bajo nivel cuando sus programas requieren atención sobre lo irrelevante.&lt;br /&gt;&lt;br /&gt;9. Es mejor tener 100 funciones operando sobre una estructura de datos que 10 funciones sobre 10 estructuras de datos.&lt;br /&gt;&lt;br /&gt;14. A la larga cualquier programa se vuelve rococó. Después escombros.&lt;br /&gt;&lt;br /&gt;15. Todo debería desarrollarse &lt;a href="http://es.wikipedia.org/wiki/Top-down_y_Bottom-up"&gt;de arriba a abajo&lt;/a&gt;, excepto la primera vez.&lt;br /&gt;&lt;br /&gt;17. Si alguien parece que está asintiendo cuando le explicas tu programa, despiértale.&lt;br /&gt;&lt;br /&gt;19. Si un lenguaje no cambia el modo en el que ves la programación es que no merece la pena.&lt;br /&gt;&lt;br /&gt;21. La optimización dificulta la evolución.&lt;br /&gt;&lt;br /&gt;31. La simplicidad no precede a la complejidad, la sigue.&lt;br /&gt;&lt;br /&gt;40. Hay dos modos de escribir programas sin errores. Sólo la tercera funciona.&lt;br /&gt;&lt;br /&gt;57. Es más fácil cambiar la especificación para que se ajuste al programa que al contrario.&lt;br /&gt;&lt;br /&gt;58. Los locos ignoran la complejidad. Los pragmáticos la sufren. Algunos pueden evitarla. Los genios la eliminan.&lt;br /&gt;&lt;br /&gt;63. En computación, los invariantes son efímeros.&lt;br /&gt;&lt;br /&gt;65. No te equivoques: los ordenadores procesan números, no símbolos. Medimos nuestro conocimiento (y control) de una actividad en la medida en la que podemos &lt;em&gt;arimetizar&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;75. Debido a su vitalidad la informática está a la busca desesperada de nuevos clichés: la banalidad calma nuestros nervios.&lt;br /&gt;&lt;br /&gt;93. Cuando alguien diga "Quiero un lenguaje de programación en el que sólo tenga que decir lo que deseo hacer", regálale una piruleta.&lt;br /&gt;&lt;br /&gt;95. No tengas buenas ideas si no eres capaz de responsabilizarte de ellas.&lt;br /&gt;&lt;br /&gt;104. La prueba del valor de un sistema es su existencia.&lt;br /&gt;&lt;br /&gt;115. Mucha gente encuentra el concepto de programar obvio, pero hacerlo les resulta imposible.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MetaEpigramas:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;124. Los epigramas son macros, porque son ejecutados en tiempo de lectura.&lt;br /&gt;&lt;br /&gt;125. Los epigramas cristalizan incongruencias.&lt;br /&gt;&lt;br /&gt;127. Los epigramas desdeñan los detalles y lo hacen con intención: son una documentación de alto nivel excelente.&lt;br /&gt;&lt;/blockquote&gt;El lector atento verá que si se juntan la 8 y la 93 no existen lenguajes de alto nivel. Pero si se mezcla con la 125 ya no está tan claro. Bueno, para pensar un rato. Pero no demasiado, que luego hay que codificar :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31729"&gt;La misma entrada y más comentarios en &lt;em&gt;Epigramas sobre programación&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-9097789141117137753?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/9097789141117137753/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=9097789141117137753' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/9097789141117137753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/9097789141117137753'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/02/epigramas-sobre-programacion.html' title='Epigramas sobre programación'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-2268099880630430095</id><published>2009-02-04T10:14:00.002+01:00</published><updated>2009-02-04T10:18:11.426+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bloggers'/><category scheme='http://www.blogger.com/atom/ns#' term='¿programación?'/><category scheme='http://www.blogger.com/atom/ns#' term='blogueros'/><category scheme='http://www.blogger.com/atom/ns#' term='¿humor?'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='blogstar'/><category scheme='http://www.blogger.com/atom/ns#' term='¿programadores?'/><category scheme='http://www.blogger.com/atom/ns#' term='parodia'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='autorreferencia'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>5 Secrets To Ninja Writing</title><content type='html'>&lt;a href="http://blog.wekeroad.com/blog/nothing-to-say/"&gt;5 Secrets To Ninja Writing&lt;/a&gt;. (&lt;a href="http://www.reddit.com/r/programming/comments/7un0f/5_secrets_to_ninja_writing_a_satire_of/"&gt;Vía reddit&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Es mucho más recomendable pinchar en el enlace anterior si conoces &lt;a href="http://www.codinghorror.com/blog/"&gt;el blog de Jeff Atwood, Coding Horror&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Está muy logrado, sobre todo la parodia del abuso de la autorreferencia, un vicio muy de &lt;em&gt;blogstar&lt;/em&gt;, muy feo :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31710"&gt;La misma entrada y más comentarios en &lt;em&gt;5 Secrets To Ninja Writing&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-2268099880630430095?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/2268099880630430095/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=2268099880630430095' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2268099880630430095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2268099880630430095'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/02/5-secrets-to-ninja-writing.html' title='5 Secrets To Ninja Writing'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-2064799349435358426</id><published>2009-01-28T22:47:00.003+01:00</published><updated>2009-01-29T10:52:35.351+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plug-in'/><category scheme='http://www.blogger.com/atom/ns#' term='FSF'/><category scheme='http://www.blogger.com/atom/ns#' term='licencias'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='licencia'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><title type='text'>El sistema de plugins cada vez más cerca de GCC</title><content type='html'>Hace bastante tiempo que se viene discutiendo el porqué &lt;a href="http://lwn.net/Articles/301135/"&gt;de la falta de sistema de plugins en el compilador libre por excelencia, GCC&lt;/a&gt;. Al parecer el principal problema era &lt;i&gt;legal&lt;/i&gt;, es decir, el miedo fomentar la proliferación de &lt;i&gt;plugins&lt;/i&gt; propietarios. Pues bien, ya se ha establecido el marco de licencias que pueden regir ese sistema, que es &lt;a href="http://gcc.gnu.org/ml/gcc-announce/2009/msg00000.html"&gt;la nueva versión de la GCC Runtime Library Exception&lt;/a&gt; y con ello su desarrollo está cada vez más cerca. Además esta nueva versión de la licencia permitirá la actualización a la licencia &lt;a href="http://gplv3.fsf.org/"&gt;GPLv3&lt;/a&gt; de algunas librerías del propio GCC. &lt;a href="http://www.gnu.org/licenses/gcc-exception-faq.html"&gt;La FSF ha proporcionado un documento con las razones para esta licencia y las preguntas más frecuentes sobre ella&lt;/a&gt;. Más comentarios en &lt;a href="http://slashdot.org/article.pl?sid=09/01/27/223230"&gt;Slashdot: Plug-In Architecture On the Way For GCC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; &lt;a href="http://icewinddale.blogspot.com/"&gt;Drizzt&lt;/a&gt; se ha puesto de acuerdo, otra vez casualmente, para hablar del mismo tema, con algunos comentarios sobre el cambio de la licencia: &lt;a href="http://icewinddale.blogspot.com/2009/01/la-arquitectura-de-plugins-del-gcc-y.html"&gt;El valle del Viento Helado: La arquitectura de plugins del GCC y las licencias&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31658"&gt;La misma entrada y más comentarios en &lt;em&gt;El sistema de plugins cada vez más cerca de GCC&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-2064799349435358426?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/2064799349435358426/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=2064799349435358426' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2064799349435358426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2064799349435358426'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/01/el-sistema-de-plugins-cada-vez-mas.html' title='El sistema de plugins cada vez más cerca de GCC'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8000926882373455409</id><published>2009-01-14T22:13:00.003+01:00</published><updated>2009-01-15T18:12:15.511+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='extensiones'/><category scheme='http://www.blogger.com/atom/ns#' term='estándares'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='Postel'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Trucos gcc-céntricos y porqué no usarlos</title><content type='html'>En el estupendo blog &lt;a href="http://codingrelic.geekhold.com/"&gt;Coding Relic&lt;/a&gt; el autor, Denton Gentry, ha publicado recientemente dos trucos muy espectaculares pero &lt;tt&gt;gcc&lt;/tt&gt;céntricos. Bueno en realidad uno es específico de la &lt;a href="http://www.gnu.org/software/libc/"&gt;&lt;tt&gt;glibc&lt;/tt&gt;&lt;/a&gt; y el otro sí es &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html"&gt;una extensión de &lt;tt&gt;gcc&lt;/tt&gt;&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://codingrelic.geekhold.com/2008/12/printf-acular.html"&gt;printf-acular&lt;/a&gt; en el que se describe cómo personalizar &lt;tt&gt;printf&lt;/tt&gt; para que admita más tipos de datos que los que normalmente admite, en el ejemplo sacar direcciones MAC formateadas.&lt;/li&gt;&lt;li&gt;&lt;a href="http://codingrelic.geekhold.com/2009/01/variable-scoping-with-gcc.html"&gt;Variable Scoping with gcc&lt;/a&gt;, en el que se explica el (espectacular) funcionamiento de &lt;tt&gt;__attribute__(cleanup)&lt;/tt&gt;, que permite funcionalidades del tipo &lt;a href="http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization"&gt;RAII&lt;/a&gt; de C++&lt;/li&gt;&lt;/ul&gt;Y ahora, después de ver un par de extensiones tan útiles, potentes y elegantes es cuando me toca &lt;em&gt;desrecomendarlas&lt;/em&gt; :) Creo firmemente en el valor de los estándares y en desarrollar siempre en el nivel más estricto de estándar o visto de otro modo en el nivel más amplio de disponibilidad, siempre y cuando las soluciones sean comparables. Además, es bueno pensar en la gente que retocará el código y cabe la posibilidad de que si no se documenta resulte de sólo escritura. Yo sólo lo vería admisible en un &lt;em&gt;hack&lt;/em&gt; puntual documentado como mínimo con neones. No obstante, hay gente que no opina lo mismo como se puede leer en &lt;a href="http://icewinddale.blogspot.com/2008/11/uso-de-extensiones-del-gcc-en-linux.html"&gt;Uso de extensiones del GCC en (el kernel) Linux&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31526"&gt;La misma entrada y más comentarios en &lt;em&gt;Trucos gcc-céntricos y porqué no usarlos&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8000926882373455409?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8000926882373455409/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8000926882373455409' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8000926882373455409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8000926882373455409'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/01/trucos-gcc-cntricos-y-porqu-no-usarlos.html' title='Trucos gcc-céntricos y porqué no usarlos'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8246541395775223124</id><published>2009-01-07T10:34:00.003+01:00</published><updated>2009-01-07T11:50:53.497+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robustez'/><category scheme='http://www.blogger.com/atom/ns#' term='estándares'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='Postel'/><category scheme='http://www.blogger.com/atom/ns#' term='Dracón'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>La ley de Postel y los programadores</title><content type='html'>El otro día leí un comentario acerca de las diferencias en la admisión de parámetros entre los comandos en BSD y GNU. Según se comentaba, los segundos son menos estrictos y se tragan más cosas. El comentarista añadía sobre el comportamiento de la &lt;em&gt;GNU userland&lt;/em&gt;: &lt;em&gt;"me gusta a pesar del programador que hay en mi"&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Y, por lo que sea, me ha parecido muy revelador: a los programadores no nos gusta, desde un punto de vista egoísta, lo que nos supone &lt;a href="http://en.wikipedia.org/wiki/Robustness_Principle"&gt;la ley de Postel, el principio de robustez&lt;/a&gt;. Aquello de ser liberal con lo que se admite como válido da repelús. Y creo que hay más de un motivo:&lt;ul&gt;&lt;li&gt;Nos gusta la precisión. Si somos estrictos en lo que generamos ¿No vamos a exigir lo mismo?&lt;/li&gt;&lt;li&gt;Se suele generar más código para tener el cuenta el &lt;em&gt;ser liberal&lt;/em&gt;: más trabajo y más testeo&lt;/li&gt;&lt;li&gt;El comportamiento de nuestro soft no es tan rígido lo que choca con nuestro gusto por las especificaciones precisas, sencillas y breves.&lt;/li&gt;&lt;/ul&gt;Lo que a veces no vemos es que ser menos estricto mejora la robustez y eso al usuario final, como es normal, le encanta aunque le de igual si se es estricto, &lt;a href="http://yapw.blogspot.com/2007/05/postel-o-dracn.html"&gt;si Postel o Dracón&lt;/a&gt;, los estándares y todo lo demás.&lt;br /&gt;&lt;br /&gt;Este efecto se nota más en &lt;em&gt;ecosistemas&lt;/em&gt; heterogéneos con lo que la integración de ese software puede ser más fácil en entornos menos controlados. Así que otra cosa más a pensar antes de desarrollar ¿Nos compensará a la larga el esfuerzo de ser menos estrictos?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31462"&gt;La misma entrada y más comentarios en &lt;em&gt;La ley de Postel y los programadores&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8246541395775223124?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8246541395775223124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8246541395775223124' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8246541395775223124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8246541395775223124'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2009/01/la-ley-de-postel-y-los-programadores.html' title='La ley de Postel y los programadores'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1959268574443647493</id><published>2008-12-13T22:53:00.003+01:00</published><updated>2008-12-15T12:42:50.388+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TCP'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='caché'/><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='UDP'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Facebook publica su versión modificada de memcached</title><content type='html'>[Vía &lt;a href="http://www.reddit.com/r/programming/comments/7j6po/facebooks_memcached_on_github/"&gt;reddit&lt;/a&gt;] &lt;a href="http://www.facebook.com/note.php?note_id=39391378919"&gt;Facebook acaba de publicar su versión de memcached&lt;/a&gt;, el &lt;a href="http://www.danga.com/memcached/"&gt;sistema de cachés genéricas más usado en aplicaciones web&lt;/a&gt;, tras hacer modificaciones para afrontar sus necesidades de rendimiento y escalabilidad. Las modificaciones principales han sido entre otras la eliminación de un &lt;em&gt;buffer&lt;/em&gt; por conexión en favor de un &lt;em&gt;pool&lt;/em&gt;, reducción de bloqueos innecesarios para un mejor rendimiento en máquinas &lt;em&gt;multicore&lt;/em&gt; y el uso intensivo de UDP. El resultado final ha sido la posibilidad de gestionar 200.000 peticiones UDP por segundo con una latencia media de 173 microsegundos. Han subido los cambios a &lt;a href="http://github.com/fbmarc/facebook-memcached/tree/master"&gt;GitHub: facebook-memcached&lt;/a&gt; y esperan que los cambios sean incorporados al memcached oficial. Curiosamente hemos hablado recientemente por aquí de memcached en &lt;a href="http://yapw.blogspot.com/2008/11/un-vistazo-al-interior-de-memcached.html"&gt;Un vistazo al interior de memcached&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; Olvidé mencionar que habían toqueteado el kernel :/ &lt;a href="http://barrapunto.com/comments.pl?sid=79328&amp;cid=1108206"&gt;JAM hace muy bien resumen de esos &lt;em&gt;apaños&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;Parece relevante también comentar lo que dicen en &lt;a href="http://highscalability.com/strategy-facebook-tweaks-handle-6-time-many-memcached-requests"&gt;High Scalability sobre el memcached de Facebook y las conclusiones que se pueden sacar&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;A summary of potential strategies:&lt;ul&gt;&lt;li&gt;Profile everything. Problems are always specific. The understanding of the problem must be specific. The fix must be specific.&lt;/li&gt;&lt;li&gt;Burn profiling into your regression tests. Detect when and where performance tanks as a regular part of your build.&lt;/li&gt;&lt;li&gt;Use resources in proportion to what grows slowest. This requires multiplexing, but at least your resource usage is more predictable and bounded.&lt;/li&gt;&lt;li&gt;Batch work. When you have the CPU do all the work you possibly can in the quantum or the whole system grinds to a halt in processing overhead.&lt;/li&gt;&lt;li&gt;Do work and maintain resources per task. Otherwise locking for shared resources takes more and more time when there's less and less time to do the work that needs to be done.&lt;/li&gt;&lt;li&gt;Change algorithms. Sometimes you simply need to do things differently. Tweaking will only get you so far.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31329"&gt;La misma entrada y más comentarios en &lt;em&gt;Facebook publica su versión modificada de memcached&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1959268574443647493?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1959268574443647493/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1959268574443647493' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1959268574443647493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1959268574443647493'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/12/facebook-publica-su-versin-modificada.html' title='Facebook publica su versión modificada de memcached'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-9053605651261537159</id><published>2008-12-09T12:31:00.003+01:00</published><updated>2008-12-09T18:45:38.589+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='código como diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='Jack Reeves'/><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='Code as Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Reeves'/><category scheme='http://www.blogger.com/atom/ns#' term='código'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>El código fuente como documento definitivo del diseño</title><content type='html'>Se trata, cómo no, de &lt;a href="http://www.developerdotstar.com/mag/articles/reeves_design_main.html"&gt;Code as Design: Three Essays by Jack W. Reeves&lt;/a&gt;. Son unos ensayos muy ilustrativos de la naturaleza particular del desarrollo de software, que por usar la palabra diseño de un modo no usual acaban resultando muy polémicos, pero a mi me parecen más bien esclarecedores. Se recomienda leer enteros antes de opinar :P&lt;br /&gt;&lt;br /&gt;Suelo aprovechar cualquier mención para volver a enlazarlo y esta vez ha sido &lt;a href="http://gallir.wordpress.com/2008/12/08/los-problemas-derivados-del-abuso-de-las-analogias/"&gt;Ricardo Galli en "Los problemas derivados del abuso de las analogías"&lt;/a&gt; quien me da la oportunidad de volver a hacerlo :)&lt;br /&gt;&lt;br /&gt;Se ha hablado de ellos por aquí en &lt;a href="http://barrapunto.com/~mig21/journal/11259"&gt;El código fuente visto como diseño &lt;/a&gt; y &lt;a href="http://yapw.blogspot.com/2007/03/poo-el-cdigo-como-diseo-y-ms-cosas.html"&gt;POO, el código como diseño y más cosas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31298"&gt;La misma entrada y más comentarios en &lt;em&gt;El código fuente como documento definitivo del diseño&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-9053605651261537159?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/9053605651261537159/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=9053605651261537159' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/9053605651261537159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/9053605651261537159'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/12/el-cdigo-fuente-como-documento.html' title='El código fuente como documento definitivo del diseño'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-2255894356215904350</id><published>2008-11-27T11:36:00.005+01:00</published><updated>2008-11-27T15:15:06.358+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria transaccional'/><category scheme='http://www.blogger.com/atom/ns#' term='investigación'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='paralelismo'/><category scheme='http://www.blogger.com/atom/ns#' term='STM'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Memoria transaccional ¿Sólo un juguete para investigadores?</title><content type='html'>En &lt;a href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=558&amp;page=1"&gt;Software Transactional Memory: why is it only a research toy? de Calin Cascaval &lt;em&gt;et al.&lt;/em&gt;&lt;/a&gt; se repasan algunas de las razones por las que, tras unos años de investigación, la memoria transaccional no ha dado el salto para ser usada en otros entornos. Se nombran sobre todo razones de rendimiento, de usabilidad (semántica confusa) y de interacción con sistemas que no la usan. No obstante no todo el mundo se da por vencido y por ejemplo Larry O'Brien escribe en &lt;a href="http://www.knowing.net/PermaLink,guid,147fd2fc-591c-42e2-9dac-9be5caac252c.aspx"&gt;Cascaval et al.'s skepticism on transaction memory&lt;/a&gt; una visión un poco más optimista indicando que aún queda espacio para la investigación y la optimización. ¿Acabaremos usando &lt;a href="http://en.wikipedia.org/wiki/Software_transactional_memory"&gt;STM&lt;/a&gt; o morirá antes de nacer?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31224"&gt;La misma entrada y más comentarios en &lt;em&gt;Memoria transaccional ¿Sólo un juguete para investigadores?&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-2255894356215904350?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/2255894356215904350/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=2255894356215904350' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2255894356215904350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2255894356215904350'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/11/memoria-transacional-slo-un-juguete.html' title='Memoria transaccional ¿Sólo un juguete para investigadores?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3162931488134255399</id><published>2008-11-21T09:28:00.008+01:00</published><updated>2008-11-21T13:17:20.186+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='método científico'/><category scheme='http://www.blogger.com/atom/ns#' term='escepticismo'/><category scheme='http://www.blogger.com/atom/ns#' term='cuántica'/><category scheme='http://www.blogger.com/atom/ns#' term='divulgación'/><category scheme='http://www.blogger.com/atom/ns#' term='mecánica cuántica'/><category scheme='http://www.blogger.com/atom/ns#' term='reproducibilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='falsabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='cuerdas'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><category scheme='http://www.blogger.com/atom/ns#' term='universos paralelos'/><title type='text'>Universos paralelos, cuerdas y divulgación científica</title><content type='html'>Hay un debate, apasionante y por supuesto no resuelto acerca de cómo divulgar la ciencia, de cómo equilibrar la precisión de lo que se cuenta con lo entretenido de la forma.&lt;br /&gt;&lt;br /&gt;Pues bueno, a mi me parece que esto en la divulgación de la ciencia más básica es especialmente importante. Suele uno leer en periódicos, revistas y últimamente en blogs artículos sobre la teoría de cuerdas y sobre universos paralelos sin hacer la menor mención acerca de lo especulativo del asunto. Por eso me ha gustado mucho &lt;a href="http://asymptotia.com/2008/11/18/tales-from-the-industry-xxv-parallel-universes/"&gt;un apunte de Clifford Johnson en el que lo explica estupendamente&lt;/a&gt; (vía &lt;a href="http://www.math.columbia.edu/~woit/wordpress/?p=1208"&gt;Not Even Wrong de Peter Woit&lt;/a&gt;)  Habla de su participación en un programa de divulgación sobre &lt;em&gt;universos paralelos&lt;/em&gt;. Cito y "traduzco":&lt;br /&gt;&lt;blockquote&gt;Para ser sincero estoy un poco preocupado porque es un tema que puede ser aprovechado muy fácilmente por chiflados por personas sensatas por igual, y es, de diversos modos, alimento para mucha charlatanería y sinsentido místico. Cualquier programa de ciencia sobre este tipo de material tiene que ser doblemente -triplemente- cuidadoso, para no dar a la gente una excusa para decir que "los científicos han comprobado esto".&lt;br /&gt;&lt;br /&gt;¿Por qué estoy un poco preocupado? Bueno, yo no he visto un montaje final del espectáculo y y no me quiero exceder, pero un primer montaje en bruto que he podido ver sufre de un problema que estos programas pueden tener a veces: un conjunto de  científicos en activo muy cuidadosos al hacer comentarios acerca de lo que se conoce, de lo desconocido, de lo que es probable y de lo que es poco probable, y así sucesivamente, y después mucha de esa cautela puede ser socavada por la intercalación de sus observaciones con fragmentos del favorito de cualquier cineasta de la física documental, del tipo que puede ser invocado para decir cosas salvajes y maravillosas - Michio Kaku.&lt;br /&gt;&lt;br /&gt;Por favor, no me malinterpreten. No tengo nada en contra de Kaku, me parece un muy buen tipo, y creo que ha realizado un excelente y divertido trabajo para este tipo de programas (tales como el &lt;a href="http://asymptotia.com/2008/11/15/einstein-on-monday/"&gt;documental sobre Einstein de la otra noche&lt;/a&gt; ), pero hay momentos en que sus observaciones más, ermmm, emocionadas e imprudentes pueden ser colocadas en un lugar en el programa que no ayuda en nada a ser prudente con la ciencia. A menudo (quizás siempre?) no es su culpa, un director que no se da cuenta de cómo un detalle puede ser crucial llega a un punto en el que debe elegir entre la inserción de:&lt;br /&gt;&lt;br /&gt;     * (a) un fragmento de alguno de nosotros que tratamos de ser cuidadosos y no hacer declaraciones equivocadas y/o  sensacionalistas, y&lt;br /&gt;     * (b) un fragmento un distinguido caballero con un entusiasmo contagioso, agitando sus brazos y diciendo cosas que suenan maravillosas&lt;br/&gt;&lt;br/&gt; ...Y 99 veces de cada 100 va a elegir la opción (b) si ninguna de las personas de (a) están ahí para orientarle. Esta es, por supuesto, la razón por la que siempre espero [...] que estos espectáculos se realicen de un modo colaborativo entre científicos y cineastas[...]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Hace ya unos días, bastante relacionado con esto, &lt;a href="http://rvr.blogalia.com/"&gt;rvr&lt;/a&gt; en un par de entradas, &lt;a href="http://rvr.blogalia.com//historias/58678"&gt;El nivel de la divulgación científica (I)&lt;/a&gt; y &lt;a href="http://rvr.blogalia.com/historias/59838"&gt;El nivel de la divulgación científica (II)&lt;/a&gt; repasaba el mismo problema a la inversa, con la tesis de que debe haber sitio también para la divulgación más superficial.&lt;br /&gt;&lt;br /&gt;Sin estar en desacuerdo con esta tesis si debo reconocer que me gustaría que hubiese menos confusión entre ciencia aceptada y especulación. Creo que la diferencia debería ser subrayada por todo el mundo y que conceptos como &lt;a href="http://es.wikipedia.org/wiki/M%C3%A9todo_cient%C3%ADfico"&gt;Método Científico&lt;/a&gt;, &lt;a href="http://es.wikipedia.org/wiki/Reproducibilidad"&gt;Reproducibilidad&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/Falsabilidad"&gt;Falsabilidad&lt;/a&gt; tuviesen mayor eco. Cuestión de educación, supongo.&lt;br /&gt;&lt;br /&gt;Y bueno, por acabar y por ser algo constructivo recomendar una entrada sobre el tema en &lt;a href="http://ecos.blogalia.com/"&gt;Ecos del futuro&lt;/a&gt; (que he conocido hace poco, muy bueno): &lt;a href="http://ecos.blogalia.com/historias/58355"&gt;La interpretación de los universos múltiples&lt;/a&gt;, en la que sí queda claro lo que es especulativo y lo que no, y porqué.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31186"&gt;La misma entrada y más comentarios en &lt;em&gt;Universos paralelos, cuerdas y divulgación científica&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3162931488134255399?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3162931488134255399/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3162931488134255399' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3162931488134255399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3162931488134255399'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/11/universos-paralelos-cuerdas-y.html' title='Universos paralelos, cuerdas y divulgación científica'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5934130642796508102</id><published>2008-11-17T18:38:00.005+01:00</published><updated>2008-11-17T18:59:29.505+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='cilk++'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria transaccional'/><category scheme='http://www.blogger.com/atom/ns#' term='cilk'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><category scheme='http://www.blogger.com/atom/ns#' term='paralelismo'/><category scheme='http://www.blogger.com/atom/ns#' term='bazar'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='pcc'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='Clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><title type='text'>Varios sobre concurrencia y rivales de GCC</title><content type='html'>Ración de varios variados:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=557"&gt;Parallel Programming with Transactional Memory de Ulrich Drepper&lt;/a&gt; en el que hace una buena introducción de la memoria transaccional y de su estado actual, que es más bien de investigación, de su posible futuro y de sus posibles problemas, sobre todo de rendimiento. Por cierto, que &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; usa STM, a ver si algún día le puedo hincar algún diente... (Se ha tratado el tema de la &lt;a href="http://yapw.blogspot.com/search/label/memoria transaccional"&gt;memoria transaccional&lt;/a&gt; más veces por aquí)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otro artículo introductorio de ACM Queue: &lt;a href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=556"&gt;Erlang for Concurrent Programming de Jim Larson&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.cilk.com/multicore-blog/bid/7191/The-Case-for-a-New-Open-Source-License"&gt;Cilk++ 1.0 se liberará con una licencia dual, una &lt;em&gt;open source&lt;/em&gt; y otra &lt;em&gt;comercial&lt;/em&gt;&lt;/a&gt;. &lt;a href="http://www.cilk.com/Default.aspx?app=LeadgenDownload&amp;shortpath=docs%2FCilk_datasheet_8.5x11.pdf"&gt;Cilk++ es un sistema que promete &lt;em&gt;acercar el paralelismo a las masas&lt;/em&gt;&lt;/a&gt;. Ya veremos, pero una herramienta libre más no está mal.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://arstechnica.com/news.ars/post/20081113-things-that-go-clang-in-the-night-llvm-2-4-released.html"&gt;Things that go Clang in the night: LLVM 2.4 released en Ars Technica&lt;/a&gt;. Un poquito más profundo que las notas de prensa que se apuntaban por aquí en &lt;a href="hhttp://yapw.blogspot.com/2008/11/publicado-llvm-24.html"&gt;Publicado LLVM 2.4&lt;/a&gt; pero tampoco para tirar cohetes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Y por último &lt;a href="http://pcc.ludd.ltu.se/"&gt;pcc, the Portable C Compiler&lt;/a&gt;,  busca, con el apoyo de &lt;a href="http://www.bsdfund.org/"&gt;BSD Fund&lt;/a&gt; &lt;a href="http://undeadly.org/cgi?action=article&amp;sid=20081108135831"&gt;financiación para alcanzar una versión de ppc 1.0 usable&lt;/a&gt; y poder tener un entorno de desarrollo BSD completo (y puro :) )&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Movidillo parece el micromundo de los compiladores libres, veremos si la competición les sirve para mejorar a todos ellos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31155"&gt;La misma entrada y más comentarios en &lt;em&gt;Varios sobre concurrencia y rivales de GCC&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5934130642796508102?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5934130642796508102/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5934130642796508102' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5934130642796508102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5934130642796508102'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/11/varios-sobre-concurrencia-y-rivales-de.html' title='Varios sobre concurrencia y rivales de GCC'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4268981743655283644</id><published>2008-11-11T14:02:00.000+01:00</published><updated>2008-11-11T14:04:36.520+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Ada'/><category scheme='http://www.blogger.com/atom/ns#' term='optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='versionitis'/><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><category scheme='http://www.blogger.com/atom/ns#' term='LLVM'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><title type='text'>Publicado LLVM 2.4</title><content type='html'>Acaba de ser &lt;a href="http://lists.cs.uiuc.edu/pipermail/llvm-announce/2008-November/000030.html"&gt;anunciada la versión 2.4 de LLVM (Low Level Virtual Machine)&lt;/a&gt;. A &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; y su compilador asociado &lt;a href="http://clang.llvm.org/"&gt;clang&lt;/a&gt; se les ha querido ver como un competidor de &lt;a href="http://gcc.gnu.org/"&gt;GCC&lt;/a&gt;, en parte por su licencia BSD, por su diseño más modular, por su novedoso enfoque de las optimizaciones y por el apoyo de Apple. &lt;a href="http://llvm.org/releases/2.4/docs/ReleaseNotes.html"&gt;La versión 2.4 trae una buena cantidad de novedades&lt;/a&gt; entre las que destacan la mejora en la generación de código, compilación más rápida y soporte para la arquitectura &lt;a href="http://en.wikipedia.org/wiki/PIC_microcontroller"&gt;PIC16&lt;/a&gt;. En el propio anuncio se apunta a &lt;a href="http://llvm.org/devmtg/2008-08/"&gt;una serie de presentaciones y vídeos para saber más&lt;/a&gt;. [Vía &lt;a href="http://www.reddit.com/r/programming/comments/7cfh9/llvm_24_released/"&gt;reddit&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31116"&gt;La misma entrada y más comentarios en &lt;em&gt;Publicado LLVM 2.4&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4268981743655283644?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4268981743655283644/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4268981743655283644' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4268981743655283644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4268981743655283644'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/11/publicado-llvm-24.html' title='Publicado LLVM 2.4'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8152291553614535276</id><published>2008-11-10T17:07:00.002+01:00</published><updated>2008-11-10T17:10:49.673+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='caché'/><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><category scheme='http://www.blogger.com/atom/ns#' term='portabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='sistemas operativos'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><title type='text'>Un vistazo al interior de memcached</title><content type='html'>Leo en &lt;a href="http://icewinddale.blogspot.com/2008/11/memcached-arquitectura-interna.html"&gt;El valle del Viento Helado un artículo acerca de la arquitectura interna de &lt;tt&gt;memcached&lt;/tt&gt;&lt;/a&gt;. &lt;a href="http://www.danga.com/memcached/"&gt;&lt;tt&gt;memcached&lt;/tt&gt;&lt;/a&gt; es un sistema de cachés genéricas muy usado en aplicaciones web. En el artículo se repasa tanto la elección de &lt;a href="http://monkey.org/~provos/libevent/"&gt;libevent&lt;/a&gt; como sistema de gestión de eventos sobre descriptores de fichero, el uso de funciones de entrada/salida no bloqueantes y sobre todo una gestión de memoria basada en un &lt;a href="http://es.wikipedia.org/wiki/Slab"&gt;&lt;em&gt;slab allocator&lt;/em&gt;&lt;/a&gt;. Contiene además enlaces con más información sobre el tema aunque como siempre &lt;a href="http://code.sixapart.com/svn/memcached/trunk/server/"&gt;la información última está en el código fuente&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31107"&gt;La misma entrada y más comentarios en &lt;em&gt;Un vistazo al interior de memcached&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8152291553614535276?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8152291553614535276/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8152291553614535276' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8152291553614535276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8152291553614535276'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/11/un-vistazo-al-interior-de-memcached.html' title='Un vistazo al interior de memcached'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5501552221110843468</id><published>2008-10-29T13:05:00.003+01:00</published><updated>2008-10-29T13:19:19.338+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herb Sutter'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='C++09'/><category scheme='http://www.blogger.com/atom/ns#' term='borrador'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Completado el borrador de C++0x</title><content type='html'>Como comenta &lt;a href="http://herbsutter.wordpress.com/2008/10/28/september-2008-iso-c-standards-meeting-the-draft-has-landed-and-a-new-convener/"&gt;Herb Sutter en su blog&lt;/a&gt;, se ha publicado &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf"&gt;el borrador (pdf) de C++0x que se pasará a la votación internacional&lt;/a&gt;. Creo que es una buen noticia para todos los usuarios de C++, porque como dicen en reddit, &lt;em&gt;&lt;a href="http://www.reddit.com/r/programming/comments/79xf8/lambdas_auto_and_static_assert_c0x_features_in/c062s3l"&gt;map&amp;lt;string, string&amp;gt;::iterator, tu larga década de terror se ha acabado&lt;/a&gt;&lt;/em&gt; :) Además, y no menos importante, toda una serie de características como &lt;tt&gt;rvalue&lt;/tt&gt;s, lambdas, conceptos, librería de operaciones atómicas, librería de threads, soporte para expresiones regulares...&lt;br /&gt;&lt;br /&gt;Y uno de los &lt;em&gt;arreglos&lt;/em&gt; más importantes, el modelo de memoria. Del borrador:&lt;blockquote&gt;The fundamental storage unit in the C++ memory model is the &lt;em&gt;byte&lt;/em&gt;. A byte is at least large enough to contain any member of the basic execution character set and the eight-bit code units of the Unicode UTF-8 encoding form and is composed of a contiguous sequence of bits, the number of which is implementationdefined.&lt;br /&gt;The least significant bit is called the &lt;em&gt;low-order&lt;/em&gt; bit; the most significant bit is called the &lt;em&gt;high-order&lt;/em&gt; bit. The memory available to a C++ program consists of one or more sequences of contiguous bytes. Every byte has a unique address.&lt;br /&gt;[...]&lt;br /&gt;A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having non-zero width. [...] Two threads of execution can update and access separate memory locations without interfering with each other.&lt;/blockquote&gt;&lt;br /&gt;Enhorabuena a los premiados. Ahora falta que los implementadores hagan su trabajo. &lt;a href="http://blogs.msdn.com/vcblog/archive/2008/10/28/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx"&gt;MS VC++ parece que va avanzando para llegar a VC++2010&lt;/a&gt;. (Estoy seguro que la coincidencia del borrador de C++0x y la publicación este post en el blog de VC++ no es casual...) &lt;a href="http://gcc.gnu.org/projects/cxx0x.html"&gt;&lt;tt&gt;gcc&lt;/tt&gt;, aunque más lento, también va avanzando&lt;/a&gt; y ya se pueden probar algunas características.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/31021"&gt;La misma entrada y más comentarios en &lt;em&gt;Completado el borrador de C++0x&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5501552221110843468?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5501552221110843468/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5501552221110843468' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5501552221110843468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5501552221110843468'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/10/completado-el-borrador-de-c0x.html' title='Completado el borrador de C++0x'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6160998693206912538</id><published>2008-10-23T09:48:00.003+02:00</published><updated>2008-10-23T11:02:54.553+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='arquitectos'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programación paralela'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Varios sobre concurrencia y el rol de los 'arquitectos'</title><content type='html'>Comenzando por &lt;a href="http://tirania.org/blog/archive/2008/Oct-19.html"&gt;el minipost de Miguel de Icaza en el que habla de programación paralela&lt;/a&gt; y siguiendo enlaces:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc872852.aspx"&gt;Design Considerations For Parallel Programming de David Callahan&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc817398.aspx"&gt;Solving 11 Likely Problems In Your Multithreaded Code de Joe Duffy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Repasando el blog de este último también apunta a &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc872851.aspx"&gt;.NET Matters: False Sharing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Y también del blog de &lt;a href="http://www.bluebytesoftware.com/"&gt;Joe Duffy&lt;/a&gt;, y aunque no es sobre concurrencia y probablemente sean obviedades, me ha gustado &lt;a href="http://www.bluebytesoftware.com/blog/2008/10/02/AFewThoughtsOnTheRoleOfSoftwareArchitects.aspx"&gt;A few thoughts on the role of software architects&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30989"&gt;La misma entrada y más comentarios en &lt;em&gt;Varios sobre concurrencia y el rol de los 'arquitectos'&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6160998693206912538?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6160998693206912538/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6160998693206912538' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6160998693206912538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6160998693206912538'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/10/varios-sobre-concurrencia-y-el-rol-de.html' title='Varios sobre concurrencia y el rol de los &apos;arquitectos&apos;'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7270502777833150299</id><published>2008-10-14T23:21:00.003+02:00</published><updated>2008-10-15T12:25:28.596+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matemática'/><category scheme='http://www.blogger.com/atom/ns#' term='humano'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='ser humano'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Las matemáticas 'innatas' en el ser humano</title><content type='html'>&lt;strong&gt;Nota:&lt;/strong&gt; Para los lectores de PlanetaCódigo. Esta es una entrada sobre ciencia y matemática y no sobre programación. Si no te interesa no tienes más que saltártela :)&lt;br /&gt;&lt;br /&gt;Ayer en la cola de pendientes de menéame leí una noticia demasiado escueta que hablaba de &lt;a href="http://meneame.net/story/ninos-aborigenes-australianos-capaces-contar-sin-numeros"&gt;niños aborígenes australianos capaces de contar sin números&lt;/a&gt;. Rebuscando un poquito encontré &lt;a href="http://www.ucl.ac.uk/media/library/aboriginal"&gt;la nota de prensa original&lt;/a&gt;, que por lo menos es un poco más explicativa.&lt;br /&gt;&lt;br /&gt;Y es que este tipo de estudios sacan resultados que al menos a primera vista pueden resultar antiintuitivos: nuestra capacidad matemática parece estar más allá de nuestra capacidad verbal. O dicho de otro modo, parece que la evolución nos ha hecho más viables con un pequeño &lt;em&gt;coprocesador matemático&lt;/em&gt;, aparentemente no específica a nuestra especie porque, como decía otro estudio de hace un tiempo, &lt;a href="http://www.newscientist.com/article/dn12849-monkeys-reveal-brain-is-hardwired-for-counting.html"&gt;los monos tienen células dedicadas a contar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;También acerca del equipamiento matemático del ser humano se oyó hace un tiempo (quizás &lt;a href="http://www.sciencemag.org/cgi/content/abstract/320/5880/1217"&gt;Log or Linear? Distinct Intuitions of the Number Scale in Western and Amazonian Indigene Cultures&lt;/a&gt;)  que las escalas logarítmicas pueden resultar más intuitivas que las lineales a un humano sin formación cultural y/o matemática.&lt;br /&gt;&lt;br /&gt;Me parecen muy reveladoras este tipo de investigaciones ¿Conocéis más publicaciones y/o artículos de este estilo? ¿Qué opináis de la relación entre el ser humano y la matemática?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30912"&gt;La misma entrada y más comentarios en &lt;em&gt;Las matemáticas 'innatas' en el ser humano&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7270502777833150299?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7270502777833150299/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7270502777833150299' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7270502777833150299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7270502777833150299'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/10/las-matemticas-innatas-en-el-ser-humano.html' title='Las matemáticas &apos;innatas&apos; en el ser humano'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7034690302710338780</id><published>2008-09-30T10:17:00.001+02:00</published><updated>2008-09-30T10:24:09.659+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herb Sutter'/><category scheme='http://www.blogger.com/atom/ns#' term='bloqueos'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='lock-free structures'/><title type='text'>Reescribiendo una cola sin bloqueos</title><content type='html'>&lt;a href="http://www.gotw.ca/"&gt;Herb Sutter&lt;/a&gt; se quejó en &lt;a href="http://www.ddj.com/cpp/210600279"&gt;Lock-Free Code: A False Sense of Security&lt;/a&gt;(*) de lo difícil que es escribir código sin bloqueos incluso para expertos y lo hizo poniendo un ejemplo de una implementación errónea de una cola. Ahora ha retomado el tema para demostrar como sería una implementación correcta en &lt;a href="http://www.ddj.com/hpc-high-performance-computing/210604448"&gt;Writing Lock-Free Code: A Corrected Queue&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(*) Hablamos de este artículo en &lt;a href="http://yapw.blogspot.com/2008/08/varios-sobre-concurrencia-los-peligros.html"&gt;Varios sobre concurrencia: los peligros de 'Lock-Free' y JVM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30767"&gt;La misma entrada y más comentarios en &lt;em&gt;Reescribiendo una cola sin bloqueos&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7034690302710338780?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7034690302710338780/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7034690302710338780' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7034690302710338780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7034690302710338780'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/09/reescribiendo-una-cola-sin-bloqueos.html' title='Reescribiendo una cola sin bloqueos'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3954375381261507914</id><published>2008-09-29T16:26:00.003+02:00</published><updated>2008-09-29T17:38:07.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bloqueos'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='mutexes'/><category scheme='http://www.blogger.com/atom/ns#' term='programación paralela'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='lock-free structures'/><title type='text'>¿Cómo  funcionan los cierres de exclusión mutua?</title><content type='html'>Vía &lt;a href="http://www.reddit.com/r/programming/comments/745ud/how_do_locks_lock/"&gt;reddit&lt;/a&gt; veo un artículo muy didáctico de &lt;a href="http://www.moserware.com/2008/09/how-do-locks-lock.html"&gt;como funcionan internamente los cierres de exclusión mutua&lt;/a&gt; que usamos diariamente y así hacernos a la idea &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;de lo que hay debajo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30761"&gt;La misma entrada y más comentarios en &lt;em&gt;¿Cómo funcionan los cierres de exclusión mutua?&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3954375381261507914?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3954375381261507914/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3954375381261507914' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3954375381261507914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3954375381261507914'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/09/cmo-se-funcionan-los-cierres-de.html' title='¿Cómo  funcionan los cierres de exclusión mutua?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6907172942368864070</id><published>2008-09-29T15:25:00.001+02:00</published><updated>2008-09-29T15:28:01.779+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gang of Four'/><category scheme='http://www.blogger.com/atom/ns#' term='presentación'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones de diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='GoF'/><category scheme='http://www.blogger.com/atom/ns#' term='programación paralela'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones'/><category scheme='http://www.blogger.com/atom/ns#' term='Ralph Johnson'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>"Patrones en programación paralela" por Ralph Johnson</title><content type='html'>&lt;a href="http://st-www.cs.uiuc.edu/users/johnson/"&gt;Ralph Johnson&lt;/a&gt;, coautor del conocidísimo &lt;a href="http://es.wikipedia.org/wiki/Design_Patterns"&gt;Design Patterns&lt;/a&gt; dió una charla sobre patrones en programación paralela: &lt;a href="http://media.cs.uiuc.edu/Apresos/seminars/UPCRC/2008-09-19/UPCRC__2008-09-19_02-58-PM_files/flash_index.htm"&gt;Parallel Programming Patterns&lt;/a&gt;, que está disponible &lt;em&gt;online&lt;/em&gt; en un flash con las transparencias integradas para un mejor seguimiento. [Vía &lt;a href="http://herbsutter.wordpress.com/2008/09/25/ralph-johnson-on-parallel-programming-patterns/"&gt;Sutter's Mill&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30760"&gt;La misma entrada y más comentarios en &lt;em&gt;"Patrones en programación paralela" por Ralph Johnson&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6907172942368864070?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6907172942368864070/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6907172942368864070' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6907172942368864070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6907172942368864070'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/09/patrones-en-programacin-paralela-por.html' title='&quot;Patrones en programación paralela&quot; por Ralph Johnson'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6802055744247495398</id><published>2008-09-03T19:07:00.007+02:00</published><updated>2008-09-05T16:36:46.553+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='me'/><category scheme='http://www.blogger.com/atom/ns#' term='multiproceso'/><category scheme='http://www.blogger.com/atom/ns#' term='código'/><category scheme='http://www.blogger.com/atom/ns#' term='navegadores'/><category scheme='http://www.blogger.com/atom/ns#' term='portabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='MPI'/><category scheme='http://www.blogger.com/atom/ns#' term='navegador'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='vistazo'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='multitarea'/><title type='text'>Un vistazo al código de chrome</title><content type='html'>Una de los aspectos que más me ha interesado de chrome es su arquitectura, aquello de &lt;a href="http://dev.chromium.org/developers/design-documents/multi-process-architecture"&gt;ejecutar un proceso por pestaña&lt;/a&gt; para dejar que el sistema operativo haga unos de los trabajos para los que está diseñado: aislar procesos independientes y gestionar la memoria. Entonces he decidido a echarle un vistazo al código, que para eso está ahí ;)&lt;br /&gt;&lt;br /&gt;Lo primero que hay que decir es que el &lt;a href="http://es.wikipedia.org/wiki/IPC_(comunicaci%C3%B3n_entre_procesos)"&gt;IPC&lt;/a&gt; se hace mediante &lt;a href="http://es.wikipedia.org/wiki/Named_pipe"&gt;&lt;em&gt;pipes&lt;/em&gt; con nombre&lt;/a&gt;, como parece que debería ser, aunque sea una de esas características de los SO en decadencia, o por ser más preciso, menos de moda. &lt;a href="http://dev.chromium.org/developers/design-documents/inter-process-communication"&gt;El documento que describe el IPC en chromium&lt;/a&gt; es escueto así que he hecho una inmersión en el código, aunque superficial, sobre todo para encontrar detalles de implementación. Los mensajes se gestionan con una clase &lt;tt&gt;ChannelProxy&lt;/tt&gt; (definida en &lt;tt&gt;src/chrome/common/ipc_channel_proxy.h&lt;/tt&gt;) Las pipes se gestionan con la clase &lt;tt&gt;Channel&lt;/tt&gt; (mismo directorio, &lt;tt&gt;icp_channel.h&lt;/tt&gt;) Curiosamente está implementada llamando directamente a la API de &lt;tt&gt;win32&lt;/tt&gt;, ella misma hace de capa de abstracción y de interfaz a implementar.&lt;br /&gt;&lt;br /&gt;Otro aspecto que me llamaba mi curiosidad es la serialización de los mensajes y lo hacen especializando &lt;tt&gt;Read&lt;/tt&gt;, &lt;tt&gt;Write&lt;/tt&gt; y &lt;tt&gt;Log&lt;/tt&gt; de &lt;tt&gt;ParamTraits&lt;/tt&gt; (en &lt;tt&gt;src/chrome/common/ipc_message_utils.h&lt;/tt&gt;) a la estructura o tipo de dato en concreto. La serialización los tipos de datos primitivos están en &lt;tt&gt;Pickle&lt;/tt&gt; (&lt;tt&gt;src/base/pickle.cc&lt;/tt&gt;), que es base de &lt;tt&gt;Message&lt;/tt&gt; (&lt;tt&gt;src/chrome/common/ipc_message.cc&lt;/tt&gt;) &lt;br /&gt;&lt;br /&gt;Como uno de mis intereses es la &lt;em&gt;multiplataforma&lt;/em&gt; he buscado como solucionaban la gestión de threads y procesos. Acerca de los threads se han creado un interfaz sencillo en &lt;tt&gt;src/base/platform_thread.h&lt;/tt&gt; con dos implementaciones, &lt;tt&gt;platform_thread_win.cc&lt;/tt&gt; y &lt;tt&gt;platform_thread_posix.cc&lt;/tt&gt;. Cabe destacar el siguiente comentario de este último fichero:&lt;blockquote&gt;&lt;br /&gt;The POSIX standard does not provide for naming threads, and neither Linux&lt;br /&gt;nor Mac OS X (our two POSIX targets) provide any non-portable way of doing&lt;br /&gt;it either. (Some BSDs provide pthread_set_name_np but that isn't much of a&lt;br /&gt;consolation prize.)&lt;br /&gt;&lt;/blockquote&gt;Que creo que dice algo de su política y no se si gustará mucho a los BSDros... El buceo por la gestión de procesos ha sido un poco decepcionante porque sólo existe un &lt;tt&gt;process_util::LaunchApp&lt;/tt&gt; que básicamente llama a un &lt;tt&gt;CreateProcess&lt;/tt&gt; de nuevo de la API de &lt;tt&gt;win32&lt;/tt&gt;. Seguramente han ido pensado previamente en los interfaces y solo están a falta de la implementación en distintas plataformas, pero da una sensación de &lt;em&gt;trabajo a medias&lt;/em&gt;, quizás reflejo de un proyecto real (en contraposición de una prueba de concepto) saliendo de su fase temprana. Cabe preguntarse cuanto les costará implementar y testear esas funcionalidades... Ah, calla, que somos millones los &lt;em&gt;betatesters&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;(Actualización)&lt;/strong&gt; Un tímido buceo en &lt;tt&gt;src/net/base&lt;/tt&gt; me dice que el código de red es muy &lt;em&gt;windowscéntrico&lt;/em&gt;, con muchas inclusiones de &lt;em&gt;winsock2.h&lt;/em&gt;, incluso en cabeceras :/ aún les queda trabajillo por delante. Los interfaces de las clases parecen bien definidos y eso les ahorrará trabajo, pero es bien sabido que un interfaz no es válido y está maduro hasta que no funciona en todas la plataformas a las que se dirige...&lt;br /&gt;&lt;br /&gt;Uhmmm, acabo de ver un enlace de donde se baja las &lt;a href="http://dev.chromium.org/developers/how-tos/build-instructions-linux"&gt;fuentes que se suponen del desarrollo en linux&lt;/a&gt;. Seguiremos informando, pero ya sólo esta distinción de obtención de fuentes no da buena espina... &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;(Actualización2)&lt;/strong&gt;Ya lo he bajado pero es básicamente el mismo código. Me debo estar perdiendo algo, porque sino está muy verde...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;(Actualización3)&lt;/strong&gt; Leo en &lt;a href="http://www.kriptopolis.org/chrome-y-certificados-clave-publica"&gt;kriptópolis&lt;/a&gt; que Chrome usa &lt;a href="http://en.wikipedia.org/wiki/Cryptographic_Service_Provider"&gt;CSP&lt;/a&gt; en lugar de PKCS :O No hay rastro de ningún PKCS (11 por ejemplo, el que usa El DNIe) ni de NSS (la librería criptográfica de Netscape que usa firefox) Me temo que la &lt;em&gt;portabilidad&lt;/em&gt; no se la han tomado en serio o quieren que se la hagan otros... Alucino.&lt;strong&gt;(fin actualizaciones)&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Desde el punto de vista gráfico he visto que tiene muchas de dependencias de la &lt;a href="http://en.wikipedia.org/wiki/WTL"&gt;WTL&lt;/a&gt;, lo que dice también poco de la portabilidad en primera instancia. Ya veremos a ver como solucionan ese temilla, aparentemente con lo que figura en &lt;tt&gt;src/base/gfx&lt;/tt&gt;. No obstante hay pocos restos de WTL en los .h, así que quizás ya van bastante adelantados... Misma sensación de &lt;em&gt;a medias&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Seguro que habría mucho más que decir, sobre todo del diseño e implementación de JavaScript, &lt;a href="http://code.google.com/apis/v8/intro.html"&gt;V8&lt;/a&gt; pero creo que se escribirá de eso suficiente (ya se ha escrito mucho de su eficiencia, veremos cuanto hay de &lt;em&gt;hype&lt;/em&gt;) y de temas relacionados como &lt;a href="http://macournoyer.wordpress.com/2008/09/02/ruby-on-v8/"&gt;la ejecución de ruby sobre V8&lt;/a&gt;... Ains que bien se lo hace google ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30587"&gt;La misma entrada y más comentarios en &lt;em&gt;Un vistazo al código de chrome&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6802055744247495398?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6802055744247495398/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6802055744247495398' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6802055744247495398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6802055744247495398'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/09/un-vistazo-al-cdigo-de-chrome.html' title='Un vistazo al código de chrome'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3160061492562517306</id><published>2008-08-22T09:02:00.002+02:00</published><updated>2008-08-22T09:08:40.050+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='C++09'/><category scheme='http://www.blogger.com/atom/ns#' term='Stroustrup'/><category scheme='http://www.blogger.com/atom/ns#' term='entrevistas'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Bjarne Stroustrup'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><title type='text'>(Aún otra) entrevista (más) a Stroustrup sobre C++0x</title><content type='html'>Veo, &lt;a href="http://tech.slashdot.org/article.pl?sid=08/08/21/1521236"&gt;vía Slashdot&lt;/a&gt;, aún otra entrevista más a &lt;a href="http://www.research.att.com/~bs/"&gt;Bjarne Stroustrup&lt;/a&gt; sobre &lt;a href="http://en.wikipedia.org/wiki/C++0x"&gt;C++0x&lt;/a&gt;: &lt;a href="http://www.devx.com/SpecialReports/Article/38813/1954?pf=true"&gt;The State of the Language: An Interview with Bjarne Stroustrup&lt;/a&gt; por &lt;a href="http://www.informit.com/guides/guide.aspx?g=cplusplus"&gt;Danny Kalev&lt;/a&gt;. La verdad es que me ha parecido mejor que la media y diría que es un buen repaso introductorio a esta nueva estandarización de C++. (Las entrevistas a &lt;a href="http://yapw.blogspot.com/search/label/Bjarne%20Stroustrup"&gt;Stroustrup&lt;/a&gt; son ya un clásico en esta bitácora :) )&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30500"&gt;La misma entrada y más comentarios en &lt;em&gt;(Aún otra) entrevista (más) a Stroustrup sobre C++0x&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3160061492562517306?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3160061492562517306/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3160061492562517306' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3160061492562517306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3160061492562517306'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/08/otra-entrevista-ms-stroustrup-sobre-c0x.html' title='(Aún otra) entrevista (más) a Stroustrup sobre C++0x'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3238479590315362819</id><published>2008-08-13T22:26:00.005+02:00</published><updated>2008-09-30T10:21:24.864+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sincronización'/><category scheme='http://www.blogger.com/atom/ns#' term='Herb Sutter'/><category scheme='http://www.blogger.com/atom/ns#' term='bloqueos'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='humildad'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='lock-free structures'/><title type='text'>Varios sobre concurrencia: los peligros de 'Lock-Free' y JVM</title><content type='html'>Ración de varios sobre concurrencia:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ddj.com/cpp/210600279"&gt;"Lock-Free Code: A False Sense of Security" de Herb Sutter&lt;/a&gt; que viene a decir &lt;a href="http://barrapunto.com/~mig21/journal/29846"&gt;algo que por aquí intuíamos&lt;/a&gt;:&lt;blockquote&gt;    [Lock-free code is] hard even for experts. It’s easy to write lock-free code that appears to work, but it’s very difficult to write lock-free code that is correct and performs well. Even good magazines and refereed journals have published a substantial amount of lock-free code that was actually broken in subtle ways and needed correction.&lt;/blockquote&gt;es decir, entre otras cosas, &lt;a href="http://yapw.blogspot.com/2007/08/la-humildad-como-virtud-del-programador.html"&gt;recordar ser humildes&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Si aún siendo humildes queremos saber más sobre estos temas podemos echarle un vistazo a &lt;a href="http://blogs.azulsystems.com/cliff/2008/08/just-what-the-h.html"&gt;"Just What-the-Heck is a 'wait-free' algorithm?" de Cliff Click&lt;/a&gt; en el que repasa este tipo de algoritmos que según los que saben de ésto aún son más difíciles de codificar que los &lt;em&gt;'lock-free'&lt;/em&gt; (&lt;a href="http://en.wikipedia.org/wiki/Lock-free_and_wait-free_algorithms"&gt;son un subconjunto de ellos no obstante&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://floatingpoint.tinou.com/2008/08/the-java-memory-model-in-500-words.html"&gt;The Java Memory Model in 500 Words&lt;/a&gt; Un breve resumen, casi chuleta, del &lt;a href="http://en.wikipedia.org/wiki/Java_Memory_Model"&gt;modelo de memoria en Java&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Si lo que nos interesa son más las implementaciones que las especificaciones podemos echar un vistazo a &lt;a href="http://www.cs.princeton.edu/picasso/mats/HotspotOverview.pdf"&gt;The Hotspot Java Virtual Machine&lt;/a&gt;, una completa presentación con detalles de implementación de dicha máquina virtual. Repasa compilación, sincronización, recolección de basura y posibles direcciones de investigación.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30454"&gt;La misma entrada y más comentarios en &lt;em&gt;Varios sobre concurrencia: los peligros de 'Lock-Free' y JVM&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3238479590315362819?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3238479590315362819/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3238479590315362819' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3238479590315362819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3238479590315362819'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/08/varios-sobre-concurrencia-los-peligros.html' title='Varios sobre concurrencia: los peligros de &apos;Lock-Free&apos; y JVM'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8840118261482485773</id><published>2008-08-04T11:07:00.007+02:00</published><updated>2008-08-05T08:24:30.602+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='estética'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Code'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='belleza'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Sobre los aspectos estéticos de la programación</title><content type='html'>&lt;a href="http://alarmingdevelopment.org/"&gt;Jonathan Edwards&lt;/a&gt; en una &lt;a href="http://www.wheelmeout.com/index.php?page=19"&gt;entrevista en un &lt;em&gt;webzine&lt;/em&gt; de reciente creación, Wheel Me Out&lt;/a&gt;, ha tocado uno de los temas que le hacen a uno seguir teniendo pasión por esto de la programación. Cito (traduciendo) lo que más me ha gustado(*):&lt;br /&gt;&lt;blockquote&gt;Veo la programación como una actividad profundamente creativa, pero no exactamente como una forma de arte en el sentido usual del término. Los programas no expresan sentimientos humanos entonces no creo que tengamos derecho a llamarlos arte. Los programadores desarrollan cierto sentido estético que hace de un programa bien diseñado un programa &lt;em&gt;bonito&lt;/em&gt;, pero es una clase de belleza fría y matemática. De hecho sostengo que la estética puede ser una mala guía para los programadores. &lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;La belleza de la programación es intelectual. Es el placer que sentimos cuando un problema complejo de pronto se revela bastante simple visto desde la perspectiva adecuada. Esta sensación de profundidad es la que motiva a algunas personas a ser matemáticos o físicos. [...] Programar es también un tema de poder. Es la lucha del programador para crear orden del caos. Somos como pequeños dioses en nuestros universos de bolsillo. Estamos limitados solo por nuestra imaginación. Desgraciadamente nuestra imaginación es más limitada de lo que nos gusta admitir, lo que en mi opinión es el trágico defecto de la programación, aunque esta opinión no es compartida ampliamente.&lt;/blockquote&gt;&lt;br /&gt;Obviamente, se resalta el aspecto más sublime, cuando todos los que nos dedicamos a esto sabemos que el día a día puede ser bastante distinto, bastante poco elevado. No obstante, en lo que a mi respecta me sigue enganchando la posibilidad de simplificar lo complejo, de encontrar una buena solución y el poder de hacerlo en el &lt;em&gt;universo de bolsillo&lt;/em&gt; :)&lt;br /&gt;&lt;br /&gt;(*)Pedí permiso para traducirlo íntegramente y me pidieron la dirección del blog. No me contestaron después. Espero que me ampare &lt;a href="http://es.wikipedia.org/wiki/Convenio_de_Berna"&gt;el derecho de cita&lt;/a&gt;...(&lt;strong&gt;Actualización:&lt;/strong&gt; desde &lt;a href="http://www.wheelmeout.com/"&gt;Wheel Me Out&lt;/a&gt; me han dado permiso para traducirlo, pero creo que con el extracto ya traducido será suficiente. Gracias al &lt;em&gt;webzine&lt;/em&gt; de todos modos por el permiso y por generar la entrevista)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30387"&gt;La misma entrada y más comentarios en &lt;em&gt;Sobre los aspectos estéticos de la programación&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8840118261482485773?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8840118261482485773/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8840118261482485773' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8840118261482485773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8840118261482485773'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/08/aspectos-estticos-de-la-programacin.html' title='Sobre los aspectos estéticos de la programación'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4987229975510256751</id><published>2008-07-29T17:46:00.003+02:00</published><updated>2008-07-29T22:08:13.109+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='reddit'/><category scheme='http://www.blogger.com/atom/ns#' term='lenguajes'/><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><category scheme='http://www.blogger.com/atom/ns#' term='D'/><category scheme='http://www.blogger.com/atom/ns#' term='Alexandrescu'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Varios sobre D</title><content type='html'>Se acumulan cosillas sobre &lt;a href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_D"&gt;D&lt;/a&gt; que me he ido guardando, así que, haciendo un &lt;tt&gt;dump&lt;/tt&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El enlace que me ha hecho juntarlos todos: &lt;a href="http://www.digitalmars.com/d/2.0/accu-functional.pdf"&gt;"Grafting Functional Support on Top of an Imperative Language - How to D 2.0 implements immutability and functional purity" de Andrei Alexandrescu&lt;/a&gt;. Muy interesante aunque no se vaya a usar D ni programación funcional por aquello del manejo de los invariantes y su aproximación a la concurrencia, además de hacer notar las "limitaciones" del &lt;tt&gt;const&lt;/tt&gt; de C++. &lt;a href="http://www.reddit.com/comments/6sv8d/alexandrescu_on_functional_programming_in_d_pdf/"&gt;Más en reddit.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.techworld.com.au/article/253741/a-z_programming_languages_d"&gt;The A-Z of Programming Languages: D, entrevista a Walter Bright, el creador de D&lt;/a&gt;, &lt;a href="http://www.reddit.com/r/programming/comments/6stpd/interview_with_walter_bright_on_the_creation_of_d/"&gt;extendida en reddit con respuestas del propio Bright&lt;/a&gt;, asiduo por esos lares.&lt;/li&gt;&lt;li&gt;También vía reddit, &lt;a href="http://timburrell.net/blog/programming/2008-06-22/d-postmortem/"&gt;D Postmortem&lt;/a&gt;, en el que se analiza los problemas que se encontró un usuario de D en un proyecto &lt;em&gt;no trivial&lt;/em&gt;. También tuvo muchas respuestas &lt;a href="http://www.reddit.com/comments/6ogl6/d_postmortem/"&gt;en reddit, algunas también del equipo de desarrollo de D, Bright incluido&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30338"&gt;La misma entrada y más comentarios en &lt;em&gt;Varios sobre D&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4987229975510256751?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4987229975510256751/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4987229975510256751' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4987229975510256751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4987229975510256751'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/07/varios-sobre-d.html' title='Varios sobre D'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7633475910752099264</id><published>2008-07-12T23:39:00.004+02:00</published><updated>2008-07-13T08:54:08.457+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='seekdir'/><category scheme='http://www.blogger.com/atom/ns#' term='ecosistema'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='errores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='yacc'/><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><category scheme='http://www.blogger.com/atom/ns#' term='seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='vulnerabilidad'/><title type='text'>Bugs antiguos y moralejas</title><content type='html'>A veces coinciden en el tiempo sucesos de los que se puede sacar una especie de moraleja común y la serie reciente de errores con muchísimos años de historia me parece una de ellas. La grave vulnerabilidad en el  protocolo DNS, que ha hecho actualizar a toda internet ha sido el ejemplo más claro, pero no el único y las tres historias son muy instructivas...&lt;br /&gt;&lt;br /&gt;El primero, hace unos dos meses detectó &lt;a href="http://www.vnode.ch/fixing_seekdir"&gt;un bug de 25 años en los BSD, en seekdir()&lt;/a&gt;[1] en el que, en algunos casos &lt;tt&gt;seekdir()&lt;/tt&gt; no daba el resultado correcto. Como comentan en la propia historia, un bug muy difícil de encontrar y muy fácil de corregir.&lt;br /&gt;&lt;br /&gt;El segundo es un &lt;a href="http://undeadly.org/cgi?action=article&amp;sid=20080708155228&amp;mode=flat&amp;count=13"&gt;bug con 33 años de antigüedad en yacc, encontrado por Otto Moerbeek&lt;/a&gt;[2], quien curiosamente también ha tenido un papel muy relevante en el descubrimiento del bug anterior.&lt;br /&gt;&lt;br /&gt;El último es más peliagudo: &lt;a href="http://www.kb.cert.org/vuls/id/800113"&gt;problemas de diseño en el protocolo DNS&lt;/a&gt; permitían a un atacante hacer &lt;a href="http://es.wikipedia.org/wiki/DNS_Poisoning"&gt;DNS cache poisoning&lt;/a&gt; de modo más efectivo que anteriores técnicas[3]. El descubridor de la vulnerabilidad, &lt;a href="http://en.wikipedia.org/wiki/Dan_Kaminsky"&gt;Dan Kaminsky&lt;/a&gt;, &lt;a href="http://www.doxpara.com/?p=1162"&gt;hace comentarios muy interesantes al respecto&lt;/a&gt; (las negritas son mías):&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://cr.yp.to/djb.html"&gt;DJB&lt;/a&gt; was right. All those years ago, &lt;strong&gt;&lt;a href="http://cr.yp.to/djb.html"&gt;Dan J. Bernstein&lt;/a&gt; was right: Source Port Randomization should be standard&lt;/strong&gt; on every name server in production use.&lt;br /&gt;&lt;br /&gt;There is a fantastic quote that guides a lot of the work I do: &lt;strong&gt;Luck is the residue of design&lt;/strong&gt;. Dan Bernstein is a notably lucky programmer, and that's no accident. The professor lives and breathes systems engineering in a way that my hackish code aspires to one day experience. DJB got "lucky" here — he ended up defending himself against an attack he almost certainly never encountered.&lt;br /&gt;&lt;br /&gt;Such is the mark of excellent design. &lt;strong&gt;Excellent design protects you against things you don't have any information about&lt;/strong&gt;. And so we are deploying this excellent design to provide no information.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Es muy curioso seguir los enlaces, porque la historia del parche es muy poco común y puede enseñar de la parte técnica y de la parte social del &lt;em&gt;ecosistema internet&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Creo que la moraleja de todos ellos es clara, sobre todo leyendo las historias. Pero por recopilarlas (aún a riesgo de decir obviedades):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://barrapunto.com/comments.pl?sid=77498&amp;cid=1063332"&gt;El DNS o SMTP son protocolos pensados para una Internet que ya no existe: ninguno de ellos se diseñó pensando en la seguridad.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Que lleve muchos años funcionando &lt;a href="http://en.wikipedia.org/wiki/Corner_case"&gt;no significa que funcione en todas las circunstancias.&lt;/a&gt;&lt;li&gt;Si se va a usar un software de un modo poco usual, aunque sea uno muy estable, conviene prepararse mentalmente para encontrar bugs.&lt;/li&gt;&lt;/li&gt;&lt;li&gt;Los errores de diseño son más difíciles de arreglar (si es posible)&lt;/li&gt;&lt;li&gt;Un buen diseño sobrepasa las expectativas del diseñador.&lt;/li&gt;&lt;li&gt;Abierto no implica seguro, ni libre de fallos (Cerrado tampoco, claro[4])&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;[1]Un buen resumen en castellano, con interesantes conclusiones en &lt;a href="http://icewinddale.blogspot.com/2008/05/un-bug-de-25-aos-en-los-bsd-seekdir.html"&gt;El valle del viento helado "Un bug de 25 años en los BSD: seekdir()"&lt;/a&gt;&lt;br /&gt;[2]Comentado en barrapunto en &lt;a href="http://barrapunto.com/article.pl?sid=08/07/09/118212"&gt; Corregido un error de hace 33 años en Yacc&lt;/a&gt;&lt;br /&gt;[3]Comentado en barrapunto en &lt;a href="http://barrapunto.com/article.pl?sid=08/07/09/0849236"&gt;Un agujero de seguridad en el protocolo DNS causa gran alarma&lt;/a&gt;&lt;br /&gt;[4]Me ha llamado la atención el caso de un bug casi trivial &lt;a href="http://geeks.ms/blogs/rfog/archive/2008/07/10/bug-el-bug-del-bool-en-interop-desde-c-nativo.aspx"&gt;en el en interop de .NET desde C++ nativo&lt;/a&gt; que lleva la menos seis años sin ser resuelto. No es el único caso ni el más grave ni la única empresa donde sucede eso, por supuesto. Sólo me ha parecido un ejemplo ilustrativo...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30253"&gt;La misma entrada y más comentarios en &lt;em&gt;Bugs antiguos y moralejas&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7633475910752099264?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7633475910752099264/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7633475910752099264' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7633475910752099264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7633475910752099264'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/07/bugs-antiguos-y-moralejas.html' title='Bugs antiguos y moralejas'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-753500769098071956</id><published>2008-07-03T23:06:00.005+02:00</published><updated>2008-07-04T00:01:19.766+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='estándares'/><category scheme='http://www.blogger.com/atom/ns#' term='IE8'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='Postel'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Dracón'/><title type='text'>Parámetro "lo digo en serio" en Content-Type para IE8</title><content type='html'>Pues esa es &lt;a href="http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx"&gt;la propuesta que se puede leer en el blog de desarrollo del Internet Exporer 8&lt;/a&gt;: añadir un &lt;tt&gt;authoritative=true&lt;/tt&gt; al &lt;tt&gt;Content-Type&lt;/tt&gt;, o sea, fiarse de cual es el tipo de contenido que está proporcionando el servidor, pero sólo &lt;em&gt;si lo dice en serio&lt;/em&gt;...&lt;br /&gt;&lt;br /&gt;Por supuesto esta propuesta ha levantado bastantes reacciones. Unos, como &lt;a href="http://intertwingly.net/blog/2008/07/02/authoritative-true"&gt;Sam Ruby en &lt;tt&gt;authoritative=true&lt;/tt&gt;&lt;/a&gt;, lo ven desde el punto de vista pragmático como un mal menor al evitar &lt;em&gt;content-sniffing&lt;/em&gt;. Otros, como &lt;a href="http://daniel.haxx.se/blog/2008/07/02/this-is-the-type-and-i-mean-it/"&gt;Daniel Stenberg en This is the type and I mean it&lt;/a&gt; se lo toman con humor. Más en &lt;a href="http://lists.w3.org/Archives/Public/ietf-http-wg/2008JulSep/0002.html"&gt;las listas de la w3c&lt;/a&gt; y en &lt;a href="http://www.reddit.com/info/6q3c6/comments/"&gt;reddit: Microsoft's "I mean it" content-type parameter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30172"&gt;La misma entrada y más comentarios en &lt;em&gt;Parámetro "lo digo en serio" en Content-Type para IE8&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-753500769098071956?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/753500769098071956/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=753500769098071956' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/753500769098071956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/753500769098071956'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/07/parmetro-lo-digo-en-serio-en-content.html' title='Parámetro &quot;lo digo en serio&quot; en Content-Type para IE8'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5343975899261433754</id><published>2008-06-26T14:03:00.006+02:00</published><updated>2008-06-27T12:13:39.519+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ada'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='lenguajes'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='entrevistas'/><category scheme='http://www.blogger.com/atom/ns#' term='AWK'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Bjarne Stroustrup'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Lenguajes de la A a la Z: Entrevistas</title><content type='html'>En &lt;a href="http://www.computerworld.com.au/"&gt;Computerworld&lt;/a&gt; están publicando extensas entrevistas acerca de un montón de lenguajes de la A a la Z. La verdad es que había visto alguna referencia, pero después de la de &lt;a href="http://research.att.com/~bs/"&gt;Stroustrup&lt;/a&gt; (y sus repercusiones en &lt;a href="http://developers.slashdot.org/article.pl?sid=08/06/25/139219"&gt;Slashdot&lt;/a&gt; y &lt;a href="http://www.reddit.com/info/6ox10/comments/"&gt;reddit&lt;/a&gt;) le he prestado más atención y parece que pueden ser bastante curiosas. También en &lt;a href="http://lambda-the-ultimate.org/node/2873"&gt;LtU - The A-Z of Programming Languages&lt;/a&gt; prometen seguirles la pista, enlazando a su vez a las pasadas:&lt;ul&gt;&lt;li &gt;&lt;a href='http://www.computerworld.com.au/index.php/id;447175928'&gt;Ada - S. Tucker Taft&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href='http://www.computerworld.com.au/index.php/id;73538783'&gt;ASP.NET - Microsoft&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href='http://www.computerworld.com.au/index.php/id;1726534212'&gt;AWK - Alfred V. Aho&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href='http://www.computerworld.com.au/index.php/id;1591223321'&gt;Bash - Chet Ramey&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href='http://www.computerworld.com.au/index.php/id;408408016'&gt;C++ - Bjarne Stroustrup&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href='http://www.computerworld.com.au/index.php/id;766897508'&gt;Forth - Charles Moore&lt;/a&gt; (&lt;strong&gt;Actualizado&lt;/strong&gt; (27/06/08) -No creo poder seguir el ritmo de actualizaciones ;)-)&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; &lt;a href="http://barrapunto.com/article.pl?sid=08/06/26/1644202"&gt;La entrevista a Stroustrup también se comenta en la portada de barrapunto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30097"&gt;La misma entrada y más comentarios en &lt;em&gt;Lenguajes de la A a la Z: Entrevistas&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5343975899261433754?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5343975899261433754/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5343975899261433754' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5343975899261433754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5343975899261433754'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/06/lenguajes-de-la-a-la-z-entrevistas.html' title='Lenguajes de la A a la Z: Entrevistas'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-985745174159342693</id><published>2008-06-20T09:52:00.004+02:00</published><updated>2008-06-20T10:48:33.287+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Propuesta para introducir C++ en gcc</title><content type='html'>Volviendo al tono un poco menos &lt;em&gt;noticioso&lt;/em&gt; de esta bitácora, me gustaría referenciar &lt;a href="http://airs.com/ian/cxx-slides.pdf"&gt;la propuesta de Ian Lance Taylor de permitir determinadas características de C++ en el código de gcc&lt;/a&gt;, sobre todo aquellas que permiten hacer el código más compacto y mantenible. Nombra explícitamente &lt;a href="http://en.wikipedia.org/wiki/Standard_Template_Library"&gt;STL&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming"&gt;polimorfismo&lt;/a&gt; y &lt;a href="http://en.wikipedia.org/wiki/Smart_pointer"&gt;punteros inteligentes&lt;/a&gt; en contraposición a la recolección de basura que se usa en gcc. Hay que hacer notar que la propuesta debería ser aprobada (no sin antes haber pasado por el adecuado &lt;em&gt;flame&lt;/em&gt; C vs C++) aunque Ian propone crear una rama &lt;tt&gt;gcc-in-c++&lt;/tt&gt; para experimentar.&lt;br /&gt;&lt;br /&gt;Me ha parecido una propuesta muy razonable, con una exposición muy clara de lo que se ganaría con el cambio. Es precisamente el (moderado) uso de las características de C++ lo que me ha parecido más reseñable. C++ es un lenguaje grande y no todas son adecuadas a todos los problemas, con lo que hay veces que es sano delimitar como se usa. Esto da lugar no obstante a &lt;a href="http://www.research.att.com/~bs/JSF-AV-rules.pdf"&gt;estándares de codificación con casi obsesivo nivel de detalle, pero de los que se puede aprender si se lee con atención crítica&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por cierto que para evitar dependencias indeseadas (y que C++ se convieta en &lt;a href="http://ejohnson.blogs.com/software/2004/11/i_find_c_intere.html"&gt;el caballo de troya que potencialmente es&lt;/a&gt;) se propone un enlazado estático con la &lt;tt&gt;libstdc++&lt;/tt&gt;. No sé que opinará &lt;a href="http://people.redhat.com/drepper/no_static_linking.html"&gt;Ulrich Drepper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Se puede leer más sobre el tema en el propio &lt;a href="http://www.airs.com/blog/archives/209"&gt;blog de Ian&lt;/a&gt; , en &lt;a href="http://www.reddit.com/info/6nv11/comments/"&gt;reddit&lt;/a&gt; (posteado por un servidor), en &lt;a href="http://lwn.net/Articles/286539/"&gt;LWN&lt;/a&gt; y (con poco éxito de crítica y público) en &lt;a href="http://meneame.net/story/gcc-portado-a-c"&gt;menéame&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30038"&gt;La misma entrada y más comentarios en &lt;em&gt;Propuesta para introducir C++ en gcc&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-985745174159342693?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/985745174159342693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=985745174159342693' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/985745174159342693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/985745174159342693'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/06/propuesta-para-introducir-c-en-gcc.html' title='Propuesta para introducir C++ en gcc'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1881058996756050950</id><published>2008-06-18T18:19:00.002+02:00</published><updated>2008-06-18T18:36:34.946+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reddit'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Reddit abre su código</title><content type='html'>&lt;a href="http://www.reddit.com/"&gt;Reddit&lt;/a&gt;, el sitio colaborativo de promoción de enlaces, que cuenta con una &lt;a href="http://reddit.com/r/programming/"&gt;gran sección de programación&lt;/a&gt;, &lt;a href="http://blog.reddit.com/2008/06/reddit-goes-open-source.html"&gt;ha abierto su código&lt;/a&gt;, disponible en &lt;a href="http://code.reddit.com/"&gt;code.reddit.com&lt;/a&gt;. La licencia elegida ha sido la &lt;a href="http://code.reddit.com/LICENSE"&gt;Common Public Attribution License (CPAL)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30012"&gt;La misma entrada y más comentarios en &lt;em&gt;Reddit abre su código&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1881058996756050950?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1881058996756050950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1881058996756050950' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1881058996756050950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1881058996756050950'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/06/reddit-abre-su-cdigo.html' title='Reddit abre su código'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4391615600465449389</id><published>2008-06-17T12:42:00.006+02:00</published><updated>2008-06-19T13:04:35.860+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualización'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><title type='text'>code_swarm: visualización del desarrollo de proyectos libres</title><content type='html'>Acabo de ver &lt;a href="http://developers.slashdot.org/article.pl?sid=08/06/16/1855209"&gt;vía slashdot&lt;/a&gt; (y me lo perdí &lt;a href="http://www.reddit.com/r/programming/info/6n81a/comments/"&gt;en reddit&lt;/a&gt;) un proyecto de &lt;a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/"&gt;visualización del desarrollo de proyectos libres: code_swarm&lt;/a&gt;. A partir del control de fuentes genera vídeos en los que se puede seguir la evolución histórica del desarrollo de &lt;a href="http://www.vimeo.com/1093745"&gt;Python&lt;/a&gt;, &lt;a href="http://www.vimeo.com/1081680"&gt;PostgreSQL&lt;/a&gt;, &lt;a href="http://www.vimeo.com/1130828"&gt;Eclipse&lt;/a&gt; o &lt;a href="http://www.vimeo.com/1076588"&gt;Apache httpd&lt;/a&gt;. El autor promete además liberar el código para que cualquiera lo pueda aplicar a otros proyectos. Bonito, hipnótico y hasta revelador...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; Ya ha liberado el código en &lt;a href="http://code.google.com/p/codeswarm/"&gt;codeswarm - Google Code&lt;/a&gt;. A disfrutar...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/30004"&gt;La misma entrada y más comentarios en &lt;em&gt;code_swarm: visualización del desarrollo de proyectos libres&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4391615600465449389?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4391615600465449389/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4391615600465449389' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4391615600465449389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4391615600465449389'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/06/codeswarm-visualizacin-del-desarrollo.html' title='code_swarm: visualización del desarrollo de proyectos libres'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6034237623809367237</id><published>2008-06-04T14:13:00.003+02:00</published><updated>2008-06-04T16:21:32.683+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='falsos recuerdos'/><category scheme='http://www.blogger.com/atom/ns#' term='Elizabeth Loftus'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><category scheme='http://www.blogger.com/atom/ns#' term='recuerdos falsos'/><title type='text'>Elizabeth Loftus y los recuerdos falsos</title><content type='html'>Vía &lt;a href="http://cerebrodarwin.blogspot.com/2008/06/recomendacin-el-psicoanlisis-vaya-timo.html"&gt;&lt;em&gt;El psicoanálisis ¡vaya timo!&lt;/em&gt; de El cerebro de Darwin&lt;/a&gt; me he encontrado con los estudios de &lt;a href="http://faculty.washington.edu/eloftus/"&gt;Elizabeth Loftus&lt;/a&gt; acerca de un tema tan atractivo como los &lt;a href="http://es.wikipedia.org/wiki/Falsos_recuerdos"&gt;recuerdos falsos&lt;/a&gt;. En particular hay un buen resumen en &lt;a href="http://faculty.washington.edu/eloftus/Articles/2003Nature.pdf"&gt;"Our changeable memories: legal and practical implications"&lt;/a&gt;. Me quedo con la cita de &lt;a href="http://es.wikipedia.org/wiki/Eduardo_Galeano"&gt;Eduardo Galeano&lt;/a&gt; a modo de resumen (que no he podido encontrarla en castellano, la traduzco de la traducción :\)&lt;blockquote&gt;La memoria nace cada día, brotando del pasado y contraponiéndose a él.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29892"&gt;La misma entrada y más comentarios en &lt;em&gt;Elizabeth Loftus y los recuerdos falsos&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6034237623809367237?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6034237623809367237/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6034237623809367237' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6034237623809367237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6034237623809367237'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/06/elizabeth-loftus-y-los-recuerdos-falsos.html' title='Elizabeth Loftus y los recuerdos falsos'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3694607161279597092</id><published>2008-05-29T23:03:00.002+02:00</published><updated>2008-05-29T23:11:04.201+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria transaccional'/><category scheme='http://www.blogger.com/atom/ns#' term='falsa compartición'/><category scheme='http://www.blogger.com/atom/ns#' term='false sharing'/><category scheme='http://www.blogger.com/atom/ns#' term='STM'/><category scheme='http://www.blogger.com/atom/ns#' term='lock-free structures'/><title type='text'>Varios sobre concurrencia: Lock-free en Java, STM vs locks y consejos</title><content type='html'>Varios sobre concurrencia (versión &lt;tt&gt;n&lt;/tt&gt;)&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/news/2008/05/click_non_blocking"&gt;Cliff Click hizo una presentación sobre estructuras sin bloqueos en Java&lt;/a&gt; en la JavaOne 2008. &lt;a href="http://www.azulsystems.com/events/javaone_2008/2008_CodingNonBlock.pdf"&gt;El (interesante) pdf de la presentación está online&lt;/a&gt; y, no sé si más interesante, el código fuente: &lt;a href="http://sourceforge.net/projects/high-scale-lib/"&gt;Highly Scalable Java en SourceForge&lt;/a&gt;&lt;/li&gt;&lt;li&gt;En &lt;a href="http://blogs.azulsystems.com/cliff/"&gt;el blog del mismo Cliff Click&lt;/a&gt; hay una &lt;a href="http://blogs.azulsystems.com/cliff/2008/05/clojure-stms-vs.html"&gt;argumentadísima discusión de STM vs locks&lt;/a&gt; (&lt;a href="http://es.wikipedia.org/wiki/Cierre_de_exclusi%C3%B3n_mutua"&gt;Bloqueos&lt;/a&gt; frente a &lt;a href="http://en.wikipedia.org/wiki/Software_transactional_memory"&gt;memoria transaccional por software&lt;/a&gt;) Esto si son discusiones :) (por cierto, que la original está en &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/5c7a962cc72c1fe7"&gt;STM criticism from Azul Systems&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Por último, &lt;a href="http://ddj.com/architect/208200273"&gt;Herb Sutter en &lt;em&gt;Maximize Locality, Minimize Contention&lt;/em&gt;&lt;/a&gt; da consejos sobre programación concurrente, algunos de sentido común. Además propone un ejemplo muy claro de &lt;a href="http://www.usenix.org/publications/library/proceedings/als00/2000papers/papers/full_papers/thomas/thomas_html/node10.html"&gt;falsa compartición&lt;/a&gt; y remedios un poco drásticos de evitarla.&lt;/li&gt;&lt;/ul&gt;Pequeña nota sentimental: hoy hace cinco años que escribí mi primera bitácora en barrapunto y hace muy poquito &lt;a href="http://yapw.blogspot.com/"&gt;yapw&lt;/a&gt; ha sobrepasado las 100 entradas. Casi no me lo creo, como pasa el tiempo...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29846"&gt;La misma entrada y más comentarios en &lt;em&gt;Lock-free en Java, STM vs locks y consejos&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3694607161279597092?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3694607161279597092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3694607161279597092' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3694607161279597092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3694607161279597092'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/05/varios-sobre-concurrencia-lock-free-en.html' title='Varios sobre concurrencia: Lock-free en Java, STM vs locks y consejos'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5570692034762705524</id><published>2008-05-26T23:19:00.004+02:00</published><updated>2008-05-27T09:39:53.508+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplataforma'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción no perfecta'/><category scheme='http://www.blogger.com/atom/ns#' term='fsync'/><category scheme='http://www.blogger.com/atom/ns#' term='ext3'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción'/><title type='text'>Firefox 3, SQLite, fsync, ext3 y otras abstracciones</title><content type='html'>Vía &lt;a href="http://lwn.net/Articles/283745/"&gt;LWN&lt;/a&gt; leo &lt;a href="http://shaver.off.net/diary/2008/05/25/fsyncers-and-curveballs/"&gt;un buen resumen de uno de los grandes problemas de Firefox 3 en linux&lt;/a&gt;: es fácilmente observable como dicho navegador se congela durante bastantes segundos hasta que vuelve a responder. Es debido, al parecer al (ab)uso de las actualizaciones en &lt;a href="http://es.wikipedia.org/wiki/SQLite"&gt;SQLite&lt;/a&gt;, que usa &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=421482"&gt;fsync&lt;/a&gt;, que a su vez tiene un más que pobre rendimiento en &lt;a href="http://es.wikipedia.org/wiki/Ext3"&gt;&lt;tt&gt;ext3&lt;/tt&gt;&lt;/a&gt;. La buena noticia es que todos ellos están tratando de mejorar.&lt;br /&gt;&lt;br /&gt;A la vez que me parece un enlace interesante del que se pueden aprender bastantes cosas y un ejemplo de la tesis que manejaba el otro día en &lt;a href="http://yapw.blogspot.com/2008/05/demasiadas-capas-de-abstraccin.html"&gt;¿Demasiadas capas de abstracción?&lt;/a&gt;: Los sistemas tienden a ser cada vez más complejos, y esto genera algunos problemas, pero la tendencia no tiene marcha atrás... En este caso además se le une la complejidad de la portabilidad. El mismo código usa implementaciones distintas de las mismas abstracciones, con lo que el testeo se complica enormemente y probablemente sólo es viable en un escenario de software libre.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29818"&gt;La misma entrada y más comentarios en &lt;em&gt;Firefox 3, SQLite, fsync, ext3 y otras abstracciones&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5570692034762705524?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5570692034762705524/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5570692034762705524' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5570692034762705524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5570692034762705524'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/05/firefox-3-sqlite-fsync-ext3-y-otras.html' title='Firefox 3, SQLite, fsync, ext3 y otras abstracciones'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1463851079577378624</id><published>2008-05-20T15:38:00.004+02:00</published><updated>2008-05-20T23:52:49.152+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='biología'/><category scheme='http://www.blogger.com/atom/ns#' term='módulos'/><category scheme='http://www.blogger.com/atom/ns#' term='capas'/><category scheme='http://www.blogger.com/atom/ns#' term='sistemas operativos'/><category scheme='http://www.blogger.com/atom/ns#' term='complejidad'/><category scheme='http://www.blogger.com/atom/ns#' term='mantras'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción'/><title type='text'>¿Demasiadas capas de abstracción?</title><content type='html'>Vuelve otra vez uno de mis temas favoritos, el de la complejidad inherente y creciente de los &lt;em&gt;sistemas de información&lt;/em&gt;, tratado esta vez por &lt;a href="http://www.airs.com/blog/archives/192"&gt;Ian Lance Taylor en Layered Programming&lt;/a&gt;. Me permito &lt;em&gt;citraducir&lt;/em&gt; un párrafo, un poco al vuelo:&lt;br /&gt;&lt;blockquote&gt;Cada vez es más difícil ser un experto en sistemas. Cuando aprendí a programar, era posible entender todo tu programa, desde el código fuente hasta el código máquina. Sin embargo, cuando escribes una aplicación moderna en Ajax esto es se vuelve imposible. Hay demasiados intérpretes diferentes. Hay demasiado código ejecutándolo. Ni arreglarlo con un nuevo nivel base por encima del procesador (el navegador(?)) ayudaría. Todo esto nos conduce a una pérdida de rendimiento a veces notable y, lo que es a veces más importante, una perdida de seguridad.&lt;br /&gt;&lt;br /&gt;No podemos volver atrás. Pero me pregunto si podremos confluir en un modelo de programación que pueda ser comprendido en su totalidad en todas sus capas. O si las cosas simplemente van a ser más complicadas cada vez.[0]&lt;/blockquote&gt;&lt;br /&gt;Y no sólo me permito la cita, sino que además respondo :) Y mi respuesta (que me perdonen &lt;a href="http://barrapunto.com/~Ricardo+Estalm%E1n/pubkey"&gt;Alvin y Heidi Toffler&lt;/a&gt;) es pesimista, en el sentido de que no hay vuelta atrás al &lt;em&gt;idílico pasado&lt;/em&gt; en el era posible comprender completa, local y globalmente un sistema. La tendencia es la de más lenguajes, más plataformas y más capas, incluso dentro de los propios procesadores y nunca la contraria.&lt;br /&gt;&lt;br /&gt;Pero no es por los ejemplos concretos que vemos a diario por que creo que esto va  a seguir siendo así, sino por el trasfondo. Los sistemas de información van evolucionando unos sobre otros y rara vez se da el caso de retroceso de una paso evolutivo exitoso[1], lo que se conoce como &lt;a href="http://en.wikipedia.org/wiki/Dollo%27s_law"&gt;Ley (o hipótesis) de Dollo&lt;/a&gt;[2] en evolución biológica, que nos vuelve a dar un ejemplo de uno de mis juegos mentales preferidos, el paralelismo entre sistemas biológicos e informáticos [3]. A quien mejor he leído referirse a este paralelismo es a &lt;a href="http://www.dreamsongs.com/"&gt;Richard P. Gabriel&lt;/a&gt; en su &lt;a href="http://yapw.blogspot.com/2007/05/postel-o-dracn.html"&gt;&lt;em&gt;Objects Have Failed&lt;/em&gt;&lt;/a&gt; y que explora de nuevo en &lt;a href="http://www.dreamsongs.com/Files/DesignBeyondHumanAbilitiesSimp.pdf"&gt;Design Beyond Human Abilities (pdf)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No obstante, a pesar de la tendencia natural, creo que uno de los deberes de un diseñador, arquitecto, desarrollador, programador o &lt;em&gt;comoquierallamársele&lt;/em&gt; es contener en lo posible la complejidad del sistema global [4]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[0] El primer comentario apunta, yo creo que con acierto, a &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;"The Law of Leaky Abstractions" de Spolsky&lt;/a&gt;.&lt;br /&gt;[1] Existen sistemas que tienen diversos enfoques o paradigmas, que yo asimilaría a distintas ramas evolutivas. La tesis de Dollo aplicada a los sistemas informáticos sería válida sólo en el progreso de una rama evolutiva. En diversas ramas evolutivas se pueden dar una tendencia y la contraria, claro...&lt;br /&gt;[2] Hablé hace tiempo de esta ley en &lt;a href="http://yapw.blogspot.com/2006/01/la-ley-de-dollo-y-los-sistemas.html"&gt;La ley de Dollo y los sistemas informáticos&lt;/a&gt;&lt;br /&gt;[3] Otro ejemplo de dicho paralelismo podría ser el del &lt;a href="http://es.wikipedia.org/wiki/Monocultivo"&gt;monocultivo&lt;/a&gt;, del que escribí hace ya mucho en &lt;a href="http://barrapunto.com/~mig21/journal/3116"&gt;Los peligros del monocultivo&lt;/a&gt; y &lt;a href="http://barrapunto.com/~mig21/journal/8102"&gt;Los peligros del monocultivo (de nuevo)&lt;/a&gt;&lt;br /&gt;[4] Conviene recordar un par de &lt;em&gt;&lt;a href="http://barrapunto.com/~mig21/journal/22765"&gt;mantras&lt;/a&gt;&lt;/em&gt; clásicos: &lt;em&gt;"Controlar la complejidad es la esencia de la programación de ordenadores" de Brian Kernighan&lt;/em&gt; y &lt;em&gt;"Cualquier problema de computación puede ser resuelto con un nuevo nivel de indirección, excepto si el problema es que hay demasiados niveles de indirección" de David Wheeler&lt;/em&gt; (&lt;a href="http://en.wikipedia.org/wiki/David_Wheeler_(computer_scientist)"&gt;La exactitud de esta última es dudosa&lt;/a&gt;, pero me gusta esa versión)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29775"&gt;La misma entrada y más comentarios en &lt;em&gt;¿Demasiadas capas de abstracción?&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1463851079577378624?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1463851079577378624/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1463851079577378624' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1463851079577378624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1463851079577378624'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/05/demasiadas-capas-de-abstraccin.html' title='¿Demasiadas capas de abstracción?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-190828780483004701</id><published>2008-05-05T15:56:00.001+02:00</published><updated>2008-05-05T15:59:04.502+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='P2P'/><category scheme='http://www.blogger.com/atom/ns#' term='ficheros'/><category scheme='http://www.blogger.com/atom/ns#' term='verificación'/><category scheme='http://www.blogger.com/atom/ns#' term='corrección'/><title type='text'>Reparación de ficheros vía P2P</title><content type='html'>Me ha parecido curiosa esta historia de slashdot: &lt;a href="http://tech.slashdot.org/article.pl?sid=08/05/04/2230252"&gt;usar la comprobación de integridad de los sistemas P2P, en este caso BitTorrent, para verificar y corregir un fichero corrupto&lt;/a&gt;. Muy útil en casos en los que no se disponga de un gran ancho de banda...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29657"&gt;La misma entrada y más comentarios en &lt;em&gt;Reparación de ficheros vía P2P&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-190828780483004701?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/190828780483004701/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=190828780483004701' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/190828780483004701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/190828780483004701'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/05/reparacin-de-ficheros-va-p2p.html' title='Reparación de ficheros vía P2P'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1410660864162082143</id><published>2008-05-02T17:05:00.003+02:00</published><updated>2008-05-02T17:11:55.078+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='MPI'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Varios sobre concurrencia: Erlang, MPI y C++0x</title><content type='html'>Varios rápidos sobre concurrencia;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jkndrkn.livejournal.com/205249.html"&gt;Erlang Versus MPI - Final Results and Source Code&lt;/a&gt;: Midiendo el rendimiento de &lt;a href="http://es.wikipedia.org/wiki/Erlang"&gt;Erlang&lt;/a&gt; contra &lt;a href="http://es.wikipedia.org/wiki/MPI"&gt;MPI&lt;/a&gt;. Como todas las comparativas, seguramente es cuestionable, pero da mejor resultado en general a MPI. Proporciona fuentes de los tests. &lt;a href="http://reddit.com/r/programming/info/6hwvo/comments/"&gt;Más comentarios en programing reddit (posteado por un servidor :) )&lt;/a&gt;&lt;/li&gt;&lt;li&gt;También &lt;a href="http://reddit.com/r/programming/info/6hw71/comments/"&gt;vía programming reddit&lt;/a&gt; (éste posteado por el &lt;a href="http://reddit.com/user/gst/"&gt;&lt;em&gt;bot oficial&lt;/em&gt;, gst&lt;/a&gt;) &lt;a href="http://20bits.com/2008/05/02/network-programming-in-erlang/"&gt;Network Programming in Erlang&lt;/a&gt;, una introducción sencillita e interesante.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.justsoftwaresolutions.co.uk/files/future_of_concurrency.pdf"&gt;The Future of Concurrency in C++ (pdf)&lt;/a&gt;. Una presentación que repasa las novedades referentes a concurrencia aprobadas para C++0x y algunas cosas más. Vía &lt;a href="http://groups.google.com/group/comp.programming.threads/browse_frm/thread/8067b1abd52c0d55#"&gt;&lt;tt&gt;comp.programming.threads&lt;/tt&gt;&lt;/a&gt; (sí, aún hay gente que lee &lt;a href="http://es.wikipedia.org/wiki/Usenet"&gt;Usenet&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29630"&gt;La misma entrada y más comentarios en &lt;em&gt;Varios sobre concurrencia: Erlang, MPI y C++0x&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1410660864162082143?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1410660864162082143/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1410660864162082143' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1410660864162082143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1410660864162082143'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/05/varios-sobre-concurrencia-erlang-mpi-y.html' title='Varios sobre concurrencia: Erlang, MPI y C++0x'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1348977525818257019</id><published>2008-04-29T15:52:00.004+02:00</published><updated>2008-04-30T12:48:24.238+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automático'/><category scheme='http://www.blogger.com/atom/ns#' term='parche'/><category scheme='http://www.blogger.com/atom/ns#' term='seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='exploit'/><category scheme='http://www.blogger.com/atom/ns#' term='vulnerabilidad'/><title type='text'>Generación automática de exploits aprovechando los parches</title><content type='html'>La idea, hay que reconocerlo, es buenísima: crear automáticamente el programa que explotará la vulnerabilidad que trata de solucionar un parche mediante la información del mismo parche. La generación se realiza a través de la comparación entre el programa parcheado y el original. El artículo que desarrolla las posibles técnicas es &lt;a href="http://www.cs.cmu.edu/~dbrumley/pubs/apeg.pdf"&gt;Automatic Patch-Based Exploit Generation is Possible: Techniques and Implications&lt;/a&gt;. Parece que la cosa últimamente va de diferencias binarias :) (como en &lt;a href="http://yapw.blogspot.com/2008/04/actualizando-el-kernel-linux-sin.html"&gt;Actualizando el kernel Linux sin reiniciar &lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Más comentarios en &lt;a href="http://www.schneier.com/blog/archives/2008/04/reverseengineer.html"&gt;Bruce Schneier: Reverse-Engineering Exploits from Patches&lt;/a&gt;, &lt;a href="http://reddit.com/r/programming/info/6gvgd/comments/"&gt;programming reddit: Automatic Patch-Based Exploit Generation&lt;/a&gt; y &lt;a href="http://lambda-the-ultimate.org/node/2793"&gt;LtU: Automatic Patch-Based Exploit Generation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; Como &lt;a href="http://icewinddale.blogspot.com/2008/04/generacin-automtica-de-exploits.html"&gt;Apunta Drizzt&lt;/a&gt; &lt;a href="http://www.zynamics.com/index.php?page=publications"&gt;en las publicaciones de la gente de bindiff&lt;/a&gt; se examina más detenidamente el tema de la comparación binaria. En la misma entrada Drizzt también aporta algún enlace más al respecto.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29605"&gt;La misma entrada y más comentarios en &lt;em&gt;Generación automática de "exploits" aprovechando los parches&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1348977525818257019?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1348977525818257019/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1348977525818257019' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1348977525818257019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1348977525818257019'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/04/generacin-automtica-de-exploits.html' title='Generación automática de &lt;em&gt;exploits&lt;/em&gt; aprovechando los parches'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1103844189493912927</id><published>2008-04-28T09:26:00.007+02:00</published><updated>2008-04-28T15:10:25.420+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mario Bunge'/><category scheme='http://www.blogger.com/atom/ns#' term='filosofía'/><category scheme='http://www.blogger.com/atom/ns#' term='existencialismo'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Entrevista a Mario Bunge</title><content type='html'>&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt;&lt;/em&gt; Si eres lector de planeta código y sólo te interesa el desarrollo, sáltate esta entrada. Pero es un enlace que me parece de &lt;em&gt;interés general&lt;/em&gt; :)&lt;br /&gt;&lt;br /&gt;Vía &lt;a href="http://lepisma.liblit.com/2008/04/28/elias-canetti-masa-y-poder/"&gt;Cuchitril Literario&lt;/a&gt; me encuentro con &lt;a href="http://www.elpais.com/articulo/cultura/frases/Heidegger/propias/esquizofrenico/elpepicul/20080404elpepicul_3/Tes"&gt;una buena pero breve entrevista a Mario Bunge&lt;/a&gt;. En ella se dice de la filosofía de &lt;a href="http://es.wikipedia.org/wiki/Martin_Heidegger"&gt;Heidegger&lt;/a&gt;:&lt;blockquote&gt;[...] se aprovechó de la tradición académica alemana según la cual lo incomprensible es profundo.&lt;/blockquote&gt;&lt;blockquote&gt;[...] fenomenología, existencialismo, esas cosas abstrusas que nadie entiende pero si usted dice que no entiende, pasa por tonto&lt;/blockquote&gt;O dicho de otro modo: no todas las veces que no entiendes algo es porque tú seas limitado. Plantéate que quizás no tenga ningún sentido...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://es.wikipedia.org/wiki/Mario_Bunge"&gt;Mario Bunge en la wikipedia&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29594"&gt;La misma entrada y más comentarios en &lt;em&gt;Entrevista a Mario Bunge&lt;/em&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1103844189493912927?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1103844189493912927/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1103844189493912927' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1103844189493912927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1103844189493912927'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/04/entrevista-mario-bunge.html' title='Entrevista a Mario Bunge'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6359225855801824744</id><published>2008-04-25T12:20:00.005+02:00</published><updated>2008-04-25T15:24:47.114+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='reinicio'/><category scheme='http://www.blogger.com/atom/ns#' term='hot fixes'/><category scheme='http://www.blogger.com/atom/ns#' term='en caliente'/><category scheme='http://www.blogger.com/atom/ns#' term='actualización'/><title type='text'>Actualizando el kernel Linux sin reiniciar</title><content type='html'>Leyendo el blog de &lt;a href="http://daniel.haxx.se/blog/2008/04/25/ksplice-allows-rebootless-kernel-fixes/"&gt;Daniel Stenberg&lt;/a&gt; me entero de que &lt;a href="http://web.mit.edu/ksplice/"&gt;ksplice&lt;/a&gt; ofrece la posibilidad de hacer actualizaciones de seguridad en el &lt;a href="http://www.kernel.org/"&gt;kernel Linux&lt;/a&gt; sin reiniciar, siempre y cuando los cambios no supongan modificaciones semánticas en los datos. Según el autor este tipo de modificaciones son aproximadamente un 80% del total de vulnerabilidades críticas. Es, aparentemente, el sueño de muchos administradores de sistemas...&lt;br /&gt;&lt;br /&gt;Más información en el artículo de presentación, &lt;a href="http://web.mit.edu/ksplice/doc/ksplice.pdf"&gt;Ksplice: An automatic system for rebootless Linux kernel security updates (pdf)&lt;/a&gt;, en la lista del kernel, &lt;a href="http://lkml.org/lkml/2008/4/23/330"&gt;A system for rebootless kernel security updates&lt;/a&gt; y en &lt;a href="http://reddit.com/r/programming/info/6gzcc/comments/"&gt;programming.reddit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29577"&gt;Actualizando el kernel Linux sin reiniciar en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6359225855801824744?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6359225855801824744/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6359225855801824744' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6359225855801824744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6359225855801824744'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/04/actualizando-el-kernel-linux-sin.html' title='Actualizando el kernel Linux sin reiniciar'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5128926831964230141</id><published>2008-04-24T22:34:00.003+02:00</published><updated>2008-04-24T22:43:19.939+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='volatile'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='corner case'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>La vida privada de volatile</title><content type='html'>El estándar de C(++) tiene unas cuantas &lt;a href="http://en.wikipedia.org/wiki/Corner_case"&gt;esquinitas&lt;/a&gt;. Seguramente &lt;a href="http://en.wikipedia.org/wiki/Volatile_variable"&gt;&lt;tt&gt;volatile&lt;/tt&gt;&lt;/a&gt; es una de ellas. Para aclarar el significado exacto de este &lt;em&gt;calificativo&lt;/em&gt; en &lt;a href="http://codingrelic.geekhold.com/2008/03/secret-life-of-volatile.html"&gt;Coding Relic han publicado &lt;em&gt;La vida privada de &lt;tt&gt;volatile&lt;/tt&gt;&lt;/em&gt;&lt;/a&gt;, en donde no solo se analiza la letra del estándar sino que se examina el código generado para &lt;a href="http://es.wikipedia.org/wiki/MIPS_(procesador)"&gt;MIPS&lt;/a&gt; en distintos casos.&lt;br /&gt;&lt;br /&gt;Conviene recordar los posibles usos de volatile, así como para qué no debe usarse:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.airs.com/blog/archives/154"&gt;How does the C "volatile" keyword really work?&lt;/a&gt; de Ian Lance Taylor. El resumen es bastante claro&lt;blockquote&gt;If you are using volatile for anything other than manipulating memory mapped hardware, or for very limited communication between threads, it is very likely that you are making a mistake. Think carefully about what volatile means and about what it does not mean. &lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;En la misma linea, &lt;a href="http://softwareblogs.intel.com/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/"&gt;Volatile: Almost Useless for Multi-Threaded Programming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Varias discusiones en usenet: &lt;a href="http://groups.google.com/group/comp.programming.threads/browse_frm/thread/399797d84a5c37d5/eb60e71097dd5755?tvc=1#eb60e71097dd5755"&gt;C++, volatile member functions, and threads&lt;/a&gt;, &lt;a href="http://groups.google.com/group/comp.programming.threads/browse_frm/thread/9c1a21dd394caf0a/2ded073b4464b89a?#2ded073b4464b89a"&gt;volatile guarantees?&lt;/a&gt; y &lt;a href="http://groups.google.com/group/comp.programming.threads/browse_frm/thread/29ea516c5581240e/2d8e1fdb131844b8?hl=en&amp;tvc=1#2d8e1fdb131844b8"&gt;Memory Barriers, Compiler Optimizations, etc.&lt;/a&gt;, todas ellas en &lt;tt&gt;comp.programming.threads&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;Una discusión sobre lo que es, que no es y que quizás debiera ser &lt;tt&gt;volatile&lt;/tt&gt; en &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html"&gt;Should volatile Acquire Atomicity and Thread Visibility Semantics?&lt;/a&gt;, lo que lleva a &lt;a href="http://barrapunto.com/~mig21/journal/7279"&gt;arreglar el modelo de memoria de C++&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29573"&gt;La vida privada de &lt;tt&gt;volatile&lt;/tt&gt; en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5128926831964230141?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5128926831964230141/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5128926831964230141' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5128926831964230141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5128926831964230141'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/04/la-vida-privada-de-volatile.html' title='La vida privada de &lt;tt&gt;volatile&lt;/tt&gt;'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1252445355593252883</id><published>2008-04-09T23:09:00.004+02:00</published><updated>2008-04-10T08:48:25.855+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='seguridad'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>La aritmética de punteros, su desbordamiento y la seguridad</title><content type='html'>Me he enterado vía &lt;a href="http://icewinddale.blogspot.com/2008/04/una-cambio-de-comportamiento-del-gcc.html"&gt;el valle del viento helado de una nueva polémica acerca de &lt;tt&gt;gcc&lt;/tt&gt; y su implementación&lt;/a&gt;. El hecho es que &lt;a href="http://www.airs.com/blog/archives/174"&gt;&lt;strong&gt;&lt;tt&gt;gcc&lt;/tt&gt; cambió su comportamiento en cuanto a comparaciones entre punteros &lt;em&gt;incrementados&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; y ha provocado muchos meses después una &lt;a href="http://www.kb.cert.org/vuls/id/162289"&gt;alerta de seguridad desproporcionada y según los desarrolladores de gcc, falsa&lt;/a&gt; (Se puede oír desde aquí &lt;a href="http://gcc.gnu.org/ml/gcc/2008-04/msg00131.html"&gt;el ruido y la furia&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;El caso es que, entrando en profundidad, es una optimización casi "trivial" que hace que &lt;tt&gt;p + C1 &amp;lt; p + C2&lt;/tt&gt; pase a ser &lt;tt&gt;C1 &amp;lt; C2&lt;/tt&gt; sin tener en cuenta el posible desbordamiento (&lt;a href="http://en.wikipedia.org/wiki/Wrapping_(overflow)"&gt;&lt;em&gt;overflow&lt;/em&gt;&lt;/a&gt;) de ambas operaciones. Hay que decir además que el estándar (de C y de C++) declara &lt;strong&gt;&lt;em&gt;no definido&lt;/em&gt; el valor del resultado de la suma entre un puntero y un entero cuando se sobrepasa el tamaño del objeto al que apunta.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Es muy importante este último punto, porque deja traslucir un error de concepto: la comprobación de &lt;em&gt;overflow&lt;/em&gt; propuesta en la alerta(*) es muy burda porque sólo se comprueba el desbordamiento de la operación aritmética, no que nos estamos saliendo del rango permitido. Sin embargo &lt;strong&gt;lo que deben saber el programador y el programa&lt;/strong&gt; a la vez, cuando están manejando aritmética de punteros es cual es el desplazamiento (&lt;em&gt;offset&lt;/em&gt;) máximo, &lt;strong&gt;de cuanta memoria se dispone&lt;/strong&gt;. Si eso no lo sabe, es inútil cualquier otra comprobación...&lt;br /&gt;&lt;br /&gt;Hay que hacer notar además que la &lt;em&gt;optimización&lt;/em&gt; de la que se habla aquí la aplican casi todos los compiladores y lo que provoca la alerta es en realidad el cambio de comportamiento, no que sea incorrecto.&lt;br /&gt;&lt;br /&gt;También recuerda esto que es muy mala política basar el código en detalles de implementación específicos de la plataforma. En este caso y en muchos otros, los desarrolladores de &lt;tt&gt;gcc&lt;/tt&gt; tiran de cita del estándar para argumentar sus decisiones. Los &lt;a href="http://kerneltrap.org/mailarchive/linux-kernel/2007/10/26/359162"&gt;usuarios se quejan, llamándoles &lt;em&gt;abogados del lenguaje&lt;/em&gt; (language lawyer)&lt;/a&gt; pero en momentos como esos hay que recordar que probablemente están defendiendo sus decisiones de implementación y &lt;a href="http://dreamsongs.com/WorseIsBetter.html"&gt;lo importante de esas decisiones para el éxito de una tecnología&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(*)&lt;tt&gt;char *buf;&lt;br /&gt; int len;&lt;br /&gt; len = 1 &amp;lt;&amp;lt; 30;&lt;br /&gt; if (buf+len &amp;lt; buf){   Overflow } &lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29454"&gt;La aritmética de punteros, su desbordamiento y la seguridad en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1252445355593252883?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1252445355593252883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1252445355593252883' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1252445355593252883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1252445355593252883'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/04/la-aritmtica-de-punteros-y-su.html' title='La aritmética de punteros, su desbordamiento y la seguridad'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-4881669337757273316</id><published>2008-04-01T12:34:00.003+02:00</published><updated>2008-04-01T23:36:53.919+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herb Sutter'/><category scheme='http://www.blogger.com/atom/ns#' term='lambda'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='closure'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='clausura'/><category scheme='http://www.blogger.com/atom/ns#' term='Bjarne Stroustrup'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><title type='text'>Un par de enlaces más (sobre C++)</title><content type='html'>Sólo un par de enlaces más para complementar la entrada anterior, &lt;a href="http://yapw.blogspot.com/2008/03/otra-entrevista-stroustrup.html"&gt;la entrevista con Stroustrup&lt;/a&gt; (lástima que hayan salido después, hubiesen quedado bien en la misma entrada...)&lt;ul&gt;&lt;li&gt;&lt;a href="http://developers.slashdot.org/article.pl?sid=08/03/30/1155216"&gt;La entrevista de Strosutrup comentada en Slashdot&lt;/a&gt;, sobre todo desde el punto de vista de la enseñanza del lenguaje. Como siempre, comentarios a la vez encendidos e interesantes...&lt;/li&gt;&lt;li&gt;&lt;a href="http://herbsutter.spaces.live.com/Blog/cns!2D4327CC297151BB!785.entry"&gt;Trip Report: February/March 2008 ISO C++ Standards Meeting de Herb Sutter&lt;/a&gt; en el que se repasa las últimas incorporaciones a &lt;a href="http://en.wikipedia.org/wiki/C++0x"&gt;C++0x&lt;/a&gt;. Destaca, por supuesto, la incorporación de &lt;a href="http://es.wikipedia.org/wiki/C%C3%A1lculo_lambda"&gt;funciones lambda&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/Clausura_%28inform%C3%A1tica%29"&gt;clausuras&lt;/a&gt;. Pero hay más, como la herencia de constructores...&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29377"&gt;Un par de enlaces más (sobre C++) en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-4881669337757273316?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/4881669337757273316/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=4881669337757273316' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4881669337757273316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/4881669337757273316'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/04/un-par-de-enlaces-ms-sobre-c.html' title='Un par de enlaces más (sobre C++)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5853773077064444349</id><published>2008-03-29T00:19:00.004+01:00</published><updated>2008-03-29T08:08:08.831+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='C++09'/><category scheme='http://www.blogger.com/atom/ns#' term='diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='Stroustrup'/><category scheme='http://www.blogger.com/atom/ns#' term='Bjarne Stroustrup'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>(Otra) entrevista a Stroustrup</title><content type='html'>Por si alguien había pensado que me había olvidado de &lt;a href="http://yapw.blogspot.com/search/label/C%2B%2B0x"&gt;C++0x&lt;/a&gt; y de &lt;a href="http://barrapunto.com/search.pl?op=journals&amp;nickname=mig21&amp;topic=&amp;query=Stroustrup"&gt;Stroustrup&lt;/a&gt; esta entrada viene a demostrar que no :) Uno no tiene porqué estar de acuerdo con &lt;a href="http://www.research.att.com/~bs/"&gt;Bjarne Stroustrup&lt;/a&gt;, incluso puede odiar C++ por las &lt;em&gt;milsetecientascincuetaydos&lt;/em&gt; razones por las que puede resultar odioso, pero lo que no se puede negar es que Bjarne ha tenido una gran influencia y sus opiniones son, por lo menos dignas de ser leídas. Algunas de las entrevistas que se le han hecho (incluso &lt;a href="http://www.edu-cyberpg.com/Technology/c++.html"&gt;alguna que no le han hecho&lt;/a&gt; ;) ) me suelen parecer intensas y con elementos para la reflexión.&lt;br /&gt;Pues bueno, &lt;strong&gt;&lt;a href="http://www.ddj.com/cpp/207000124"&gt;en DDJ le han hecho una nueva entrevista&lt;/a&gt;&lt;/strong&gt;. Extractaré lo que me ha interesado (Espero me sepan disculpar que no traduzca esta vez. Si me ha costado más de un mes hacer una nueva entrada no quiero imaginarme cuando publicaría esto con traducción...):&lt;br /&gt;&lt;br /&gt;Sobre los distintos paradigmas de programación:&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;No programming paradigm is best for everything&lt;/strong&gt;. What you have is a problem and a solution to it; then, you try to map that solution into code for execution. You do that with resource constraints and concerns for maintainability. Sometimes, that mapping is best done with OOP, sometimes with generic programming, sometimes with functional programming, etc.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OOP is appropriate where you can organize some key concepts into a hierarchy and manipulate the resulting classes through common base classes&lt;/strong&gt;. Please note that I equate OO with the traditional use of encapsulation, inheritance, and (run time) polymorphism. You can choose alternative definitions, but this one is well-founded in history. &lt;/blockquote&gt;&lt;br /&gt;Sobre C++0x:&lt;blockquote&gt;The progress on standard libraries has not been what I hoped for. We will get regular expressions, hash tables, threads, many improvements to the existing containers and algorithms, and a few more minor facilities. We will not get the networking library, the date and time library, or the file system library.&lt;/blockquote&gt;&lt;blockquote&gt;The standard will be finished in late 2008, but it takes forever to go through all the hoops of the ISO process. So, we must face the reality that "C++0x" may become C++10.&lt;/blockquote&gt;&lt;br /&gt;C++0x y el &lt;em&gt;multithreading&lt;/em&gt;:&lt;br /&gt;&lt;blockquote&gt;The new memory model and a task library was voted into C++0x in Kona. That provides a firm basis for share-memory multiprocessing as is essential for multicores. Unfortunately, it does not address higher-level models for concurrency such as thread pools and futures, shared memory parallel programming, or distributed memory parallel processing.&lt;/blockquote&gt;&lt;br /&gt;Consejos para el desarrollo en el mundo real. Me gusta especialmente cuando se recuerda el carácter complejo y casi orgánico de los sistemas (como &lt;a href="http://yapw.blogspot.com/2007/05/postel-o-dracn.html"&gt;Richard P. Gabriel en &lt;em&gt;Objects Have Failed&lt;/em&gt;&lt;/a&gt;):&lt;br /&gt;&lt;blockquote&gt;Think. Discuss with colleagues and potential users. Get a good first-order understanding of the problem domain. If possible, try to be a user of an existing system in that field. Then, without too much further agonizing, &lt;strong&gt;try to build a simplified system to try out the fundamental ideas of a design. That "simplified system" might become a throwaway experiment or it may become the nucleus of a complete system. I'm a great fan of the idea of "growing" a system from simpler, less complete, but working and tested systems.&lt;/strong&gt; To try out all the tool chains before making too grand plans.&lt;/blockquote&gt;Sobre las habilidades que les suelen faltar a los estudiantes:&lt;br /&gt;&lt;blockquote&gt;I saw so many students who simply didn't have the notion that code itself is a topic of interest and that well-structured code is a major time saver. The notion of organizing code to be sure that it is correct and maybe even for someone else to use and modify is alien: They see code as simply something needed to hand in the answers to an exercise.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Vía &lt;a href="http://reddit.com/r/programming/info/6dova/comments/"&gt;programming.reddit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29350"&gt;"(Otra) entrevista a Stroustrup" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5853773077064444349?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5853773077064444349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5853773077064444349' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5853773077064444349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5853773077064444349'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/03/otra-entrevista-stroustrup.html' title='(Otra) entrevista a Stroustrup'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6950037010916848103</id><published>2008-02-20T18:52:00.004+01:00</published><updated>2008-02-21T09:08:36.994+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='asignador de memoria'/><category scheme='http://www.blogger.com/atom/ns#' term='allocator'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><title type='text'>Firefox usará el asignador de memoria experimental de FreeBSD</title><content type='html'>Leo en (cómo no...) en &lt;a href="http://reddit.com/r/programming/info/69dxa/comments/"&gt;programming.reddit&lt;/a&gt; que &lt;a href="http://ventnorsblog.blogspot.com/2008/02/beta-3.html"&gt;Firefox 3 beta 3 utiliza el asignador de memoria dinámica experimental de FreeBSD (&lt;tt&gt;jemalloc&lt;/tt&gt;) en lugar del asignador de la plataforma de ejecución&lt;/a&gt;. Al parecer ha dado buenos resultados en cuanto velocidad y reducción de la fragmentación en los test de rendimiento para las tres plataformas mayoritarias (Windows, Mac OS X y Linux)&lt;br /&gt;&lt;br /&gt;Para el que esté interesado en estos temas hay disponible un artículo muy interesante sobre &lt;tt&gt;jemalloc&lt;/tt&gt;: &lt;a href="http://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf"&gt;A Scalable Concurrent malloc(3) Implementation for FreeBSD (pdf)&lt;/a&gt; en el que se explica su implementación, que coge ideas entre otros de &lt;a href="http://www.hoard.org/"&gt;hoard&lt;/a&gt;, y ciertamente tiene muy buena pinta. Hablé de hoard hace poco en &lt;a href="http://yapw.blogspot.com/2007/12/problemas-de-memoria-y-algunas.html"&gt;Problemas de memoria (y algunas soluciones)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/29015"&gt;Firefox usará el asignador de memoria de FreeBSD en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6950037010916848103?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6950037010916848103/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6950037010916848103' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6950037010916848103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6950037010916848103'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/02/firefox-usar-el-asignador-de-memoria-de.html' title='Firefox usará el asignador de memoria experimental de FreeBSD'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5977141280439784747</id><published>2008-02-13T22:52:00.007+01:00</published><updated>2008-02-15T08:48:58.033+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='estándares'/><category scheme='http://www.blogger.com/atom/ns#' term='planificador de linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='errores fatales'/><category scheme='http://www.blogger.com/atom/ns#' term='estándar'/><category scheme='http://www.blogger.com/atom/ns#' term='Postel'/><category scheme='http://www.blogger.com/atom/ns#' term='errores'/><category scheme='http://www.blogger.com/atom/ns#' term='sistemas operativos'/><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='win32'/><category scheme='http://www.blogger.com/atom/ns#' term='POSIX'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><title type='text'>Notas sobre errores fatales y portabilidad</title><content type='html'>Es escasa y dispersa la información que he encontrado acerca de la gestión de errores fatales en distintos sistemas operativos y lo que afecta al funcionamiento de los programas sobre ellos. Así que voy a juntar lo que he ido recopilando en una sola entrada. Puede ser un poco batiburrillo, pero igual le es de utilidad a alguien... (Para mi seguro, que así no pierdo los enlaces). Ordenadas de general a específico[1]:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;En &lt;em&gt;&lt;a href="http://es.wikipedia.org/wiki/ANSI_C#ANSI_C_e_ISO_C"&gt;ANSI C&lt;/a&gt;&lt;/em&gt; existe &lt;tt&gt;signal&lt;/tt&gt; que permite cambiar la gestión este tipo eventos, entre los que se encuentran &lt;tt&gt;SIGSEGV&lt;/tt&gt;, violación de segmento y &lt;tt&gt;SIGFPE&lt;/tt&gt;, error aritmético. No obstante, por desgracia, su comportamiento en programas con más de un thread no está especificado. Además &lt;a href="http://www.csse.uwa.edu.au/programming/ansic-library.html#signal"&gt;por si fuese poco ANSI tampoco especifica el &lt;em&gt;handler&lt;/em&gt; por defecto&lt;/a&gt;, es decir, qué es lo que pasa si salta una señal de ese tipo.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;De hecho, de los que he probado, en windows con la librería de C del VisualStudio al menos, las señales funcionan por thread y en linux es global por proceso...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;En &lt;a href="http://es.wikipedia.org/wiki/POSIX"&gt;POSIX&lt;/a&gt; si que se define el comportamiento por defecto de las señales. En concreto &lt;tt&gt;SIGSEGV&lt;/tt&gt; y &lt;tt&gt;SIGFPE&lt;/tt&gt; &lt;strong&gt;abortan el proceso completo &lt;/strong&gt;. Se pueden ver los comportamientos por defecto de las distintas señales en POSIX en la &lt;a href="http://www.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html"&gt;documentación de &lt;tt&gt;&amp;lt;signal.h&amp;gt;&lt;/tt&gt; del OpenGroup&lt;/a&gt;. Además, POSIX(R) recomienda pasarse a &lt;tt&gt;sigaction&lt;/tt&gt; (que sólo es POSIX(R), no ANSI).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/xdkz3x12(VS.71).aspx"&gt;Windows NT  no genera señal de violación de segmento, pero se le puede instalar &lt;em&gt;handler&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;En &lt;tt&gt;&lt;a href="http://es.wikipedia.org/wiki/Win32"&gt;win32&lt;/a&gt;&lt;/tt&gt; un error fatal se gestiona como una &lt;a href="http://www.microsoft.com/msj/0197/exception/exception.aspx"&gt;excepción estructurada (SHE)&lt;/a&gt; que en C++ se mapea a un excepción &lt;em&gt;normal&lt;/em&gt;[2]. Además, una excepción estructurada no capturada, por defecto, supone &lt;strong&gt;la muerte del thread &lt;/strong&gt; en el que se produce, pero  &lt;strong&gt;no del proceso global &lt;/strong&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Existe una forma de sobrescribir este comportamiento por defecto y es &lt;a href="http://msdn2.microsoft.com/en-us/library/ms680634(VS.85).aspx"&gt;SetUnhandledExceptionFilter&lt;/a&gt;. Recomiendan en &lt;a href="http://www.nynaeve.net/"&gt;Nynaeve&lt;/a&gt;[3] &lt;a href="http://www.nynaeve.net/?p=128"&gt;no hacer cosas demasiado complicadas en el manejador&lt;/a&gt;, como parece lógico.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;En un artículo de DeveloperWorks comentan un modo de convertir señales en excepciones pero que es un &lt;em&gt;hack&lt;/em&gt; completamente erróneo: &lt;a href="http://www-128.ibm.com/developerworks/library/l-cppexcep.html?ca=dnt-68"&gt;C++ exception-handling tricks for Linux&lt;/a&gt; porque da a entender que se puede replicar el comportamiento por defecto de Windows. Sin embargo, como se puede leer en &lt;a href="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_21.html#SEC336"&gt;"Program Error Signals" de la documentación de la &lt;tt&gt;glibc&lt;/tt&gt;&lt;/a&gt;:&lt;blockquote&gt;La acción por defecto de todas estas señales es terminar el proceso. Si se bloquean o ignoran estas señales o se establece un &lt;em&gt;handler&lt;/em&gt; que retorna normalmente, tu programa &lt;em&gt;cascará&lt;/em&gt; espantosamente en el momento en que suceda la señal &lt;em&gt;no ser que(*)&lt;/em&gt; haya sido generada a través de &lt;tt&gt;raise&lt;/tt&gt; o &lt;tt&gt;kill&lt;/tt&gt; en lugar de un error real. &lt;/blockquote&gt;cosa que he podido comprobar con el código de DW tratando de ignorar una violación de segmento.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;En resumen, lo más juicioso (y homogéneo entre plataformas) sería &lt;strong&gt;parar el proceso completo en caso de uno de estos errores y tratar de informar lo más completamente posible del error&lt;/strong&gt;. En caso de &lt;tt&gt;win32&lt;/tt&gt; habría que forzar el fin del proceso, ya que no es la acción por defecto[4].&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;[1]El orden es de mayor a menor, de general a específico. Debería ser obvio para un programador: a igualdad de condiciones, se debería usar lo que funcione en el estándar más aceptado y amplio ¿por qué limitar el ámbito de aplicación? Primero, buscar en ANSI, y si la funcionalidad no está elegir &lt;strong&gt;conscientemente&lt;/strong&gt; una solución más específica. En el fondo para mi no es más que una consecuencia de la &lt;a href="http://yapw.blogspot.com/2007/05/postel-o-dracn.html"&gt;ley de Postel&lt;/a&gt; sobre el el código: "Cuanto más estricto (más estándar) es lo que escribes, más aumentarás la interoperabilidad". Puede parecer una obviedad, pero en esas pequeñas microdecisiones de los programadores no es  nada extraño usar &lt;em&gt;extensiones&lt;/em&gt; del estándar sin necesidad. Y en caso de necesidad se puede echar mano de librerías libres, muchas de ellas con un alto nivel de portabilidad.&lt;br /&gt;&lt;br /&gt;[2]Pongo en cursiva normal porque entra la duda si en esos casos, de tan bajo nivel, una excepción, que se confunde con excepciones de de otro tipo, es lo más clarificador para el usuario-programador, máxime cuando el &lt;em&gt;C++ estándar&lt;/em&gt; no posee excepciones para gestionar estos casos...&lt;br /&gt;&lt;br /&gt;[3]Un blog que he descubierto hace poco... interesante. Además sobre el mismo tema: &lt;a href="http://www.nynaeve.net/?p=43"&gt;Beware of custom unhandled exception filters in DLLs&lt;/a&gt; y &lt;a href="http://www.nynaeve.net/?p=44"&gt;You might be using unhandled exception filters without even knowing it&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[4]Cabe preguntarse porque se permite la ejecución del proceso en un caso tan excepcional... habida cuenta además de que una &lt;a href="http://msdn2.microsoft.com/en-us/library/ac9f67ah(VS.80).aspx"&gt;excepción no capturada de de C++ provoca, por defecto el fin del proceso...&lt;/a&gt; En este caso está sin duda justificado el &lt;em&gt;&lt;a href="http://barrapunto.com/~mig21/journal/11469"&gt;Fail Fast&lt;/a&gt;&lt;/em&gt;: lo que hay que hacer es arreglar el programa, no dejarlo seguir...&lt;br /&gt;&lt;br /&gt;(*)Me despisté al traducir. Gracias a &lt;a href="http://haciendose-el-sueco.blogspot.com/"&gt;Javier Noval&lt;/a&gt; por leerse los enlaces y hacerme notar el error ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28949"&gt;Notas sobre errores fatales y portabilidad en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5977141280439784747?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5977141280439784747/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5977141280439784747' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5977141280439784747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5977141280439784747'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/02/notas-sobre-errores-fatales-y.html' title='Notas sobre errores fatales y portabilidad'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-887900890033159077</id><published>2008-02-04T11:04:00.000+01:00</published><updated>2008-02-04T11:17:21.572+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tolerancia a fallos'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción no perfecta'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='errores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><title type='text'>(Otros) problemas con la memoria y (otras) soluciones</title><content type='html'>Alguien en &lt;a href="http://reddit.com/r/programming/"&gt;programming.reddit&lt;/a&gt; hizo una pregunta de esas difíciles: &lt;a href="http://reddit.com/r/programming/info/67c6q/comments/"&gt;¿Cómo manejar en un programa en C los casos en los que la memoria se agota?&lt;/a&gt; Y digo que es una de esas preguntas difíciles porque depende del tipo de software que estás haciendo, de su criticidad y del nivel requerido de robustez. Ya se sabe, &lt;a href="http://barrapunto.com/~mig21/journal/11469"&gt;el difícil compromiso de la gestión de errores críticos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Y como se ve en las respuestas de los &lt;em&gt;redditenses&lt;/em&gt; no sólo depende de nuestro sistema, sino de detalles de implementación de más abajo, como suele ser usual en los casos no del todo raros en los que &lt;a href="http://barrapunto.com/~mig21/journal/2757"&gt;las abstracciones que usamos comienzan a flaquear&lt;/a&gt;. En este caso se habla del comportamiento de Linux (el kernel) a la hora de tratar la falta de memoria, que por defecto usa una estrategia &lt;em&gt;optimista&lt;/em&gt; que deja reservar (pero no usar, claro) más memoria de la disponible. No obstante este comportamiento se puede cambiar a uno un poco más controlable a través del parámetro &lt;a href="http://www.linuxinsight.com/proc_sys_vm_overcommit_memory.html"&gt;&lt;tt&gt;overcommit_memory&lt;/tt&gt;&lt;/a&gt;, que se introdujo no hace tanto... El comportamiento por defecto es llamar al &lt;em&gt;OOM Killer&lt;/em&gt; que es un método tan drástico como poco predecible. Todo esto esta muy bien explicado en &lt;strong&gt;&lt;a href="http://www.linuxdevcenter.com/lpt/a/6808"&gt;When Linux Runs Out of Memory&lt;/a&gt;&lt;/strong&gt; que vi &lt;a href="http://mnm.uib.es/gallir/posts/2006/12/02/893/"&gt;referenciado por aquí en tiempos de mayor intensidad técnica :)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Además en las respuestas se apunta a un libro &lt;em&gt;online&lt;/em&gt; de los que vienen bien cuando las condiciones son más extremas de lo usual: &lt;strong&gt;&lt;a href="http://www.smallmemory.com/book.html"&gt;Small Memory Software. Patterns for systems with limited memory&lt;/a&gt;&lt;/strong&gt;. Apuntado en éste mi del.icio.us particular.&lt;br /&gt;&lt;br /&gt;(El título es "(Otros) problemas con la memoria y (otras) soluciones " porque no hace mucho escribí &lt;a href="http://yapw.blogspot.com/2007/12/problemas-de-memoria-y-algunas.html"&gt;Problemas de memoria (y algunas soluciones)&lt;/a&gt;, sobre el cuello de botella que supone la gestión de memoria sobre todo en sistemas &lt;em&gt;multicore&lt;/em&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28851"&gt;"(Otros) problemas con la memoria y (otras) soluciones" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-887900890033159077?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/887900890033159077/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=887900890033159077' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/887900890033159077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/887900890033159077'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/02/otros-problemas-con-la-memoria-y-otras.html' title='(Otros) problemas con la memoria y (otras) soluciones'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8773181271272055162</id><published>2008-01-22T10:32:00.000+01:00</published><updated>2008-01-22T10:36:04.684+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usuario'/><category scheme='http://www.blogger.com/atom/ns#' term='usabilidadad'/><category scheme='http://www.blogger.com/atom/ns#' term='primeras impresiones'/><category scheme='http://www.blogger.com/atom/ns#' term='estética'/><category scheme='http://www.blogger.com/atom/ns#' term='impresión'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='FoF'/><category scheme='http://www.blogger.com/atom/ns#' term='interfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='Frets on Fire'/><category scheme='http://www.blogger.com/atom/ns#' term='errores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Los usuarios y la primera impresión</title><content type='html'>Repasando la pila de cosas pendientes de leer me he encontrado con un inspiradísimo &lt;a href="http://www.knowing.net/"&gt;Larry O'Brien&lt;/a&gt; en una frase que es solo lateral en su razonamiento de que &lt;em&gt;&lt;a href="http://www.knowing.net/PermaLink,guid,fde0f610-3773-47b8-9be6-d6e5a8a76858.aspx"&gt;se nota más a los programadores muy malos que a los muy buenos&lt;/a&gt;&lt;/em&gt;&lt;blockquote&gt;Medir la satisfacción [para medir la calidad de un desarrollo] es un indicador insuficiente, porque la satisfacción tiende a ser un &lt;a href="http://es.wikipedia.org/wiki/%CE%94"&gt;delta&lt;/a&gt; de la última experiencia, no un valor absoluto.&lt;/blockquote&gt;Y es curiosísimo, porque tengo exactamente esa percepción tanto en un lado como en el otro, de programador y de usuario: &lt;em&gt;no importa lo que ocurra posteriormente a un error fatal del sistema; el sistema llevará para siempre ese estigma&lt;/em&gt;. Da igual que se corrigiese para siempre, en la siguiente versión. Para no ser absolutamente pesimistas, a nivel interno ayuda muchísimo que exista (y se use) un &lt;a href="http://reddit.com/r/programming/info/6250n/comments/"&gt;sistema de seguimiento de incidencias&lt;/a&gt;, que esté documentado cuándo, dónde y cómo se producía el problema y cuándo (desde que versión) y cómo se solucionó. A nivel externo... ya digo, un estigma :/ Aunque una labor continuada de comunicación, que tal mal se les suele dar a los desarrolladores, puede ayudar bastante...&lt;br /&gt;&lt;br /&gt;Es también por el miedo a que la primera impresión no sea buena por lo que muchos programadores se resisten al famoso &lt;em&gt;&lt;a href="http://catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/ar01s04.html"&gt;release early, release often&lt;/a&gt;&lt;/em&gt;. Pero no publicar versiones también es fuente de mala imagen, de eso los desarrolladores deben de ser conscientes... Y es que es difícil conjugar el causar una buena impresión con publicar pronto. Yo tengo en esto una política que no sé si es la más acertada, pero es la mía: minimizar la funcionalidad de la primera iteración, limitarla a lo esencial, que sea mínima pero bien testeada. Por cierto, que &lt;a href="http://www.joelonsoftware.com/items/2006/12/09.html"&gt;Joel no está de acuerdo con esta estrategia&lt;/a&gt; desde el punto de vista &lt;em&gt;estratégico/comercial/&lt;a href="http://en.wikipedia.org/wiki/Independent_software_vendor"&gt;ISV&lt;/a&gt;&lt;/em&gt;... Mucho que discutir desde distintas vertientes, incluido el modelo de negocio y de desarrollo de software, claro :)&lt;br /&gt;&lt;br /&gt;Por cierto que este mismo tema, desde el punto de vista estrictamente estético, fue tratado por &lt;a href="http://www.codinghorror.com/blog/archives/001007.html"&gt;Jeff Atwood con un ejemplo muy desafortunado, comparando &lt;em&gt;Frets on Fire&lt;/em&gt; con &lt;em&gt;Guitar Hero&lt;/em&gt;&lt;/a&gt;. No puedo ser imparcial en este caso porque estoy enganchado al &lt;a href="http://fretsonfire.sourceforge.net/"&gt;FoF&lt;/a&gt; en el que &lt;a href="http://upload.wikimedia.org/wikipedia/commons/1/15/Frets_On_Fire_-_logo.png"&gt;uno se puede creer que toca con el teclado&lt;/a&gt; como &lt;a href="http://es.wikipedia.org/wiki/Stevie_Ray_Vaughan"&gt;Stevie Ray Vaughan&lt;/a&gt; con su guitarra en &lt;a href="http://www.youtube.com/watch?v=tWLw7nozO_U"&gt;Texas Flood&lt;/a&gt;. Aquí, al menos para mi, es el sonido y no la imagen lo importante :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28718"&gt;Los usuarios y "la primera impresión" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8773181271272055162?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8773181271272055162/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8773181271272055162' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8773181271272055162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8773181271272055162'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2008/01/los-usuarios-y-la-primera-impresin.html' title='Los usuarios y &lt;em&gt;la primera impresión&lt;/em&gt;'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5093885439409879863</id><published>2007-12-05T17:01:00.000+01:00</published><updated>2007-12-06T10:16:47.863+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multicore'/><category scheme='http://www.blogger.com/atom/ns#' term='allocator'/><category scheme='http://www.blogger.com/atom/ns#' term='garbage collector'/><category scheme='http://www.blogger.com/atom/ns#' term='recolección de basura'/><category scheme='http://www.blogger.com/atom/ns#' term='recolector de basura'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><title type='text'>Problemas de memoria (y algunas soluciones)</title><content type='html'>&lt;p&gt;Gracias a &lt;a href="http://lambda-the-ultimate.org/node/2552"&gt;Lambda The Ultimate&lt;/a&gt; he encontrado un artículo muy ilustrativo sobre el típico &lt;em&gt;flame&lt;/em&gt; de &lt;em&gt;gestión automática de memoria contra gestión manual&lt;/em&gt;: &lt;a href="http://citeseer.ist.psu.edu/hertz05quantifying.html"&gt;Quantifying the Performance of Garbage Collection vs. Explicit Memory Management de Matthew Hertz, Yi Feng, Emery D. Berger&lt;/a&gt;. Si hacemos caso de sus conclusiones:&lt;blockquote&gt;Si las aplicaciones se ejecutan en sistemas con al menos tres veces más memoria RAM de la &lt;em&gt;necesaria&lt;/em&gt; entonces la recolección de basura proporciona un rendimiento razonable. Sin embargo si el sistema dispone de menos RAM o las aplicaciones tienen que competir con otras por memoria entonces se debe esperar que la recolección de basura traiga consigo un coste de rendimiento sustancial.&lt;/blockquote&gt;Como es sabido, no es blanco ni negro, sino que es una cuestión de &lt;em&gt;compromisos&lt;/em&gt;, pero al menos ahora tenemos algún dato para tomar la decisión. De todos modos el artículo tiene más cosas que esta conclusión: compara diversas estrategias de recolección de basura y tiene muchas referencias interesantes.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;A raíz de una de esas referencias me he encontrado con un &lt;a href="http://www.hoard.org/"&gt;asignador de memoria dinámica (&lt;em&gt;allocator&lt;/em&gt;): hoard,&lt;/a&gt; &lt;em&gt;curiosamente&lt;/em&gt; desarrollado por &lt;a href="http://prisms.cs.umass.edu/emery/"&gt;Emery Berger&lt;/a&gt;, uno de los autores del artículo anterior. Este asignador promete evitar uno de los grandes cuellos de botella de la programación con &lt;em&gt;threads&lt;/em&gt; y sistemas &lt;em&gt;multicore&lt;/em&gt;: la gestión de la memoria dinámica, el &lt;em&gt;heap&lt;/em&gt;. Citando también del primer artículo:&lt;blockquote&gt;En particular, las versiones recientes de &lt;a href="http://www.hoard.org/"&gt;hoard&lt;/a&gt; mantiene en el espacio local del thread la lista de los espacios libres (&lt;em&gt;freelist&lt;/em&gt;) y usa generalmente operaciones atómicas sólo cuando se sincronizan o se rellenan.&lt;/blockquote&gt;Muy interesante...&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28263"&gt;Problemas de memoria (y algunas soluciones) en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5093885439409879863?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5093885439409879863/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5093885439409879863' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5093885439409879863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5093885439409879863'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/12/problemas-de-memoria-y-algunas.html' title='Problemas de memoria (y algunas soluciones)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5953148102067046410</id><published>2007-11-29T13:52:00.000+01:00</published><updated>2007-11-29T16:58:25.611+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recursos'/><category scheme='http://www.blogger.com/atom/ns#' term='optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplataforma'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizar'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ensamblador'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Recursos para optimizar programas en C++ y ensamblador</title><content type='html'>Ya se sabe, &lt;em&gt;&lt;a href="http://en.wikiquote.org/wiki/Donald_Knuth"&gt;la optimización prematura es la raíz de todo mal&lt;/a&gt;&lt;/em&gt;. Pero hay veces que es necesario optimizar y en estos casos no viene mal una ayuda... Por un lado conocer la estructura de las arquitecturas modernas de uso común en cuanto a memoria y cachés. De eso ya se ha encargado &lt;a href="http://yapw.blogspot.com/2007/10/lo-que-todo-programador-debera-saber_04.html"&gt;Ulrich Drepper como hemos comentado hace poco por aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por otro lado, he encontrado gracias a &lt;a href="http://programming.reddit.com/info/614d7/comments/"&gt;programming.reddit&lt;/a&gt; una serie de recursos entre los que se encuentran documentos en pdf que podrían ayudarnos. Todos ellos están escritos por &lt;a href="http://www.agner.org/"&gt;Agner Fog&lt;/a&gt; y están reunidos en &lt;a href="http://www.agner.org/optimize/"&gt;Software optimization resources&lt;/a&gt;. Son bastante extensos y por lo que he ojeado con bastante información valiosa. De ellos destacaría (es el que más he mirado), &lt;a href="http://www.agner.org/optimize/optimizing_cpp.pdf"&gt;Optimizing software in C++ (An optimization guide for Windows, Linux and Mac platforms) (pdf)&lt;/a&gt; que repasa formas de  optimizar C++ reparando además en particularidades de plataformas y compiladores.&lt;br /&gt;&lt;br /&gt;Además hay también &lt;a href="http://www.agner.org/optimize/optimizing_assembly.pdf"&gt;una guía para para optimizar ensamblador para plataformas x86&lt;/a&gt;, &lt;a href="http://www.agner.org/optimize/instruction_tables.pdf"&gt;tablas con características de las instrucciones de Intel y AMD&lt;/a&gt;, programas de test y más enlaces. A disfrutar con la lectura, pero a usar con precaución ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28192"&gt;Recursos para optimizar programas en C++ y ensamblador en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5953148102067046410?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5953148102067046410/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5953148102067046410' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5953148102067046410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5953148102067046410'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/11/recursos-para-optimizar-programas-en-c.html' title='Recursos para optimizar programas en C++ y ensamblador'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8824937211459601418</id><published>2007-11-22T10:42:00.000+01:00</published><updated>2007-11-22T10:48:01.920+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='caché'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='CPU'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><title type='text'>Lo que todo programador debería saber sobre la memoria (pdf)</title><content type='html'>&lt;p&gt;&lt;a href="http://people.redhat.com/drepper/"&gt;Ulrich Drepper&lt;/a&gt; ha acabado de publicar &lt;em&gt;online&lt;/em&gt; &lt;a href="http://lwn.net/Articles/250967/"&gt;la serie de artículos acerca de la memoria, cachés en arquitecturas modernas de uso común y de lo que el programador puede hacer al respecto&lt;/a&gt;. Cuando comenzó ya lo comentamos por aquí en &lt;a href="http://yapw.blogspot.com/2007/10/lo-que-todo-programador-debera-saber_04.html"&gt;Lo que todo programador debería saber sobre la memoria&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Y como prometió lo ha publicado ahora en pdf: &lt;a href="http://people.redhat.com/drepper/cpumemory.pdf"&gt;"What Every Programmer Should Know About Memory" por Ulrich Drepper&lt;/a&gt;. Como puede ser que alguien interesado no se haya enterado de su existencia, la aparición del pdf puede ser un buen momento para recordarla...&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28139"&gt;Lo que todo programador debería saber sobre la memoria (pdf) en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8824937211459601418?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8824937211459601418/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8824937211459601418' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8824937211459601418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8824937211459601418'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/11/lo-que-todo-programador-debera-saber.html' title='Lo que todo programador debería saber sobre la memoria (pdf)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-345481244783379200</id><published>2007-11-08T11:08:00.000+01:00</published><updated>2007-11-08T15:54:14.654+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='mantras'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>Programando con threads: algunos enlaces</title><content type='html'>Algunos enlaces a tener en cuenta si programas con threads:&lt;ul&gt;&lt;li&gt;&lt;a href="http://ddj.com/cpp/202802983;jsessionid=0RYLSJGDQVQD0QSNDLPCKH0CJUNN2JVN?_requestid=130305"&gt;"Avoid Calling Unknown Code While Inside a Critical Section" por Herb Sutter&lt;/a&gt;. Como simepre, las secciones críticas cuanto más pequeñas mejor, pero además &lt;em&gt;conviene&lt;/em&gt; saber qué es lo que se llama en ellas... (Me recuerda un poco al &lt;em&gt;mantra&lt;/em&gt; &lt;strong&gt;&lt;a href="http://yapw.blogspot.com/2007/03/copiar-pegar-y-cdigo-de-produccin.html"&gt;Trata el código de los demás como si fuese tuyo&lt;/a&gt;&lt;/strong&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.airs.com/blog/archives/79"&gt;"Single Threaded Memory Model" de Ian Lance Taylor&lt;/a&gt;: como comentaba hace ya mucho en &lt;a href="http://barrapunto.com/~mig21/journal/7279"&gt;Los peligros de programar con threads&lt;/a&gt; el compilador puede llegar a hacer &lt;em&gt;optimizaciones&lt;/em&gt; que den al traste con la &lt;em&gt;intuitiva&lt;/em&gt; atomicidad de algunas variables cogidas por mutex. Pues bien, aparentemente ese problema que podría parecer remoto se puede reproducir con &lt;tt&gt;gcc&lt;/tt&gt;. La solución, como siempre, conocer bien el estándar y el uso de &lt;tt&gt;volatile&lt;/tt&gt;. De todos modos queda patente que se necesita algo parecido a un modelo de memoria que tenga en cuenta la concurrencia, como se comentaba también en &lt;a href="http://barrapunto.com/~mig21/journal/16075"&gt; Threads y C++(estándar)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://barrapunto.com/~mig21/journal/28011"&gt;  Programando con threads: algunos enlaces en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-345481244783379200?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/345481244783379200/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=345481244783379200' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/345481244783379200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/345481244783379200'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/11/programando-con-threads-algunos-enlaces.html' title='Programando con threads: algunos enlaces'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7297336874941189690</id><published>2007-10-18T23:16:00.000+02:00</published><updated>2007-10-18T23:19:12.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apología'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>El programador (una apología)</title><content type='html'>Me apetece hacer apología del puesto de programador, porque creo que es necesario por dos motivos fundamentales y relacionados: no se le considera un puesto apetecible por ser jerárquicamente bajo y no se tiene conciencia de que la experiencia en la programación sea útil. En resumen, que el puesto de programador no se considera de futuro[1]. Pero no es el futuro &lt;em&gt;profesional&lt;/em&gt; del programador[2] de lo que quiero hacer apología, sino de la labor del programador en si: difícil pero necesaria y apasionante[3].&lt;br /&gt;&lt;br /&gt;Los buenos programadores son imprescindibles para que este mundo funcione. En la eterna, manida y estéril discusión de las atribuciones profesionales se suele denostar la labor de programador en favor de la figura del &lt;em&gt;arquitecto de software&lt;/em&gt;. No voy a entrar aquí en lo importante de una buena dirección y coordinación en un proyecto de desarrollo (que lo es), sino de lo importante que es el trabajo &lt;em&gt;de base&lt;/em&gt;. Porque el de programador en un puesto intrínsecamente bajo desde el punto de vista jerárquico. ¿Significa eso que es un trabajo rutinario, sin retos ni creatividad? En absoluto. Es un trabajo &lt;em&gt;muy&lt;/em&gt; decisivo, a veces creativo y de gran responsabilidad casi por definición.&lt;br /&gt;&lt;br /&gt;Es difícil porque hacer software es intrínsecamente difícil[4][5] Y el creer que toda la dificultad se puede abstraer del programador hacia arriba en la jerarquía no deja de ser una especie de &lt;em&gt;pensamiento mágico&lt;/em&gt; alejado de toda realidad. Es prácticamente imposible hacer un análisis y diseño completos sin resquicios y teniendo en cuenta todos los &lt;em&gt;detalles&lt;/em&gt; del sistema final, tanto funcionales como de rendimiento y seguridad. Es muy frecuente que aparezcan aspectos dependientes de que la implementación sea óptima y adecuada al uso del sistema final.&lt;br /&gt;&lt;br /&gt;Es de una gran responsabilidad porque, entre otras cosas, es muy fácil hacerlo mal y no es trivial descubrirlo[6]. El programador moldea con sus manos el sistema final que va estar funcionando, transforma en realidad, en funcional, un concepto ideal. Y es el que más directamente que se da de bruces con las limitaciones del mundo real, de las herramientas y los sistemas. Es el que, si es brillante, es capaz de dar soluciones a esas limitaciones o al menos no acrecentarlas. Pero un programador no muy hábil o simplemente poco disciplinado o descuidado puede provocar errores, tanto fáciles de detectar como demasiado sutiles para ser detectados cuando deben, en la fase más temprana posible del desarrollo.[7]&lt;br /&gt;&lt;br /&gt;Tengo que decir que lo que yo entiendo por programador es lo que a veces se denomina "desarrollador", algo un poco más amplio que solo tirar líneas, pero me niego a renunciar a usar el término: me gusta decir programador, me gusta programar.&lt;br /&gt;&lt;br /&gt;[1] Y es posible que no lo sea :( Me gustaría pensar que, por lo que cuento después, lo es.&lt;br /&gt;[2] Bueno, hay muchos futuros dentro del desarrollo. Uno, ascender. Otro, especializarse. Pero bueno del futuro &lt;em&gt;profesional&lt;/em&gt; prefiero que hablen los comentaristas...&lt;br /&gt;[3] Obviamente hay mucho que comentar  de los aspectos sociales del programador, que pueden condicionar, pero no hablaré de ellos. Para saber más &lt;a href="http://www.dilbert.com/"&gt;pasa por aquí&lt;/a&gt; ( bueno, &lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Tom-DeMarco/dp/0932633439"&gt;o por aquí&lt;/a&gt;)&lt;br /&gt;[4] "The complexity of software is an essential property, not an accidental one. Hence, descriptions of a software entity that abstract away its complexity often abstract away its essence" &lt;a href="http://virtualschool.edu/mon/SoftwareEngineering/BrooksNoSilverBullet.html"&gt;No silver Bullet, Frederick P. Brooks&lt;/a&gt;&lt;br /&gt;[5] Un poco más actual: &lt;a href="http://www.gamearchitect.net/Articles/SoftwareIsHard.html"&gt;Software Is Hard, Kyle Wilson&lt;/a&gt;&lt;br /&gt;[6] Me gusta mucho la frase de &lt;a href="http://en.wikiquote.org/wiki/Brian_Kernighan"&gt;Brian Kernighan&lt;/a&gt;: "Depurar es el doble de difícil que escribir el código por primera vez. Entonces, si escribes código tan inteligentemente como te sea posible, no vas a ser, por definición, suficientemente listo para depurarlo" Depurar es otra habilidad quizás no demasiado valorada del programador experto.&lt;br /&gt;[7] Metodologías de desarrollo y/o testeo adecuadas y acordes con el proyecto aceleran la caza de errores, pero la disciplina y experiencia del programador son la base del desarrollo de calidad.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27802"&gt;"El programador (una apología)" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7297336874941189690?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7297336874941189690/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7297336874941189690' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7297336874941189690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7297336874941189690'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/10/el-programador-una-apologa.html' title='El programador (una apología)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1770024485909882912</id><published>2007-10-10T11:01:00.000+02:00</published><updated>2007-10-10T17:11:31.270+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libros'/><category scheme='http://www.blogger.com/atom/ns#' term='atención parcial continuada'/><category scheme='http://www.blogger.com/atom/ns#' term='libro'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='promoción'/><category scheme='http://www.blogger.com/atom/ns#' term='sobrecarga informativa'/><category scheme='http://www.blogger.com/atom/ns#' term='contenidos'/><title type='text'>¿Está acabando internet con el contenido extenso?</title><content type='html'>&lt;p&gt;Se suele recordar mucho últimamente que &lt;a href="http://es.wikipedia.org/wiki/Video_Killed_the_Radio_Star"&gt;el vídeo mató a la estrella de la radio&lt;/a&gt; por aquello del cambio de formato y de la (no) adaptación de la industria musical a esos nuevos formatos. Lo mismo seguramente se puede ampliar al resto de los contenidos &lt;em&gt;culturales&lt;/em&gt;, en el amplio sentido de la palabra, y sobre todo al libro ¿Mató internet el contenido extenso? ¿Mató internet a los libros?&lt;/p&gt;&lt;p&gt;El caso es que últimamente he visto varios casos en los cuales el modo de publicación es controvertido porque se trata de contenidos de un volumen grande, más grande que un post de blog, para entendernos. Primero fue &lt;a href="http://udrepper.livejournal.com/17280.html"&gt;Ulrich Drepper que dudó que opción tomar&lt;/a&gt; y &lt;a href="http://udrepper.livejournal.com/17682.html"&gt;tomó la resolución de publicarlo por partes en LWN&lt;/a&gt;. &lt;a href="http://www.airs.com/ian/"&gt;Ian Lance Taylor&lt;/a&gt; ha publicado &lt;a href="http://www.airs.com/blog/archives/category/programming/"&gt;un número enorme de post, veinte, muy interesantes (para mi al menos ;) ) sobre enlazadores&lt;/a&gt;, pero demuestra claramente que el blog no sirve para crear contenidos amplios y legibles a la vez.&lt;/p&gt;&lt;p&gt;¿Cual es la tendencia? Hemos visto decaer sitios de generación y promoción de contenidos que premiaban calidad y extensión, como &lt;a href="http://www.kuro5hin.org/story/2007/9/20/22512/3936"&gt;k5&lt;/a&gt; o &lt;a href="http://libertonia.escomposlinux.org/story/2006/8/26/172116/149"&gt;libertonia&lt;/a&gt;. Triunfan sitios del tipo &lt;a href="http://digg.com/"&gt;digg&lt;/a&gt;, &lt;a href="http://reddit.com/"&gt;reddit&lt;/a&gt; o &lt;a href="http://meneame.net/"&gt;meneame&lt;/a&gt; en los que sólo se hace referencia y se extracta brevemente. No se me entienda mal, los sitios me parecen útiles, &lt;a href="http://programming.reddit.com/"&gt;programming.reddit&lt;/a&gt; y &lt;a href="http://meneame.net/?meta=tecnologia"&gt;tecnologia.meneame &lt;/a&gt; los visito y uso. Pero creo que tienden a ser autocontenidos, a quedarse más en si mismos que a servir para lo que probablemente deberían servir: promocionar contenido de calidad. Es la tendencia al minimalismo, tanto en la referencia como en el comentario: estos sistemas premian la brevedad y la concisión, con buenas razones, pero en perjuicio de contenido &lt;em&gt;espeso&lt;/em&gt; y en favor del impactante. &lt;a href="http://barrapunto.com/"&gt;/.&lt;/a&gt; en las dos versiones que uso estaría a medio camino, pero no se acaba de librar de este mal... Es el signo de los tiempos, en los que la &lt;a href="http://es.wikipedia.org/wiki/Sobrecarga_informativa"&gt;sobrecarga informativa va acompañada de atención parcial continuada&lt;/a&gt;...&lt;/p&gt;&lt;p&gt;Pues bueno, &lt;a href="http://www.charlespetzold.com/"&gt;Charles Petzold&lt;/a&gt;, que escribe mucho mejor que yo y que además tiene un buen &lt;em&gt;curriculum&lt;/em&gt; de libros espesos publicados reflexiona sobre ello en &lt;a href="http://www.charlespetzold.com/blog/2007/10/081247.html"&gt;Hard Work, No Pay: What's the Point?&lt;/a&gt;, teniendo en cuenta que lo hace, al menos en parte, desde el punto de vista de un autor. Se pregunta ¿por qué libros y no entradas en blogs? Y responde (citraduzco un poco al vuelo)&lt;blockquote&gt;Es fácil convencerse de que los pedacitos de prosa representan el nivel óptimo de granularidad de información. Es parte de la visión utópica de la web como una plétora de páginas débilmente enlazadas cuya sinergia genera toda la información que necesitamos. Esta ilusión está afectando a la manera en la que aprendemos y tengo miedo de que no tengamos una visión más amplia y completa que solo un libro puede proporcionar. Un buen autor encontrará una selva poco manejable de información y cortará una senda coherente para pasar a través de ella, a través de una narrativa que enlaza el material.&lt;/blockquote&gt;Respuesta que me ha gustado mucho porque ilustra muy bien el tipo de libros que deberían sobrevivir a la mencionada &lt;em&gt;sobrecarga informativa&lt;/em&gt;: aquellos que son capaces de establecer un poco de orden y hacer un poco más comprensible la &lt;a href="http://atalaya.blogalia.com/historias/48468"&gt;realidad fragmentada&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27698"&gt;¿Está acabando internet con el contenido extenso? en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1770024485909882912?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1770024485909882912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1770024485909882912' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1770024485909882912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1770024485909882912'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/10/se-est-acabando-con-el-contenido.html' title='¿Está acabando internet con el contenido extenso?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3208139822315460235</id><published>2007-10-04T09:00:00.001+02:00</published><updated>2007-11-22T10:47:08.185+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Drepper'/><category scheme='http://www.blogger.com/atom/ns#' term='caché'/><category scheme='http://www.blogger.com/atom/ns#' term='abstracción no perfecta'/><category scheme='http://www.blogger.com/atom/ns#' term='Sutter'/><category scheme='http://www.blogger.com/atom/ns#' term='rendimiento'/><category scheme='http://www.blogger.com/atom/ns#' term='CPU'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria'/><category scheme='http://www.blogger.com/atom/ns#' term='cuellos de botella'/><title type='text'>Lo que todo programador debería saber sobre la memoria</title><content type='html'>&lt;p&gt;Así titula &lt;a href="http://people.redhat.com/drepper/"&gt;Ulrich Drepper&lt;/a&gt; un artículo sobre &lt;a href="http://lwn.net/Articles/250967/"&gt;los posibles cuellos de botella que se generan en las arquitecturas modernas de uso común&lt;/a&gt;, explicando el comportamiento de las &lt;a href="http://en.wikipedia.org/wiki/CPU_cache"&gt;caches de CPU&lt;/a&gt;, el diseño de los controladores de memoria, el &lt;a href="http://es.wikipedia.org/wiki/DMA"&gt;DMA&lt;/a&gt;... Debería ser útil para esos momentos en los que las &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;abstracciones que usamos empiezan a fallar y debemos conocer lo que hay debajo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;El modo de publicarlo es un poco, bueno, llamémosle arcaico, pero nos conformaremos porque el contenido lo merece, y porque &lt;a href="http://udrepper.livejournal.com/17682.html"&gt;es el deseo del autor&lt;/a&gt;, claro... El caso es que se va a publicar por partes en &lt;a href="http://lwn.net"&gt;LWN.net&lt;/a&gt; y al comienzo serán accesibles solo para suscriptores y posteriormente para el resto. Al final publicarán la versión pdf que probablemente será muy interesante para imprimir. &lt;strong&gt;Actualización (22/11/07):&lt;/strong&gt; Ya está disponible la versión en pdf: &lt;a href="http://people.redhat.com/drepper/cpumemory.pdf"&gt;"What Every Programmer Should Know About Memory" por Ulrich Drepper&lt;/a&gt;&lt;/p&gt;&lt;p&gt;He ido actualizando esta entrada conforme se &lt;em&gt;han liberado&lt;/em&gt; las todas las partes del documento, muy interesantes:&lt;ul&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/250967/"&gt;What every programmer should know about memory, Part 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/252125/"&gt;Memory part 2: CPU caches&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/253361/"&gt;Memory part 3: Virtual Memory&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/254445/"&gt;Memory part 4: NUMA support&lt;/a&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/255364/"&gt;Memory part 5: What programmers can do&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/256433/"&gt;Memory part 6: More things programmers can do&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/257209/"&gt;Memory part 7: Memory performance tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/258154/"&gt;Memory part 8: Future technologies&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lwn.net/Articles/258188/"&gt;Memory part 9: Appendices and bibliographys&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Bonus Track&lt;/em&gt;&lt;/strong&gt;: Como creo que pega en esta entrada, pongo el link a unas charlas con diapositivas de &lt;a href="http://www.gotw.ca/"&gt;Herb Sutter&lt;/a&gt; sobre temas similares: &lt;a href="http://herbsutter.spaces.live.com/Blog/cns!2D4327CC297151BB!304.entry"&gt;Machine Architecture: Things Your Programming Language Never Told You&lt;/a&gt; (jejeje, Sutter y Drepper ¿lo mejor de los los dos mundos?)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27624"&gt;Lo que todo programador debería saber sobre la memoria en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3208139822315460235?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3208139822315460235/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3208139822315460235' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3208139822315460235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3208139822315460235'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/10/lo-que-todo-programador-debera-saber_04.html' title='Lo que todo programador debería saber sobre la memoria'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-721012122124527618</id><published>2007-10-02T17:31:00.000+02:00</published><updated>2007-10-02T17:51:56.217+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='¿humor?'/><category scheme='http://www.blogger.com/atom/ns#' term='Paul Graham Facts'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='Facts'/><title type='text'>Paul Graham Facts</title><content type='html'>&lt;a href="http://news.ycombinator.com/item?id=60357"&gt;Paul Graham Facts&lt;/a&gt;. Sólo apto para quien sepa quien es &lt;a href="http://www.paulgraham.com/"&gt;Paul Graham&lt;/a&gt; (bueno, y aún así...) Ejemplo: &lt;em&gt;Paul Graham is so good, he always tips using $2.56 cheques made out by Donald Knuth&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Actualización&lt;/strong&gt;: por si alguien es tan masoquista de quedarse con ganas de más: &lt;a href="http://geekz.co.uk/schneierfacts/"&gt;Bruce Schneier Facts&lt;/a&gt;. Espero que me sepan perdonar :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27607"&gt;Paul Graham Facts en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-721012122124527618?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/721012122124527618/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=721012122124527618' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/721012122124527618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/721012122124527618'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/10/paul-graham-facts.html' title='Paul Graham Facts'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8190530836625877680</id><published>2007-09-24T11:11:00.000+02:00</published><updated>2007-09-24T11:19:13.744+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intel'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria transaccional'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='compilador'/><title type='text'>Intel anuncia un compilador con memoria transaccional</title><content type='html'>&lt;p&gt;&lt;a href="http://softwarecommunity.intel.com/articles/eng/1460.htm"&gt;Intel está trabajando en un compilador&lt;/a&gt; que gestiona &lt;a href="http://yapw.blogspot.com/2006/12/memoria-transaccional-y-concurrencia.html"&gt;memoria transaccional&lt;/a&gt; y que está ya en estado de prototipo. Al parecer &lt;a href="http://softwarecommunity.intel.com/articles/eng/1460.htm"&gt;se puede descargar y usar&lt;/a&gt; y para hacernos una idea ponen un &lt;a href="http://softwarecommunity.intel.com/isn/Downloads/whatif/stm/intel_stmtest_virtual.cpp"&gt;miniejemplo de uso&lt;/a&gt;. Parece que esta tecnología está saltando de la investigación académica a &lt;em&gt;la industria&lt;/em&gt;, habrá que ir viendo lo que da de si, porque, como &lt;a href="http://yapw.blogspot.com/2007/02/ms-sobre-c0x-memoria-transaccional-y.html"&gt;ya comenté por aquí&lt;/a&gt;, &lt;a href="http://patricklogan.blogspot.com/2007/02/misguided-road-not-to-be-travelled.html"&gt;hay gente que no acaba de verlo claro&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27536"&gt;Intel anuncia un compilador con memoria transaccional en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8190530836625877680?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8190530836625877680/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8190530836625877680' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8190530836625877680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8190530836625877680'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/09/intel-anuncia-un-compilador-con-memoria.html' title='Intel anuncia un compilador con memoria transaccional'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7616542590102097856</id><published>2007-09-21T13:30:00.000+02:00</published><updated>2007-09-21T15:41:56.576+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de datos'/><category scheme='http://www.blogger.com/atom/ns#' term='reescritura'/><category scheme='http://www.blogger.com/atom/ns#' term='bases de datos relacionales'/><category scheme='http://www.blogger.com/atom/ns#' term='obsolescencia'/><title type='text'>¿Necesitan una reescritura las bases de datos relacionales?</title><content type='html'>&lt;p&gt;Hoy en &lt;a href="http://highscalability.com/paper-end-architectural-era-it-s-time-complete-rewrite"&gt;High Scalability&lt;/a&gt; enlazan a un artículo que 'denuncia' la obsolescencia del diseño e implementación de las actuales bases de datos relacionales: &lt;a href="http://web.mit.edu/dna/www/vldb07hstore.pdf"&gt;The End of an Architectural Era (It’s Time for a Complete Rewrite)&lt;/a&gt;. Con una implementación que tiene en cuenta las arquitecturas actuales con sus cuellos de botella en cuanto a CPU, memoria y recursos de red, como ajustar el tamaño de los &lt;a href="http://es.wikipedia.org/wiki/%C3%81rbol-B"&gt;árboles-B&lt;/a&gt; al tamaño de la &lt;a href="http://en.wikipedia.org/wiki/CPU_cache#Multi-level_caches"&gt;caché L2&lt;/a&gt; o hacer los procesos de consulta en cada nodo con un solo hilo han conseguido rebajar hasta en dos órdenes de magnitud en el test &lt;a href="http://www.tpc.org/tpcc/default.asp"&gt;TPC-C&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Este artículo forma una serie con &lt;a href="http://www.cs.brown.edu/~ugur/fits_all.pdf"&gt;“One Size Fits All”: An Idea Whose Time Has Come and Gone&lt;/a&gt; y &lt;a href="http://nms.csail.mit.edu/~stavros/pubs/osfa.pdf"&gt;One Size Fits All? – Part 2: Benchmarking Results&lt;/a&gt; en los que resalta no solo que el diseño y la implementación de los &lt;a href="http://es.wikipedia.org/wiki/RDBMS"&gt;RDBMS&lt;/a&gt; son algo obsoleto sino que no son lo más adecuado para todos los escenarios (como ya se han dado cuenta &lt;a href="http://barrapunto.com/~fernand0/journal/20814"&gt;los que se han encontrado con el problema&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Y ya un poco offtopic en este tema me gustaría resaltar una frase:&lt;blockquote&gt;In the programming language community, there has been an explosion of “little languages” such as Python, Perl, Ruby and PHP. The idea is that one should use the best language available for any particular task at hand. Also little languages are attractive because they are easier to learn than general purpose languages. From afar, this phenomenon apears to be the death of “one size fits all” in the programming language world&lt;/blockquote&gt; O sea que en el futuro se llevará el programador políglota (bueno, o no, &lt;a href="http://barrapunto.com/~McPolu/journal/26962"&gt;depende de quien mande...&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27505"&gt;¿Necesitan una reescritura las bases de datos relacionales? en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7616542590102097856?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7616542590102097856/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7616542590102097856' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7616542590102097856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7616542590102097856'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/09/necesitan-una-reescritura-las-bases-de.html' title='¿Necesitan una reescritura las bases de datos relacionales?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8470321501002221572</id><published>2007-09-06T11:21:00.000+02:00</published><updated>2007-09-06T11:31:42.533+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='Sam Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='amor'/><category scheme='http://www.blogger.com/atom/ns#' term='bala de plata'/><title type='text'>Sam Ruby y Erlang</title><content type='html'>&lt;p&gt;Asisto con una mezcla de envidia y escepticismo a la conversión a Erlang de &lt;a href="http://intertwingly.net/blog/"&gt;Sam Ruby&lt;/a&gt;. Sam Ruby es un típico &lt;a href="http://geneura.ugr.es/~jmerelo/atalaya/goleores.htm"&gt;goleor tecnológico &amp;#153;&lt;/a&gt; Siempre está a la última en cuanto a estándares y lenguajes sobre la web. De hecho, algunos &lt;a href="http://en.wikipedia.org/wiki/Sam_Ruby#Standardization_efforts"&gt;los hace él&lt;/a&gt; :) Como buen experimentador de tecnología, como buen gurú, hace sus apuestas de futuro. &lt;a href="http://intertwingly.net/blog/2007/08/14/Long-Bets-Apologia"&gt;La última apuesta de Ruby&lt;/a&gt;, muy interesante, es a varias bandas: &lt;a href="http://es.wikipedia.org/wiki/REST"&gt;REST&lt;/a&gt;, &lt;a href="http://lucene.apache.org/hadoop/"&gt;Hadoop&lt;/a&gt;, &lt;a href="http://www.erlang.org/"&gt;Erlang/OTP&lt;/a&gt; y los &lt;a href="http://es.wikipedia.org/wiki/Microformatos"&gt;Microformatos&lt;/a&gt;.&lt;p&gt;&lt;p&gt;Asisto con envidia sobre todo por la fase de enamoramiento compulsivo por la que está pasando (muy interesante para los demás, por cierto) con Erlang, aunque resulta extraña en alguien con tanta experiencia como él. Sino no se puede explicar que diga, en su &lt;a href="http://intertwingly.net/blog/2007/09/05/Atom-to-JSON-with-Erlang"&gt;última entrada&lt;/a&gt;, algo tan bonito como:&lt;blockquote&gt;Con muchos &lt;em&gt;frameworks&lt;/em&gt; y lenguajes, tengo la sensación de que estoy trabajando con un armario de metal con capas de pintura para barcos; cuando se le hace un &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;rasguño&lt;/a&gt; salen a relucir los bordes afilados. Con Erlang tengo la sensación de un armario victoriano de caoba; cuando uno raya en la madera simplemente sale a relucir más valiosa madera.&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;Pero este enamoramiento nos está dando a los demás la posibilidad de seguir sus pasos y disfrutar de su código, que no está nada mal... El último paso ha sido un &lt;a href="http://intertwingly.net/blog/2007/09/05/Atom-to-JSON-with-Erlang"&gt;conversor de Atom a JSON&lt;/a&gt;, pero anteriormente ha hecho alguna cosita más, como envíar &lt;a href="http://intertwingly.net/blog/2007/08/27/XHTML-IM-over-TLS-via-Erlang"&gt;XHTML-IM sobre TLS con Erlang&lt;/a&gt; y una pequeña entrada sobre &lt;a href="http://intertwingly.net/blog/2007/08/29/IPC-with-Erlang"&gt;Comunicación entre procesos en Erlang&lt;/a&gt;. A ver si dura :)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27345"&gt;Sam Ruby y Erlang en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8470321501002221572?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8470321501002221572/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8470321501002221572' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8470321501002221572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8470321501002221572'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/09/sam-ruby-y-erlang.html' title='Sam Ruby y Erlang'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5510655323260234169</id><published>2007-08-08T17:11:00.000+02:00</published><updated>2007-08-09T22:43:30.620+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='modestia'/><category scheme='http://www.blogger.com/atom/ns#' term='humildad'/><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Code'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='mantras'/><title type='text'>La humildad como virtud del programador</title><content type='html'>&lt;p&gt;Y no me refiero a modestia frente a los otros (que también puede ser una buena cualidad) sino humildad con uno mismo y con lo difícil de hacer realmente bien este trabajo. En este sentido, sin más, le cedo la palabra a &lt;a href="http://subtextual.org/AboutMe.htm"&gt;Jonathan Edwards&lt;/a&gt;, quien en &lt;a href="http://alarmingdevelopment.org/?p=79"&gt;Beautiful Code&lt;/a&gt; dice:&lt;blockquote&gt;Una lección que he aprendido por la vía difícil es que no somos lo suficientemente listos. Incluso los programadores más brillantes cometen errores estúpidos con frecuencia. No solo errores de tecleo (&lt;em&gt;typos&lt;/em&gt;) sino errores básicos de diseño que ponen en una situación difícil al código, y que a posteriori deberían haber sido obvios. La mente humana no es capaz de comprender en su conjunto la complejidad  de un programa de tamaño moderado, mucho menos los sistemas monstruosos que construimos hoy en día. Esta es la amarga pastilla que nos tenemos que tragar, porque programar atrae y recompensa al inteligente, y su cultura fomenta la arrogancia intelectual. Me ha ha sido de inmensa ayuda trabajar con el supuesto de que soy demasiado estúpido para hacer las cosas correctamente. Esto me hacer usar de modo conservador aquello que ha funcionado, testear cautelosamente las nuevas ideas antes de confiar en ellas y por encima de todo, apreciar la simplicidad.&lt;/blockquote&gt;Curiosamente habla de un libro que me gustaría mucho adquirir y &lt;a href="http://yapw.blogspot.com/2007/07/beautiful-code.html"&gt;cuya existencia comenté por aquí&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Sobre el mismo tema, me gustaría recordar una &lt;a href="http://barrapunto.com/~mig21/journal/1816"&gt;famosísima cita de Brian Kernighan&lt;/a&gt;:&lt;blockquote&gt;Depurar es el doble de difícil que escribir el código por primera vez. Entonces, si escribes código tan inteligentemente como te sea posible, no vas a ser, por definición, suficientemente listo para depurarlo.&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; Creo que no ha quedado claro (he escrito la entrada demasiado rápido), pero lo que me parece curioso del comentario de Jonathan Edwards, es que es una justificación de porqué no escribió en Beautiful Code a pesar de estar invitado para ello, con una explicación tan inspirada que irónicamente merecería estar en el libro... :)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27035"&gt;La humildad como virtud del programador en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5510655323260234169?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5510655323260234169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5510655323260234169' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5510655323260234169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5510655323260234169'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/08/la-humildad-como-virtud-del-programador.html' title='La humildad como virtud del programador'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3908557363944195660</id><published>2007-08-06T23:39:00.000+02:00</published><updated>2007-08-07T10:05:13.860+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bloqueos'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='lock-free structures'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>Varios sobre concurrencia: JVM, clasificaciones y consejos</title><content type='html'>&lt;p&gt;Una ración de enlaces relacionados con la programación concurrente:&lt;/p&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;El título lo dice todo: &lt;a href="http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=MetalMeetsJVM"&gt;Where the metal meets JVM (An interview with Cliff Click)&lt;/a&gt; (Encontrado vía &lt;a href="http://brigomp.blogspot.com/2007/07/sobre-programacin-multihilo-y-el-modelo.html"&gt;Pensamientos ágiles&lt;/a&gt;) Interesantísimo repaso a la implementación de la concurrencia en la máquina virtual de Java y de su relación con el hardware subyacente, con sutilezas en cuanto al modelo de memoria de cada arquitectura. Una buena conclusión, después de leerlos sería: &lt;a href="http://yapw.blogspot.com/2007/07/testeo-o-correccin.html"&gt;no te fíes de que funcione&lt;/a&gt;, estudia bien las especificaciones, no vaya a ser que te lleves sorpresas con el &lt;a href="http://en.wikipedia.org/wiki/Write_once,_run_anywhere"&gt;&lt;em&gt;run anyware&lt;/em&gt;&lt;/a&gt; ;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://barrapunto.com/comments.pl?sid=71927&amp;cid=938208"&gt;Gracias a sammael&lt;/a&gt;, dos artículos sobre también sobre el mismo tema: &lt;a href="http://www.ibm.com/developerworks/java/library/j-jtp04186/index.html?S_TACT=105AGX02&amp;S_CMP=EDU"&gt;Introduction to nonblocking algorithms&lt;/a&gt; y &lt;a href="http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html?S_TACT=105AGX02&amp;S_CMP=EDU"&gt;Synchronization optimizations in Mustang&lt;/a&gt;, ambos de Brian Goetz. Un vistazo a &lt;tt&gt;java.util.concurrent&lt;/tt&gt; y algunos detalles sobre el presente y futuro de la concurrencia en java. Complementarios al anterior.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ddj.com/hpc-high-performance-computing/201202924"&gt;Herb Sutter en "How Much Scalability Do You Have or Need?"&lt;/a&gt; vuelve a clasificar las soluciones para aprovechar la concurrencia del hardware; en este caso se clasifica mediante la escalabilidad que se necesita, desde usar un solo core hasta la explotación de todos los recursos disponibles.&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.thinkingparallel.com/2007/07/31/10-ways-to-reduce-lock-contention-in-threaded-programs/"&gt;"10 Ways to Reduce Lock Contention in Threaded Programs" de Michael Suess&lt;/a&gt;, que también cita a Goetz. Tanto el primer enlace como éste subrayan la dificultad de pasarse de listo y tratar de &lt;a href="http://yapw.blogspot.com/2007/02/estructuras-de-datos-sin-bloqueos.html"&gt;programar sin bloqueos&lt;/a&gt;. Aquí se califica de &lt;em&gt;optimización prematura&lt;/em&gt; y se proponen alternativas muy interesantes como &lt;em&gt;granularizar&lt;/em&gt; los bloqueos (y evitar el &lt;em&gt;big lock&lt;/em&gt; que seguramente debería ser la primera implementación...) o usar bloqueos de lectura o de escritura (si están disponibles y es posible). Se trataría del primer paso (los primeros diez pasos) en la optimización &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/27015"&gt;Varios sobre concurrencia: JVM, clasificaciones y consejos en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3908557363944195660?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3908557363944195660/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3908557363944195660' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3908557363944195660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3908557363944195660'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/08/varios-sobre-concurrencia-jvm.html' title='Varios sobre concurrencia: JVM, clasificaciones y consejos'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5052857841348756207</id><published>2007-07-26T10:31:00.000+02:00</published><updated>2007-11-30T13:37:33.723+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threading Building Blocks'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='TBB'/><category scheme='http://www.blogger.com/atom/ns#' term='paralelismo'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='lock-free structures'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>Un vistazo a Threading Building Blocks</title><content type='html'>&lt;p&gt;Según se puede leer en &lt;a href="http://arstechnica.com/news.ars/post/20070724-intel-open-sources-multicore-programming-tool.html"&gt;Ars technica: Intel open sources multicore programming tool&lt;/a&gt; Intel libera &lt;a href="http://www.threadingbuildingblocks.org/"&gt;Threading Building Blocks&lt;/a&gt;, una herramienta hasta ahora propietaria que ayuda a la programación concurrente. La noticia ha salido en muchos sitios con comentarios interesantes (&lt;a href="http://developers.slashdot.org/article.pl?sid=07/07/25/1324221"&gt;Slashdot&lt;/a&gt;, &lt;a href="http://osnews.com/comment.php?news_id=18323"&gt;OSNews&lt;/a&gt; o en &lt;a href="http://barrapunto.com/article.pl?sid=07/07/25/1124218"&gt;barrapunto&lt;/a&gt;) &lt;/p&gt;&lt;p&gt;Había oído hablar de esta herramienta en la &lt;a href="http://www.thinkingparallel.com/2007/04/03/ten-questions-with-sanjiv-shah-about-parallel-programming-and-openmp/"&gt;entrevista a Sanjiv Shah de OpenMP en thinking parallel&lt;/a&gt;, pero como él trabaja en Intel siempre parece más sospechoso tratándose de un producto comercial. Ahora que lo han liberado he estado echándole un vistazo y bueno, creo que tiene &lt;em&gt;su ámbito de aplicación&lt;/em&gt; y que puede ser muy interesante para facilitar algunas tareas sin reinventar alguna rueda.&lt;/p&gt;&lt;p&gt;Por analizar un poco la librería, consta como de cuatro partes:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Algortimos para bucles paralelos:&lt;/strong&gt; &lt;tt&gt;parallel_for&lt;/tt&gt;, &lt;tt&gt;parallel_reduce&lt;/tt&gt;, &lt;tt&gt;parallel_while&lt;/tt&gt;. Me ha parecido de lo más interesante de la librería porque es muy fácil de implementar y te ahorra mucha gestión. Al algoritmo se le pasa un contenedor sobre el que operar y un &lt;em&gt;functor&lt;/em&gt; y el lo procesa en paralelo &lt;em&gt;automágicamente&lt;/em&gt;, aunque parece ser algo parametrizable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Contenedores seguros a accesos concurrentes:&lt;/strong&gt; &lt;tt&gt;concurrent_hash_map&lt;/tt&gt;, &lt;tt&gt;concurrent_vector&lt;/tt&gt;, &lt;tt&gt;concurrent_queue&lt;/tt&gt;. Usan internamente los bloqueos &lt;em&gt;de grano fino&lt;/em&gt; y &lt;a href="http://yapw.blogspot.com/2007/02/estructuras-de-datos-sin-bloqueos.html"&gt;estructuras de datos sin bloqueos&lt;/a&gt;. Que bien que no haya que hacerlo por uno mismo, tiene pinta de ser complicadillo y muy fácil hacerlo mal&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Utilidades para gestión de la concurrencia:&lt;/strong&gt; mutexes de diverso tipo (si, &lt;a href="http://yapw.blogspot.com/2006/10/diseo-sencillo-contra-implementacin_03.html"&gt;recursivos también&lt;/a&gt;), locks, operaciones atómicas&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Un gestor de tareas:&lt;/strong&gt; una ayuda para programar orientado a tareas, threads más ligeros que los del sistema.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Desde que lo han hecho &lt;em&gt;opensource&lt;/em&gt; le han asignado un domino propio, &lt;a href="http://www.threadingbuildingblocks.org/"&gt;http://www.threadingbuildingblocks.org/&lt;/a&gt; en el que hay bastante información. En particular el tutorial al que le he echado un vistazo es &lt;a href="http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf"&gt;Intel® Threading Building Blocks: Tutorial&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Por dar alguna nota no positiva... bueno, de momento solo soporta plataformas desde Intel Pentium 4, porteriores y compatibles, aunque en una de las FAQ del proyecto &lt;a href="http://softwarecommunity.intel.com/tbbWiki/FAQ/591.htm"&gt;dicen que soportar todos los procesadores, sistemas operativos y compiladores es una las piedras angulares del proyecto&lt;/a&gt;. Veremos.&lt;/p&gt;&lt;p&gt;También me ha llamado la atención que dijesen (extraído del artículo de ars technica): &lt;blockquote&gt;Java and .NET versions of TBB are currently being evaluated by Intel, and may eventually be announced. But Intel maintains that C++ is the company's priority, and it's where they'll be focusing the engineering resources that they're adding to the project.&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;Puede ayudar a hacer un poco más multiplataforma el código paralelizado en C++, aunque ya existen muchas librerías que lo hacen, como &lt;a href="http://www.boost.org/doc/html/thread.html"&gt;Boost.Thread&lt;/a&gt;. Supongo que estará bien usarlo cuando se necesita mucho rendimiento, una aproximación más sencilla no vale y paralelizarlo de este modo sale rápido y óptimo.&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26897"&gt;Un vistazo a Threading Building Blocks en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5052857841348756207?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5052857841348756207/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5052857841348756207' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5052857841348756207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5052857841348756207'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/07/un-vistazo-threading-building-blocks.html' title='Un vistazo a Threading Building Blocks'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5380326406916528211</id><published>2007-07-23T10:11:00.000+02:00</published><updated>2007-07-23T13:31:37.902+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tolerancia a fallos'/><category scheme='http://www.blogger.com/atom/ns#' term='falacias'/><category scheme='http://www.blogger.com/atom/ns#' term='testeo'/><category scheme='http://www.blogger.com/atom/ns#' term='Fail Fast'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='pruebas'/><category scheme='http://www.blogger.com/atom/ns#' term='corrección'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='mantras'/><title type='text'>¿Testeo o corrección?</title><content type='html'>&lt;p&gt;Andaba yo descubriendo otro blog, el de &lt;a href="http://www.ddj.com/blog/cppblog/archives/freelancer_blog/index.html"&gt;Andrew Koenig&lt;/a&gt;, cuando, a raíz de dos post suyos seguidos (uno de aserciones contra excepciones y otro sobre la depuración) he reparado en el tema... últimamente se hace mucho hincapié en el &lt;a href="http://es.wikipedia.org/wiki/Tdd"&gt;desarrollo guiado por pruebas&lt;/a&gt;, pero según se puede ver en el segundo post, hay veces que las pruebas, e incluso el uso, no son garantía de corrección.&lt;/p&gt;&lt;p&gt;Por eso es tan importante que las pruebas sean realistas. Por eso es tan importante extraer información del sistema en todas la etapas del ciclo de vida. Por eso es tan importante un buen sistema de registro del sistema. Pero sobre todo, por eso es importante &lt;a href="http://yapw.blogspot.com/2007/06/el-mejor-cdigo-es-el-que-no-existe.html"&gt;pensar bien antes de codificar&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;También me ha recordado uno esos principios de desarrollo polémicos: &lt;a href="http://barrapunto.com/~mig21/journal/11469"&gt; Los fallos, cuanto antes mejor (Fail Fast)&lt;/a&gt;. Es uno de los principios en el diseño de Erlang. Como dice &lt;a href="http://ddj.com/dept/opensource/201001928?cid=RSSfeed_DDJ_OpenSource"&gt;Joe Armstrong en una entrevista reciente&lt;/a&gt;: &lt;blockquote&gt;La filosofía de Erlang fue siempre construir sistemas con un montón de procesadores baratos y permitir que fallen. No prevenimos el fallo; vivimos con él y recuperamos el sistema cuando ocurren.&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;Hay que recordar que se trata de fallos irrecuperables, no de casos raros dentro de la lógica del programa. Es mejor dejar claro un error fatal que tratar de continuar cuando no se puede y que se pierda el rastro de lo sucedido...&lt;/p&gt;&lt;p&gt;Por supuesto el &lt;a href="http://es.wikipedia.org/wiki/Falso_dilema"&gt;título es falaz&lt;/a&gt;, debería haber sido &lt;em&gt;Testeo y corrección&lt;/em&gt; y todos contentos, pero espero que se me permita el recurso :)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26849"&gt;¿Testeo o corrección? en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5380326406916528211?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5380326406916528211/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5380326406916528211' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5380326406916528211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5380326406916528211'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/07/testeo-o-correccin.html' title='¿Testeo o corrección?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5586504806132159767</id><published>2007-07-18T11:05:00.000+02:00</published><updated>2007-07-18T23:58:51.671+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ley'/><category scheme='http://www.blogger.com/atom/ns#' term='ingeniería de software'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='leyes'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Leyes sobre el desarrollo de software con nombre propio</title><content type='html'>&lt;p&gt;Leo en &lt;a href="http://haacked.com/archive/2007/07/17/the-eponymous-laws-of-software-development.aspx"&gt;haacked&lt;/a&gt; un listado de leyes que tienen algo que ver con el desarrollo de software y que además tienen nombre propio. Las hay serias y las hay humorísticas o simplemente pesimistas. Entre divertido, iluminador y deprimente.&lt;/p&gt;&lt;p&gt;De las que más me gustan:&lt;ul&gt;&lt;li&gt;&lt;em&gt;La ley de Postel&lt;/em&gt;: Sé conservador con lo que envías, liberal con lo que recibes. Ya hablé de ella por aquí en &lt;a href="http://yapw.blogspot.com/2007/05/postel-o-dracn.html"&gt;¿Postel o Dracón?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;La ley de Parkinson&lt;/em&gt;: El trabajo se expande hasta consumir(*) todo el tiempo previsto para él. (*)&lt;em&gt;Al menos&lt;/em&gt;, añadiría yo ;)&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Kerckhoffs'_principle"&gt;El principio de Kerchkhoff&lt;/a&gt;&lt;/em&gt;: En criptografía un sistema debería ser seguro incluso si todo acerca del sistema es de conocimiento público excepto una pequeña cantidad de información: la clave.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Habla también de las típicas leyes de estos casos, Murphy, &lt;a href="http://es.wikipedia.org/wiki/Principio_de_Pareto"&gt;Pareto&lt;/a&gt;, &lt;a href="http://yapw.blogspot.com/2007/07/beautiful-code.html"&gt;Sturgeon&lt;/a&gt;, &lt;a href="http://es.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;Brooks&lt;/a&gt;...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Actualización:  &lt;/strong&gt;Joey deVilla inspirado en el post anterior ha hecho &lt;a href="http://globalnerdy.com/2007/07/18/laws-of-software-development/"&gt;una recopilación francamente impresionante de leyes o dichos referidos al desarrollo del software.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26777"&gt;Leyes sobre el desarrollo de software con nombre propio en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5586504806132159767?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5586504806132159767/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5586504806132159767' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5586504806132159767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5586504806132159767'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/07/leyes-sobre-el-desarrollo-de-software.html' title='Leyes sobre el desarrollo de software con nombre propio'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-100701935542627703</id><published>2007-07-17T18:50:00.000+02:00</published><updated>2007-07-17T21:59:58.382+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Beautiful Code'/><category scheme='http://www.blogger.com/atom/ns#' term='código'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Beautiful Code</title><content type='html'>&lt;p&gt;&lt;a href="http://technorati.com/posts/tag/%22Beautiful+Code%22?language=n"&gt;El bloguerío de esto de la programación anda revuelto&lt;/a&gt; por la publicación de un libro que parece muy interesante &lt;a href="http://www.amazon.com/Beautiful-Code-Leading-Programmers-Explain/dp/0596510047"&gt;Beautiful Code: Leading Programmers Explain How They Think&lt;/a&gt;. Y es extraño que ande tan revolucionado sin una causa económica (al parecer lo que se saque con este libro irá a &lt;a href="http://www.amnesty.org/"&gt;AI&lt;/a&gt;) pero viendo los autores quizás sea para tanto; que me suenen: Brian Kernighan, Tim Bray, Charles Petzold, Diomidis Spinellis, Douglas C. Schmidt, Yukihiro Matsumoto...  aunque seguro que me dejo a alguien importante :) Cinco de ellos han sido ya nombrados por aquí, que cosas...&lt;/p&gt;&lt;p&gt;El libro consta de 33 capítulos en los que otros tantos autores piensan en alto sobre la arquitectura de sus proyectos (o de los proyectos de otro) los compromisos que se tomaron en su construcción y cuando fue importante romper las reglas. Dado lo heterogéneo del grupo de autores seguro que hay de todo un poco, pero el tema me parece tan interesante que inmediatamente lo he puesto en &lt;a href="http://www.anobii.com/wishlists/mig21/"&gt;mi lista de deseos de anobii&lt;/a&gt;, aunque creo que dentro de poco se caerá de la lista :)&lt;/p&gt;&lt;p&gt;Por hacerme eco de algunos de los los comentarios que ha generado, &lt;a href="http://blogs.sun.com/bmc/entry/beautiful_code"&gt;Bryan Cantrill&lt;/a&gt; reflexiona sobre la recursividad en el mundo real y recibe interesantes respuestas. &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=210434"&gt;Alberto Savoia, uno de los autores, en "Pardon My French, But This Code Is C.R.A.P."&lt;/a&gt; reflexiona sobre el código malo, que es mucho más abundante, parafraseando a Strurgeon (&lt;em&gt;"90% of everything is crap." - Sturgeon’s Law (one of many variants) "When applied to software, Sturgeon’s Law is hopelessly optimistic." - Savoia’s Corollary to Sturgeon’s Law&lt;/em&gt;) y a Sartre (&lt;em&gt;"Hell is other people." - J. P. Sartre "Hell is other people’s code." - T-Shirt seen recently in Mountain View, CA&lt;/em&gt;) :)&lt;p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26769"&gt;Beautiful Code en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-100701935542627703?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/100701935542627703/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=100701935542627703' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/100701935542627703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/100701935542627703'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/07/beautiful-code.html' title='Beautiful Code'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6175140004896520365</id><published>2007-07-11T23:37:00.000+02:00</published><updated>2007-07-12T11:37:31.832+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='videos'/><category scheme='http://www.blogger.com/atom/ns#' term='C++09'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones de diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='patrones'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Varios sobre concurrencia y patrones de diseño</title><content type='html'>Ración de enlaces:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ddj.com/dept/architect/200001985?pgno=1"&gt;The Pillars of Concurrency por Herb Sutter&lt;/a&gt; Un resumen de los distintos escenarios en lo que se debe aplicar la concurrencia y de las posibles soluciones presentes y futuras. Comentado en &lt;a href="http://lambda-the-ultimate.org/node/2339"&gt;LtU, The Pillars of Concurrency&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Un par de vídeos (que aún no he visto, pero que tienen muy buena pinta): &lt;a href="http://video.google.com/videoplay?docid=3528799355371049884"&gt; C++ Threads por Lawrence Crowl&lt;/a&gt; y &lt;a href="http://video.google.com/videoplay?docid=810232012617965344"&gt;Concurrency/message passing Newsqueak por Rob Pike&lt;/a&gt; (En la tendencia de que los materiales se cuelguen más "en bruto", vídeos y entrevistas en audio y video en lugar de transcritos... más fácil de hacer pero peor para buscar algo concreto y al ser en lenguaje oral es posible que peor para los no nativos. Aunque estos parece que con las diapositivas se pueden seguir bien...)&lt;/li&gt;&lt;li&gt;Un par de enlaces para reflexionar acerca de los patrones de diseño: &lt;a href="http://www.codinghorror.com/blog/archives/000899.html"&gt;Rethinking Design Patterns de Jeff Atwood&lt;/a&gt;, que viene a recordar los argumentos que se citaron por aquí en &lt;a href="http://yapw.blogspot.com/2006/11/enlaces-varios-iv.html"&gt;Enlaces varios (IV)&lt;/a&gt;, que &lt;a href="http://blog.plover.com/prog/design-patterns.html"&gt;los patrones de diseño son síntomas de defectos en los lenguajes de programación&lt;/a&gt;. También &lt;a href="http://tech.puredanger.com/2007/07/03/pattern-hate-template/"&gt;Patterns I Hate #2: Template Method&lt;/a&gt;, que parece ser una serie en la que se medita sobre lo que se gana y se pierde con algunos patones.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26728"&gt;Varios sobre concurrencia y patrones de diseño en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6175140004896520365?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6175140004896520365/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6175140004896520365' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6175140004896520365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6175140004896520365'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/07/varios-sobre-concurrencia-y-patrones-de.html' title='Varios sobre concurrencia y patrones de diseño'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1996072431618716076</id><published>2007-07-05T18:28:00.000+02:00</published><updated>2007-07-05T18:36:45.730+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alexandrescu'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><title type='text'>Artículos de Alexandrescu sobre C++</title><content type='html'>&lt;p&gt;Leo a través de &lt;a href="http://programming.reddit.com/info/23la1/comments"&gt;la sección de programación de reddit&lt;/a&gt; que Andrei Alexandrescu ha puesto en su página, disponibles para descarga y consulta &lt;a href="http://erdani.org/publications/"&gt;los artículos que ha publicado en C/C++ User's Journal&lt;/a&gt;. Para quienes no lo conozcan, &lt;a href="http://en.wikipedia.org/wiki/Andrei_Alexandrescu"&gt;Andrei Alexandrescu&lt;/a&gt; es el autor de &lt;a href="http://erdani.org/book/main.html"&gt;Modern C++ Design&lt;/a&gt; uno de los libros más influyentes y que más bien (¿y mal?) ha hecho por el C++ y sus lectores/escritores.&lt;p&gt;&lt;p&gt;Me han llamado la atención especialmente &lt;a href="http://erdani.org/publications/cuj-2004-10.pdf"&gt;&lt;em&gt;Lock-Free Data Structures&lt;/em&gt;&lt;/a&gt;, &lt;a href="http://erdani.org/publications/cuj-2004-12.pdf"&gt;&lt;em&gt;Lock-Free Data Structures with Hazard Pointers&lt;/em&gt;&lt;/a&gt; y &lt;a href="http://erdani.org/publications/DDJ_Jul_Aug_2004_revised.pdf"&gt;&lt;em&gt;C++ and The Perils of Double-Checked Locking&lt;/em&gt;&lt;/a&gt; aunque solo sea por la introducción a la programación con bloqueos y &lt;a href="http://yapw.blogspot.com/2007/02/estructuras-de-datos-sin-bloqueos.html"&gt;sin bloqueos&lt;/a&gt; que me ha parecido hasta didáctica. También hay otros artículos sobre punteros inteligentes, constructores &lt;em&gt;de movimiento&lt;/em&gt; y otras técnicas y temas diversos. Más para leer...&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26667"&gt;Artículos de Alexandrescu sobre C++ en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1996072431618716076?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1996072431618716076/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1996072431618716076' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1996072431618716076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1996072431618716076'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/07/artculos-de-alexandrescu-sobre-c.html' title='Artículos de Alexandrescu sobre C++'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6805501114254446219</id><published>2007-06-27T16:30:00.000+02:00</published><updated>2007-06-27T16:59:04.007+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pensar'/><category scheme='http://www.blogger.com/atom/ns#' term='programadores'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='mantras'/><title type='text'>El mejor código es el que no existe</title><content type='html'>&lt;p&gt;Bueno, la frase es demoledora y como toda frase lapidaria, conviene matizarla. Pero contiene tanta sabiduría (pesimista o realista, tu eliges) que creo que debe convertirse en uno de los &lt;a href="http://yapw.blogspot.com/2006/09/programacin-y-mantras.html"&gt;mantras&lt;/a&gt; a repetirse frecuentemente.&lt;/p&gt;&lt;p&gt;Me lo recordó hace unos días la entrada de &lt;a href="http://www.codinghorror.com/blog/archives/000878.html"&gt;Jeff Atwood, The Best Code is No Code At All&lt;/a&gt;, muy recomendable. Si, antes de codificar, de desplegar miles de millones de líneas de código hay que pensárselo muy bien. Codificar es divertido, es muy estimulante... Pero antes de empezar, antes de abrir siquiera el editor debería pasar por la cabeza, en alguna milésima de segundo, al menos alguna de estas preguntas: &lt;ul&gt;&lt;li&gt;¿Debo escribir este código?&lt;/li&gt;&lt;li&gt;¿Estaré reinventado alguna rueda?&lt;/li&gt;&lt;li&gt;¿Soluciona el problema que quiero solucionar?&lt;/li&gt;&lt;li&gt;¿Se puede hacer mejor, más compacto, más legible, solo pensando un poquito antes de teclear?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ya decía que conviene matizar: el programa vacío no hace nada y parece que es bueno que los programas hagan algo :) Se trata de un un recordatorio ¡Cuidado con el exceso de código! Creo que no hay aberración mayor que valorar la producción por líneas de código; es como si pagaran por bugs cometidos...&lt;/p&gt;&lt;p&gt;Jeff cita &lt;a href="http://wilshipley.com/blog/2007/05/pimp-my-code-part-14-be-inflexible.html"&gt;otro artículo en el que se exhorta a comenzar con código minimalista y completarlo a través de test&lt;/a&gt;. Es una buena idea, pero en estos tiempos de exaltación del &lt;a href="http://es.wikipedia.org/wiki/Tdd"&gt;Test-driven development&lt;/a&gt; conviene recordar también que los test no lo son todo, que &lt;a href="http://ravimohan.blogspot.com/2007/04/learning-from-sudoku-solvers.html"&gt;pararse a pensar sigue siendo imprescindible&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;En resumen &lt;a href="http://barrapunto.com/~mig21/journal/19175"&gt;serás esclavo de tu código&lt;/a&gt;, así que piénsatelo bien ;)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26573"&gt;El mejor código es el que no existe, en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6805501114254446219?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6805501114254446219/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6805501114254446219' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6805501114254446219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6805501114254446219'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/06/el-mejor-cdigo-es-el-que-no-existe.html' title='El mejor código es el que no existe'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-8245000733685222701</id><published>2007-06-25T12:23:00.000+02:00</published><updated>2007-06-25T13:08:24.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='CORBA'/><category scheme='http://www.blogger.com/atom/ns#' term='middleware'/><category scheme='http://www.blogger.com/atom/ns#' term='AMQP'/><category scheme='http://www.blogger.com/atom/ns#' term='ICE'/><category scheme='http://www.blogger.com/atom/ns#' term='bala de plata'/><title type='text'>AMQP ¿El nuevo Middleware universal?</title><content type='html'>&lt;p&gt;Según leo en &lt;a href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=485"&gt;Toward a Commodity Enterprise Middleware&lt;/a&gt; John O'Hara en &lt;a href="http://en.wikipedia.org/wiki/JPMorgan_Chase_%26_Co."&gt;JPMorgan&lt;/a&gt;, harto de "el problema del &lt;a href="http://es.wikipedia.org/wiki/Middleware"&gt;Middleware&lt;/a&gt;" se construyó (diseñó e implementó) el suyo propio para sus sistemas: &lt;a href="http://www.amqp.org/"&gt;AMQP (Advanced Message Queuing Protocol)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Se basa en el paso de mensajes y su gestión, permite mensajes del tipo &lt;em&gt;publicación/suscripción&lt;/em&gt;, &lt;em&gt;guardar y reenviar&lt;/em&gt; o envío de ficheros, separa la capa de trasporte de la de gestión de colas, tiene un protocolo binario que lo hace menos pesado en cómputo y ancho de banda que los Servicios Web y está preparado para pasar los firewalls sin perdida de seguridad. Suena bien.&lt;/p&gt;&lt;p&gt;Para no cometer uno de &lt;a href="http://yapw.blogspot.com/2006/06/el-auge-y-la-cada-de-corba-y-lo-que.html"&gt;los errores de CORBA&lt;/a&gt;, existe ya más de una implementación, la de referencia: &lt;a href="http://www.openamq.org/"&gt;OpenAMQ&lt;/a&gt;, otra de Apache incubator, &lt;a href="http://cwiki.apache.org/qpid/"&gt;Apache Qpid&lt;/a&gt;, y una última en Erlang, &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt; todas ellas software libre.&lt;/p&gt;&lt;p&gt;Al parecer &lt;em&gt;la industria&lt;/em&gt; está entendiendo (por fin) que el modo de hacer tecnologías interoperables es haciendo implementaciones de referencia funcionales y libres, teniendo comunidad de usuarios (y no clientes) De todos modos habrá que ver si tiene una adopción tan masiva como pretenden. Lo debería ser si efectivamente el middleware se logra convertir (ojalá) en una &lt;a href="http://es.wikipedia.org/wiki/Commodities"&gt;Comoddity&lt;/a&gt;&lt;/p&gt;&lt;p&gt;(En &lt;a href="http://yapw.blogspot.com/2006/06/el-auge-y-la-cada-de-corba-y-lo-que.html"&gt;El auge y la caída de CORBA (y lo que podemos aprender)&lt;/a&gt; se comentaba que existía &lt;a href="http://www.zeroc.com/ice.html"&gt;ICE&lt;/a&gt; otro prometedor middleware libre, en este caso más parecido a CORBA, según parece)&lt;/p&gt;&lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26551"&gt;AMQP ¿El nuevo Middleware universal? en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-8245000733685222701?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/8245000733685222701/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=8245000733685222701' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8245000733685222701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/8245000733685222701'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/06/amqp-el-nuevo-middleware-universal.html' title='AMQP ¿El nuevo Middleware universal?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-3415924696048922845</id><published>2007-06-20T11:53:00.000+02:00</published><updated>2007-06-20T15:07:52.968+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tipado estático'/><category scheme='http://www.blogger.com/atom/ns#' term='tipado'/><category scheme='http://www.blogger.com/atom/ns#' term='programación funcional'/><category scheme='http://www.blogger.com/atom/ns#' term='tipado dinámico'/><category scheme='http://www.blogger.com/atom/ns#' term='compatibilidad hacia atrás'/><category scheme='http://www.blogger.com/atom/ns#' term='Python 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Python 2.6'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Repasando Python 3000 (o Python 3.0)</title><content type='html'>&lt;p&gt;En su bitácora de Artima &lt;a href="http://www.artima.com/weblogs/index.jsp?blogger=guido"&gt;Guido van Rossum&lt;/a&gt; ha actualizado &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=208549"&gt;las previsiones que tiene acerca del proyecto llamado Python 3000&lt;/a&gt; (que acabará siendo python 3.0)&lt;/p&gt;&lt;p&gt;Repasa las novedades de las versiones 2.6, que será &lt;em&gt;versión puente&lt;/em&gt; y la 3.0. De esta última destacan el tratamiento de &lt;a href="http://es.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; y entradas y salidas, el sistema de clases y tipos (con "anotaciones" que se podrán usar como &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=85551"&gt;tipado estático opcional&lt;/a&gt;), cambios en excepciones y enteros y algunos otros cambios como la eliminación de &lt;a href="http://docs.python.org/lib/built-in-funcs.html"&gt;&lt;tt&gt;reduce()&lt;/tt&gt; &lt;/a&gt;(que fue explicada en &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=98196"&gt;The fate of reduce() in Python 3000&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Al parecer romperá uno de los &lt;em&gt;tabúes&lt;/em&gt; más sagrados de la informática: la compatibilidad hacia atrás, aunque habrá herramientas de conversión entre la versión 2.6 y la 3.0.&lt;/p&gt;&lt;p&gt;Lo  comentan entre otros sitios en &lt;a href="http://lambda-the-ultimate.org/node/2302"&gt;Lambda the Ultimate: Python 3000 Status Update&lt;/a&gt;, en donde, por supuesto, van a echar a faltar &lt;a href="http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29"&gt;&lt;tt&gt;reduce()&lt;/tt&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26503"&gt;Repasando Python 3000 (o Python 3.0) en barrapunto&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-3415924696048922845?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/3415924696048922845/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=3415924696048922845' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3415924696048922845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/3415924696048922845'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/06/repasando-python-3000-o-python-30.html' title='Repasando Python 3000 (o Python 3.0)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-2916999866376192768</id><published>2007-06-18T11:09:00.000+02:00</published><updated>2007-06-18T16:54:44.021+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metodología'/><category scheme='http://www.blogger.com/atom/ns#' term='ciencia'/><title type='text'>Errores en el diseño e interpretación de experimentos</title><content type='html'>&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Esto en &lt;a href="http://www.planetacodigo.com/"&gt;planeta código&lt;/a&gt; es un poco offtopic, pero me parece lo suficientemente interesante para publicarlo en YAPW. Disculpen las molestias :)&lt;p&gt;Acabo de leer en la página de &lt;a href="http://norvig.com/"&gt;Peter Norvig&lt;/a&gt; una interesantísima recopilación de &lt;a href="http://norvig.com/experiment-design.html"&gt;errores comunes en el diseño e interpretación de experimentos&lt;/a&gt;. Estamos demasiado acostumbrados a que se les den publicidad a determinados "estudios" que cometen algunos de los errores que Norvig repasa. Por ejemplo, hacer estudios sin una &lt;a href="http://es.wikipedia.org/wiki/Prueba_controlada_aleatoria"&gt;Prueba controlada aleatoria&lt;/a&gt;, confundir correlación con causa o mal entendimiento de la probabilidad condicionada(*) Una lectura recomendable y &lt;a href="http://barrapunto.com/~mig21/journal/26358"&gt;como decía el otro día&lt;/a&gt;, también de cultura general, porque afecta a la base de la metodología científica.&lt;p&gt;&lt;p&gt;(*)Aunque ya comentaba &lt;a href="http://tiopetrus.blogia.com/2003/112801-independencia-y-2-.php"&gt;Tío Petros que el ser humano parece peor equipado de lo que debería para entender intuitivamente la probabilidad&lt;/a&gt;, así que tenemos que hacer un esfuerzo adicional...&lt;/p&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26481"&gt;Errores en el diseño e interpretación de experimentos en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-2916999866376192768?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/2916999866376192768/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=2916999866376192768' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2916999866376192768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/2916999866376192768'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/06/errores-en-el-diseo-e-interpretacin-de.html' title='Errores en el diseño e interpretación de experimentos'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-1796966037376679171</id><published>2007-06-07T23:10:00.000+02:00</published><updated>2007-06-08T08:40:36.858+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='falacias'/><category scheme='http://www.blogger.com/atom/ns#' term='mitos'/><category scheme='http://www.blogger.com/atom/ns#' term='hechos'/><category scheme='http://www.blogger.com/atom/ns#' term='ingeniería de software'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='peopleware'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Evidencias en el desarrollo de software</title><content type='html'>&lt;p&gt;&lt;a href="http://www.navegapolis.net/"&gt;Navegápolis&lt;/a&gt; es un blog que me gusta muchísimo. Hasta ahora no lo había referenciado porque su temática tiende más a la gestión y bueno, a mi me gusta más hablar de lo más pegado al código.&lt;/p&gt;&lt;p&gt;En este caso comenta &lt;strong&gt;&lt;a href="http://www.navegapolis.net/content/view/634/"&gt;Algunas evidencias del desarrollo de software&lt;/a&gt;&lt;/strong&gt; extraídas directamente del libro &lt;a href="http://safari.awprofessional.com/0321117425"&gt;Facts and Fallacies of Software Engineering&lt;/a&gt;. Haciendo una selección sobre la ya hecha por &lt;a href="http://www.navegapolis.net/"&gt;Juan Palacio&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;El factor más importante en el trabajo con software no son las herramientas, ni las técnicas usadas por los programadores; sino la calidad de los programadores.&lt;/li&gt;&lt;li&gt;Normalmente las estimaciones se realizan al comenzar el ciclo de vida. Tiene un cierto sentido, si no fuera porque de esta forma se hace la estimación antes de definir los requisitos, y por lo tanto antes de conocer el problema.&lt;/li&gt;&lt;li&gt;La reutilización de pequeñas librerías o subrutinas llava empleándose 50 años de forma satisfactoria. La reutilización de grandes componentes es normalmente un problema sin resolver, aunque todo el mundo coincide en que es importante y deseable&lt;/li&gt;&lt;li&gt;Es 3 veces más difícil construir componentes reusables que no reusables (apunté en su día a &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=187331"&gt;Software Reusability: Myth Or Reality?&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;La localización y limpieza de errores es la fase que más tiempo consume en el ciclo de vida.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Al parecer es el típico libro que, como &lt;a href="http://es.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;The Mythical Man-Month&lt;/a&gt;, a uno le gustaría que se leyese más y en ámbitos menos técnicos. Del mismo modo a uno también le gustaría que &lt;a href="http://www.uhri.com/blog/index.php/archive/the-alarming-failure-of-software-projects/"&gt;determinadas estadísticas&lt;/a&gt; &lt;a href="http://www.it-cortex.com/Stat_Failure_Rate.htm"&gt;sobre proyectos fracasados fuesen más conocidas&lt;/a&gt;. Me parece de cultura general, pero debo estar equivocado :(&lt;/p&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26358"&gt;Evidencias en el desarrollo de software en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-1796966037376679171?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/1796966037376679171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=1796966037376679171' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1796966037376679171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/1796966037376679171'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/06/evidencias-en-el-desarrollo-de-software.html' title='Evidencias en el desarrollo de software'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6970410759188695089</id><published>2007-06-04T19:54:00.000+02:00</published><updated>2007-06-05T11:09:57.036+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='C++0x'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenMP'/><category scheme='http://www.blogger.com/atom/ns#' term='C++09'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='varios'/><category scheme='http://www.blogger.com/atom/ns#' term='STL'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO C++'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI C++'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Enlaces varios (V)</title><content type='html'>Ración de enlaces que amenazaban con desbordar los marcados &lt;em&gt;Keep New&lt;/em&gt; en bloglines, por si alguien les puede sacar utilidad:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.addsimplicity.com/adding_simplicity_an_engi/2007/05/chaotic_perspec.html"&gt;Chaotic Perspectives en Adding Simplicity&lt;/a&gt;. De como hay que renunciar a alguna de las letras de &lt;a href="http://es.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt; si se quiere sistemas &lt;em&gt;muy pero que muy escalables&lt;/em&gt;. Me ha recordado, por el tema a &lt;a href="http://martinfowler.com/bliki/Transactionless.html"&gt;Transactionless de Martin Fowler&lt;/a&gt;, a &lt;a href="http://thebull.macsimumweb.com/2007/04/04/building-a-high-volume-app-without-a-rdms-or-domain-objects/"&gt;Building a high volume app without a RDMS or Domain objects&lt;/a&gt; comentado en &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=201960"&gt;Thoughts on Scaling Without a Database&lt;/a&gt; y a &lt;a href="http://barrapunto.com/~fernand0/journal/20814"&gt;como hacen otros, como bloglines o flickr para manejar grandes cantidades de datos&lt;/a&gt;. Ah y por contrastar y por controversia &lt;a href="http://www.expatsoftware.com/articles/2007/06/getting-your-priorities-straight.html"&gt;Getting Your Priorities Straight. Scalability and Performance are the Least of your Worries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Una gran noticia que ha pasado casi desapercibida: &lt;a href="http://gcc.gnu.org/gcc-4.2/changes.html"&gt;GCC 4.2 ya soporta OpenMP&lt;/a&gt;. ¡Enhorabuena a los premiados!&lt;/li&gt;&lt;li&gt;En thinking parallel &lt;a href="http://www.thinkingparallel.com/2007/03/14/interviewing-the-parallel-programming-idols/"&gt;acabaron con las entrevistas a los gurús de la programación paralela&lt;/a&gt; y postean una &lt;a href="http://www.thinkingparallel.com/2007/05/24/you-are-what-you-read/"&gt;interesante lista de blogs y enlaces sobre programación paralela y similares&lt;/a&gt; que aún no he sido capaz de procesar&lt;/li&gt;&lt;li&gt;Un artículo muy bonito de &lt;a href="http://argcpp.blogspot.com/2006/08/el-camino-de-un-ciclo.html"&gt;Matias Capeletto, el Camino de un ciclo&lt;/a&gt;. Describe con una sencillez envidiable la evolución de de C++, desde C hasta C++09, con sólo el ejemplo de un bucle. &lt;strong&gt;Actualización:&lt;/strong&gt; vía &lt;a href="http://lambda-the-ultimate.org/node/2283"&gt;lambda the ultimate&lt;/a&gt; me encuentro con un papel de Bjarne Stroustrup en el que repasa lo mismo, pero en 59 páginas. Por lo que cuentan toca además de temas técnicos temas políticos, así que debe estar bastante entretenido... &lt;a href="http://www.research.att.com/~bs/hopl-almost-final.pdf"&gt;Evolving a language in and for the real world: C++ 1991-2006 (pdf)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html"&gt;De como en Electronic Arts se crearon su propia STL para cubrir sus necesidades&lt;/a&gt; Quién pudiera dedicarse a reinventar ruedas más bonitas :)&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/26313"&gt;Enlaces Varios (V) en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6970410759188695089?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6970410759188695089/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6970410759188695089' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6970410759188695089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6970410759188695089'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/06/enlaces-varios-v.html' title='Enlaces varios (V)'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7481644987097523252</id><published>2007-06-01T09:30:00.000+02:00</published><updated>2008-12-09T23:20:38.755+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='menéame'/><category scheme='http://www.blogger.com/atom/ns#' term='barrapunto'/><category scheme='http://www.blogger.com/atom/ns#' term='redes sociales'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Visualizando redes sociales: amigos en Barrapunto y menéame</title><content type='html'>&lt;p&gt;He hecho dos programitas que sacan las relaciones de amistad en en el interior de dos comunidades virtuales, &lt;a href="http://barrapunto.com/"&gt;barrapunto&lt;/a&gt; y &lt;a href="http://meneame.net/"&gt;menéame&lt;/a&gt;. Después he sacado imágenes gráficas de dichas relaciones, para visualizar, en lo posible, la compleja estructura de esas "relaciones sociales". Aunque el análisis de los datos no es muy riguroso, el resultado puede interesar tanto a los que les gusta el análisis de redes sociales &lt;em&gt;online&lt;/em&gt; como a los que les gusta la ver programitas de ejemplo. En este caso están hechos en Erlang, y están acompañados de algún enlace que he ido recopilando en el camino.&lt;/p&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt; La red social de barrapunto&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Me gusta mucho ver gráficos relacionados con las ciencias que tratan de estudiar la complejidad, como los de &lt;a href="http://www.visualcomplexity.com/vc/"&gt;visual complexity&lt;/a&gt;&lt;sup&gt;*&lt;/sup&gt;, no porque sepa mucho de ello, sino como mero aficionado. El caso es que llamó mucho la atención también la &lt;a href="http://www.deugarte.com/la-topologia-de-la-blogsfera-segun-feevy"&gt;representación visual de la red social de feevy&lt;/a&gt; (comentado por gente que sabe de esto, de entre los cuales me excluyo, en &lt;a href="http://fernand0.blogalia.com/historias/48614"&gt;Un mar de flores&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;(&lt;sup&gt;*&lt;/sup&gt;&lt;strong&gt;Otra actualización:&lt;/strong&gt;Parece que alguien envió esta entrada a &lt;a href="http://www.visualcomplexity.com/vc/"&gt;visualcomplexity&lt;/a&gt; y ha sido aceptada: &lt;a href="http://www.visualcomplexity.com/vc/project.cfm?id=470"&gt;Social Network of barrapunto&lt;/a&gt;. Gracias al anónimo &lt;em&gt;submitter&lt;/em&gt; que lo envió. Me siento muy halagado ;) )&lt;/p&gt;&lt;p&gt;Pues bien, el otro día se me ocurrió que se podría hacer lo mismo con los usuarios de barrapunto, que en el fondo no deja de ser una red con unas relaciones muy bien definidas: la relación de amistad y enemistad. Y también se me ocurrió que lo podría hacer con un programita que capturara esas relaciones y las dejara en formato &lt;a href="http://www.graphviz.org/doc/info/lang.html"&gt;DOT&lt;/a&gt;. Para ello he usado &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt;. ¿Por qué? Pues porque si. Se podía haber hecho con &lt;tt&gt;wget&lt;/tt&gt; o &lt;tt&gt;curl&lt;/tt&gt; y &lt;tt&gt;awk&lt;/tt&gt;, y/o &lt;tt&gt;perl&lt;/tt&gt; o ... Pero bueno,  me apetecía hacer algo más que un &lt;tt&gt;Hola mundo!&lt;/tt&gt; en este lenguaje. Y, a decir verdad, me lo he pasado muy bien programando en él y descubriéndolo.&lt;/p&gt;&lt;p&gt;Comentaba &lt;a href="http://blog.alexgirard.com/"&gt;Alex&lt;/a&gt; que para visualizar la redes sociales solían usar &lt;a href="http://socnetv.sourceforge.net/"&gt;SocNetV&lt;/a&gt;, pero que en este caso usó &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; Ambos admiten para modelar las redes &lt;a href="http://www.graphviz.org/doc/info/lang.html"&gt;el lenguaje de definición DOT&lt;/a&gt;. Son los programas que yo he usado para los gráficos que viene a continuación.&lt;/p&gt;&lt;p&gt;Primero la imagen tal cual, sin ordenar demasiado, con &lt;tt&gt;socnetv&lt;/tt&gt;:&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SzX3U6-RV_I/RltOIu7JD9I/AAAAAAAAACA/HT5lzpK5G7c/s1600-h/bpraw.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_SzX3U6-RV_I/RltOIu7JD9I/AAAAAAAAACA/HT5lzpK5G7c/s400/bpraw.png" alt="" id="BLOGGER_PHOTO_ID_5069731717477634002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Intentando desenredar la red, estos programas tienen criterios para representar la información en función de una serie de parámetros que suelen calcularse en función del las distintas definiciones de &lt;a href="http://austria.phys.nd.edu/netwiki/index.php/Centrality"&gt;centralidad&lt;/a&gt;...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Pegaré aquí las imágenes que creo que van a dar una información más interesante. Esta siguiente está generada con el &lt;tt&gt;socnetv&lt;/tt&gt;, aplicando una de las ordenaciones en circulo por centralidad (en este caso, creo, "in degree centrality"):&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SzX3U6-RV_I/RlrMn-7JDwI/AAAAAAAAAAo/B37u5RnCfP0/s1600-h/bpcircle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_SzX3U6-RV_I/RlrMn-7JDwI/AAAAAAAAAAo/B37u5RnCfP0/s400/bpcircle.png" alt="" id="BLOGGER_PHOTO_ID_5069589317836934914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Usando el comando &lt;tt&gt;nop bp.file | twopi -Tpng -o bptwopi.png&lt;/tt&gt;, de graphviz:&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/240/520542083_df29134180_o_d.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://farm1.static.flickr.com/240/520542083_f7f26247fd_b_d.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;La imagen que más me gusta es esta, que da alguna información de la organización, pero acercándose uno puede ver detalles (usando &lt;tt&gt;nop bp.file | fdp -Tpng -o bpfdp.png&lt;/tt&gt;)... Lo malo es que subiéndola a flickr se baja tanto la resolución como la calidad. Se admiten sugerencias para subir las imágenes a un sitio donde las dejen poner a mucha resolución...&lt;strong&gt;Actualización:&lt;/strong&gt; Gracias a &lt;a href="http://resete.sytes.net/blog"&gt;&lt;tt&gt;resete-e&lt;/tt&gt;&lt;/a&gt; y &lt;a href="http://flickr.com/photos/28971318@N00/"&gt;su cuenta de flickr pro&lt;/a&gt; hay imágenes de alta resolución. Muchas gracias ;)&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://flickr.com/photos/28971318@N00/520542071/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://farm1.static.flickr.com/239/520542071_0e2c518c18_b_d.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;La red social de menéame&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mientras iba haciendo el primer programa, se me ocurrió que casi &lt;em&gt;por el mismo precio&lt;/em&gt; podría tener un segundo programa que obtuviese los datos de menéame. Solo apuntar que en este caso la red está aún más enmarañada porque hay más actores y más relaciones...&lt;/p&gt;&lt;p&gt;Las imágenes análogas a las anteriores serían:&lt;br /&gt;(Nota: La última imagen parece en negro, pero si se pincha sobre ella sale a resolución completa...)&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SzX3U6-RV_I/RlrUnO7JD1I/AAAAAAAAABI/r28AoAk3uEc/s1600-h/mnmraw.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_SzX3U6-RV_I/RlrUnO7JD1I/AAAAAAAAABI/r28AoAk3uEc/s400/mnmraw.png" alt="" id="BLOGGER_PHOTO_ID_5069598101045055314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://flickr.com/photos/28971318@N00/520551157/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://farm1.static.flickr.com/228/520551157_05caa8c221_b_d.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/191/520559649_0022a1d282_o_d.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://farm1.static.flickr.com/252/523702209_6fbde1069e_t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Los datos&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Segunda actualización:&lt;/strong&gt; No tenía donde poner los ficheros de datos, pero &lt;a href="http://hombrelobo.com/"&gt;Eduardo de http://hombrelobo.com/&lt;/a&gt; me cedió amablemente espacio, así que todos los interesados en los datos en bruto pueden jugar con ellos y con &lt;a href="http://www.graphviz.org/"&gt;graphviz&lt;/a&gt;, &lt;a href="http://socnetv.sourceforge.net/"&gt;SocNetV&lt;/a&gt; y con lo que quieran. Traté de embeber los svg en HTML, pero creo que no merece la pena porque son muy grandes y firefox (al menos) se queda un poco tonto. Mejor bajárselos y verlos con algún visor... Bueno, los enlaces:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hombrelobo.com/yapw/bp.file"&gt;El fichero de datos de las "amistades" en barrapunto, en formato dot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hombrelobo.com/yapw/mnm.file"&gt;El fichero de datos de las "amistades" en menéame, en formato dot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hombrelobo.com/yapw/bpfdp.svg"&gt;Las "amistades" en barrapunto, en formato &lt;tt&gt;svg&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hombrelobo.com/yapw/mnmfdp.svg"&gt;Las "amistades" en menéame, en formato &lt;tt&gt;svg&lt;/tt&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; Que los disfruten ;)&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;"Análisis"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Se ve que hay islitas, cosa que me ha sorprendido, por aquello de los &lt;a href="http://es.wikipedia.org/wiki/Seis_grados_de_separaci%C3%B3n"&gt;seis grados de separación&lt;/a&gt;, pero también lo comentaba Ugarte en su entrada. Pensándolo un poco más detenidamente, tanto en este caso como en el de los enlaces feevy son casi todas &lt;em&gt;relaciones fuertes&lt;/em&gt; en el sentido en el que se comenta en &lt;a href="http://fernand0.blogalia.com/historias/48614"&gt;un mar de flores&lt;/a&gt;. No todas las &lt;em&gt;relaciones débiles&lt;/em&gt; entre usuarios (yo leo poco a tal, yo conozco a cual, pero no le sigo) &lt;em&gt;no salen en este esquema&lt;/em&gt;, es seguro que en ese caso todos estarían conectados... No obstante, en el caso de las gráficas de las dos comunidades, las islas son menores que en feevy, la red está más &lt;em&gt;clusterizada&lt;/em&gt;... (este razonamiento hay que tomarlo con precaución: yo soy sólo un aficionado ;))&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Más redes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Se me pasó por la cabeza un proyecto más ambicioso en en que se definiesen parámetros de búsqueda (expresiones regulares y alguna otra cosa...) pero me resultó demasiado grande para el poco uso que le iba a dar. Si alguien tiene ganas, se puede modificar muy fácilmente para sacar la red de slashdot (casi trivial) o de digg... ¿twitter? (por cierto, que alguien sacó &lt;a href="http://bvlg.blogspot.com/2007/04/twitter-vrienden.html"&gt;el gráfico de los usuarios holandeses de twitter&lt;/a&gt;, también vía &lt;a href="http://www.deugarte.com/feevy-twitter-y-el-rankismo"&gt;de Ugarte&lt;/a&gt;)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Erlang&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;En otro orden de cosas... lo he programado en Erlang y ha sido una gratísima experiencia. Hay quien dice que &lt;em&gt;la iteración es humana, la recursión es divina&lt;/em&gt;, pero Erlang con su &lt;a href="http://en.wikipedia.org/wiki/Tail_recursion"&gt;tail recursion (recusión terminal)&lt;/a&gt; te la facilita o más bien te la hace obligatoria para recorrer los conjuntos de datos. Pero tanto el uso de esa recursión, el manejo de listas y tuplas como la sintaxis me ha resultado muy muy natural. El hecho de que cada "sentencia" sea separada por comas, el final un punto, las flechas... todo muy intuitivo, un poco como escribir un texto, salvando las distancias ;)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Otro punto fuerte de el lenguaje es el tratamiento de la concurrencia, que es muy sencillo teniendo en cuenta una serie de premisas que ya comentó &lt;a href="http://yapw.blogspot.com/2007/04/entrevistas-gurs-de-la-programacin.html"&gt;Joe Armstrong en su entrevista en Thinking parallel&lt;/a&gt;. Erlang no usa threads nativos sino que tiene sus propios "procesos ligeros" con lo que logra una gran escalabilidad en cuanto a número de procesos disponibles.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En este ejemplo no se observa muy bien, porque no creo que el programa lo requiriese, pero el lector atento del código podría añadirle &lt;em&gt;una cierta concurrencia&lt;/em&gt; para hacer peticiones en paralelo, pero en este caso no es muy útil...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Aquí voy a pegar el código que he usado tal cual, con la advertencia que no es un código muy probado y tal y cual, etc, etc :)&lt;br /&gt;(por cierto y a modo de recordatorio, el comando que he usado para generar el código HTML con resaltado de sintaxis es &lt;tt&gt;enscript --highlight=erlang --color --language=html --output=soc_graph.html soc_graph.erl&lt;/tt&gt;)&lt;br /&gt;Blogger se comió los  tabuladores, los he sustituido por espacios...&lt;br /&gt;El programa de barrapunto:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-module&lt;/span&gt;&lt;/b&gt;(soc_graph).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-export&lt;/span&gt;&lt;/b&gt;([do_it/0]).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-export&lt;/span&gt;&lt;/b&gt;([get_friends/1]).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-export&lt;/span&gt;&lt;/b&gt;([get_users/1]).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;do_it&lt;/span&gt;&lt;/b&gt;() -&amp;gt;&lt;br /&gt;  init_file(),&lt;br /&gt;  get_users({&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;self&lt;/span&gt;&lt;/b&gt;(),1}),&lt;br /&gt;  end_file().&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%get_users gets user list&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_users&lt;/span&gt;&lt;/b&gt;({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;}) -&amp;gt; get_users(0,{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;}).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_users&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Pan&lt;/span&gt;,{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;=io_lib:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"http://barrapunto.com/search.pl?threshold=-1&amp;op=users&amp;amp;sort=1i&amp;start=~.10B"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;Pan&lt;/span&gt;]),&lt;br /&gt;  { ok, {&lt;span style="color: rgb(184, 134, 11);"&gt;Status&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Headers&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt; }} = http:request(&lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;),&lt;br /&gt;  {match, &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;}=regexp:matches(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"barrapunto.com/~.*/journal"&lt;/span&gt;&lt;/b&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt; = [string:substr(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;+16 ,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;-16-8 ) || {&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;} &amp;lt;- &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;],&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;case&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;      [] -&amp;gt; get_users_done;&lt;br /&gt;      %&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt; -&amp;gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;spawn&lt;/span&gt;&lt;/b&gt;(soc_graph,get_friends,[{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt;}]),&lt;br /&gt;      &lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt; -&amp;gt; get_friends({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt;}),&lt;br /&gt;      get_users(&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;+&lt;span style="color: rgb(184, 134, 11);"&gt;Pan&lt;/span&gt;,{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;})&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;    &lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%get_friends gets user id and get friend list&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;%&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt; is unused (refactoring?)&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_friends&lt;/span&gt;&lt;/b&gt;({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;|&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;]}) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;=io_lib:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"http://barrapunto.com/~~~s/friends"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;]),&lt;br /&gt;  io:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"~s~n"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;]),&lt;br /&gt;  { ok, {&lt;span style="color: rgb(184, 134, 11);"&gt;Status&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Headers&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt; }} = http:request(&lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Reg_exp&lt;/span&gt;=&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"barrapunto.com/~.*/friends"&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  {match, &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;}=regexp:matches(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"barrapunto.com/~.*/friends"&lt;/span&gt;&lt;/b&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt; = [string:substr(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;+16 ,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;-16-8 ) || {&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;} &amp;lt;- &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;],&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;New_user&lt;/span&gt;=replace_forb_chars(&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_flt&lt;/span&gt;=lists:filter(noself(&lt;span style="color: rgb(184, 134, 11);"&gt;New_user&lt;/span&gt;),&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt;),&lt;br /&gt;  to_file([{&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_flt&lt;/span&gt;}]),&lt;br /&gt;  get_friends({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;});&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_friends&lt;/span&gt;&lt;/b&gt;({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,[]}) -&amp;gt; ok_friends.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;noself&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;) -&amp;gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;fun&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;) -&amp;gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;case&lt;/span&gt;&lt;/b&gt; regexp:match(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;) &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;      {match,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;} -&amp;gt; false;&lt;br /&gt;      nomatch -&amp;gt; true;&lt;br /&gt;      {error,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;} -&amp;gt; true&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%replace_forb_char replaces special (regexp) characters in user name&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;) -&amp;gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;".$()*+"&lt;/span&gt;&lt;/b&gt;).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;RH&lt;/span&gt;|&lt;span style="color: rgb(184, 134, 11);"&gt;RT&lt;/span&gt;]) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Regexp&lt;/span&gt;=&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"["&lt;/span&gt;&lt;/b&gt;++[&lt;span style="color: rgb(184, 134, 11);"&gt;RH&lt;/span&gt;]++&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"]"&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;Newstr&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;}=regexp:gsub(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Regexp&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Regexp&lt;/span&gt;),&lt;br /&gt;  replace_forb_chars(&lt;span style="color: rgb(184, 134, 11);"&gt;Newstr&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;RT&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,[]) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%to_file writes friends into DOT file&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;to_file&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;) -&amp;gt;&lt;br /&gt;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%this line violates DRY (Refactor?)&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;    {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;}=file:open(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"bp.file"&lt;/span&gt;&lt;/b&gt;,[write]),&lt;br /&gt;  to_file(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;to_file&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,[{&lt;span style="color: rgb(184, 134, 11);"&gt;User&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnds&lt;/span&gt;}|&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;]) -&amp;gt;&lt;br /&gt;  %&lt;span style="color: rgb(184, 134, 11);"&gt;TODO&lt;/span&gt;: &lt;span style="color: rgb(184, 134, 11);"&gt;Format&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt; map/frineds&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Out_Frnd&lt;/span&gt;= &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;fun&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;)-&amp;gt; io:format(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"\"~s\" -&amp;gt; \"~s\"~n"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;User&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;]) &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  lists:map(&lt;span style="color: rgb(184, 134, 11);"&gt;Out_Frnd&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnds&lt;/span&gt;),&lt;br /&gt;  to_file(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;to_file&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,[]) -&amp;gt;&lt;br /&gt;  file:close(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;),&lt;br /&gt;  ok_to_file.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%init_file initializes the DOT file  &lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;init_file&lt;/span&gt;&lt;/b&gt;() -&amp;gt;&lt;br /&gt;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%this line violates DRY (Refactor?)&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;    {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;}=file:open(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"mnm.file"&lt;/span&gt;&lt;/b&gt;,[write]),&lt;br /&gt;  io:format(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"digraph mydot {~nnode [color=red, shape=ellipse];~n"&lt;/span&gt;&lt;/b&gt;,[]),&lt;br /&gt;  file:close(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%end_file inserts the coda in the DOT file  &lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end_file&lt;/span&gt;&lt;/b&gt;() -&amp;gt;&lt;br /&gt;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%this line violates DRY (Refactor?)&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;    {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;}=file:open(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"mnm.file"&lt;/span&gt;&lt;/b&gt;,[append]),&lt;br /&gt;  io:format(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"[weight=1, color=black];~n}~n"&lt;/span&gt;&lt;/b&gt;,[]),&lt;br /&gt;  file:close(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La modificación para menéame:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-module&lt;/span&gt;&lt;/b&gt;(soc_graph).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-export&lt;/span&gt;&lt;/b&gt;([do_it/0]).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-export&lt;/span&gt;&lt;/b&gt;([get_friends/1]).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(95, 158, 160);"&gt;-export&lt;/span&gt;&lt;/b&gt;([get_users/1]).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;do_it&lt;/span&gt;&lt;/b&gt;() -&amp;gt;&lt;br /&gt;  init_file(),&lt;br /&gt;  get_users({&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;self&lt;/span&gt;&lt;/b&gt;(),1}),&lt;br /&gt;  end_file().&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%get_users gets user list&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_users&lt;/span&gt;&lt;/b&gt;({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;}) -&amp;gt; get_users(1,{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;}).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_users&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Pan&lt;/span&gt;,{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;}) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;=io_lib:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"http://meneame.net/topusers.php?sortby=0&amp;page=~.10B"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;Pan&lt;/span&gt;]),&lt;br /&gt;  { ok, {&lt;span style="color: rgb(184, 134, 11);"&gt;Status&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Headers&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt; }} = http:request(&lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;),&lt;br /&gt;  {match, &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;}=regexp:matches(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"/user/[^\"]*"&lt;/span&gt;&lt;/b&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt; = [string:substr(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;+6 ,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;-6) || {&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;} &amp;lt;- &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;],&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;case&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;      [] -&amp;gt; get_users_done;&lt;br /&gt;      %&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt; -&amp;gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;spawn&lt;/span&gt;&lt;/b&gt;(soc_graph,get_friends,[{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt;}]),&lt;br /&gt;      &lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt; -&amp;gt; get_friends({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Lst_new&lt;/span&gt;}),&lt;br /&gt;      timer:sleep(1000),&lt;br /&gt;      get_users(&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;+&lt;span style="color: rgb(184, 134, 11);"&gt;Pan&lt;/span&gt;,{&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Step&lt;/span&gt;})&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%get_friends gets user id and get friend list&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;%&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt; is unused (refactoring?)&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_friends&lt;/span&gt;&lt;/b&gt;({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;|&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;]}) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;=io_lib:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"http://meneame.net/user/~s/friends"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;]),&lt;br /&gt;  io:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"~s~n"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;]),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Reg_exp&lt;/span&gt;=&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"friends_of=[^\"]*"&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  { ok, {&lt;span style="color: rgb(184, 134, 11);"&gt;Status&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Headers&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt; }} = http:request(&lt;span style="color: rgb(184, 134, 11);"&gt;URL&lt;/span&gt;),&lt;br /&gt;  {match, &lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;}=regexp:match(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Reg_exp&lt;/span&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;User_Id&lt;/span&gt; = string:substr(&lt;span style="color: rgb(184, 134, 11);"&gt;Body&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Start&lt;/span&gt;+11 ,&lt;span style="color: rgb(184, 134, 11);"&gt;Length&lt;/span&gt;-11 ),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt;=get_friends_page(1,&lt;span style="color: rgb(184, 134, 11);"&gt;User_Id&lt;/span&gt;,[]),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;New_user&lt;/span&gt;=replace_forb_chars(&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_flt&lt;/span&gt;=lists:filter(noself(&lt;span style="color: rgb(184, 134, 11);"&gt;New_user&lt;/span&gt;),&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt;),&lt;br /&gt;  to_file([{&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_flt&lt;/span&gt;}]),&lt;br /&gt;  get_friends({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;});&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_friends&lt;/span&gt;&lt;/b&gt;({&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt;,[]}) -&amp;gt; ok_friends.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%get_friends_page gets friend list&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;%&lt;span style="color: rgb(184, 134, 11);"&gt;Pid&lt;/span&gt; is unused (refactoring?)&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;get_friends_page&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Page&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;User_Id&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Reg_exp2&lt;/span&gt;=&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"/user/[^\"]*"&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;URL2&lt;/span&gt;=io_lib:format(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"http://meneame.net/backend/get_friends_bars.php?id=~s&amp;p=~.10B&amp;amp;type=from"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;User_Id&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Page&lt;/span&gt;]),&lt;br /&gt;  { ok, {&lt;span style="color: rgb(184, 134, 11);"&gt;Status2&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Headers2&lt;/span&gt;, &lt;span style="color: rgb(184, 134, 11);"&gt;Body2&lt;/span&gt; }} = http:request(&lt;span style="color: rgb(184, 134, 11);"&gt;URL2&lt;/span&gt;),&lt;br /&gt;  {match, &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;}=regexp:matches(&lt;span style="color: rgb(184, 134, 11);"&gt;Body2&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Reg_exp2&lt;/span&gt;),&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt; = [string:substr(&lt;span style="color: rgb(184, 134, 11);"&gt;Body2&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Start2&lt;/span&gt;+6 ,&lt;span style="color: rgb(184, 134, 11);"&gt;Length2&lt;/span&gt;-6) || {&lt;span style="color: rgb(184, 134, 11);"&gt;Start2&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Length2&lt;/span&gt;} &amp;lt;- &lt;span style="color: rgb(184, 134, 11);"&gt;Matches&lt;/span&gt;],&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;case&lt;/span&gt;&lt;/b&gt; &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;      [] -&amp;gt; &lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;;&lt;br /&gt;      &lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;  -&amp;gt; get_friends_page(&lt;span style="color: rgb(184, 134, 11);"&gt;Page&lt;/span&gt; + 1,&lt;span style="color: rgb(184, 134, 11);"&gt;User_Id&lt;/span&gt;,lists:append(&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd_new&lt;/span&gt;))&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;noself&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;) -&amp;gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;fun&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;) -&amp;gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;case&lt;/span&gt;&lt;/b&gt; regexp:match(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;H&lt;/span&gt;) &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;      {match,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;} -&amp;gt; false;&lt;br /&gt;      nomatch -&amp;gt; true;&lt;br /&gt;      {error,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;} -&amp;gt; true&lt;br /&gt;  &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;  &lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%replace_forb_char replaces special (regexp) characters in user name&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;) -&amp;gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;".$()*+"&lt;/span&gt;&lt;/b&gt;).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;RH&lt;/span&gt;|&lt;span style="color: rgb(184, 134, 11);"&gt;RT&lt;/span&gt;]) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Regexp&lt;/span&gt;=&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"["&lt;/span&gt;&lt;/b&gt;++[&lt;span style="color: rgb(184, 134, 11);"&gt;RH&lt;/span&gt;]++&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"]"&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;Newstr&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;_&lt;/span&gt;}=regexp:gsub(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Regexp&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Regexp&lt;/span&gt;),&lt;br /&gt;  replace_forb_chars(&lt;span style="color: rgb(184, 134, 11);"&gt;Newstr&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;RT&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;replace_forb_chars&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;,[]) -&amp;gt;&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;S&lt;/span&gt;.&lt;br /&gt;    &lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%to_file writes friends into DOT file&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;to_file&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;) -&amp;gt;&lt;br /&gt;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%this line violates DRY (Refactor?)&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;    {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;}=file:open(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"mnm.file"&lt;/span&gt;&lt;/b&gt;,[append]),&lt;br /&gt;  to_file(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;).&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;to_file&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,[{&lt;span style="color: rgb(184, 134, 11);"&gt;User&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnds&lt;/span&gt;}|&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;]) -&amp;gt;&lt;br /&gt;  %&lt;span style="color: rgb(184, 134, 11);"&gt;TODO&lt;/span&gt;: &lt;span style="color: rgb(184, 134, 11);"&gt;Format&lt;/span&gt; &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;of&lt;/span&gt;&lt;/b&gt; map/frineds&lt;br /&gt;  &lt;span style="color: rgb(184, 134, 11);"&gt;Out_Frnd&lt;/span&gt;= &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;fun&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;)-&amp;gt; io:format(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"\"~s\" -&amp;gt; \"~s\"~n"&lt;/span&gt;&lt;/b&gt;,[&lt;span style="color: rgb(184, 134, 11);"&gt;User&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnd&lt;/span&gt;]) &lt;b&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;end&lt;/span&gt;&lt;/b&gt;,&lt;br /&gt;  lists:map(&lt;span style="color: rgb(184, 134, 11);"&gt;Out_Frnd&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;Frnds&lt;/span&gt;),&lt;br /&gt;  to_file(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;span style="color: rgb(184, 134, 11);"&gt;T&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;to_file&lt;/span&gt;&lt;/b&gt;(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,[]) -&amp;gt;&lt;br /&gt;  file:close(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;),&lt;br /&gt;  ok_to_file.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%init_file initializes the DOT file  &lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;init_file&lt;/span&gt;&lt;/b&gt;() -&amp;gt;&lt;br /&gt;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%this line violates DRY (Refactor?)&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;    {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;}=file:open(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"mnm.file"&lt;/span&gt;&lt;/b&gt;,[write]),&lt;br /&gt;  io:format(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"digraph mydot {~nnode [color=red, shape=ellipse];~n"&lt;/span&gt;&lt;/b&gt;,[]),&lt;br /&gt;  file:close(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%end_file inserts the coda in the DOT file  &lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;end_file&lt;/span&gt;&lt;/b&gt;() -&amp;gt;&lt;br /&gt;  &lt;i&gt;&lt;span style="color: rgb(178, 34, 34);"&gt;%this line violates DRY (Refactor?)&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;    {ok,&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;}=file:open(&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"mnm.file"&lt;/span&gt;&lt;/b&gt;,[append]),&lt;br /&gt;  io:format(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;,&lt;b&gt;&lt;span style="color: rgb(188, 143, 143);"&gt;"[weight=1, color=black];~n}~n"&lt;/span&gt;&lt;/b&gt;,[]),&lt;br /&gt;  file:close(&lt;span style="color: rgb(184, 134, 11);"&gt;F&lt;/span&gt;).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Referencias sobre Erlang&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.erlang.org/course/sequential_programming.html"&gt;Sequential programming&lt;/a&gt; y &lt;a href="http://www.erlang.org/course/concurrent_programming.html"&gt;Concurrent Programming&lt;/a&gt;: primeros pasos en Erlang&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.erlang.org/doc/doc-5.5.4/lib/stdlib-1.14.4/doc/html/index.html"&gt;Erlang stdlib&lt;/a&gt;: lo primero que debería mirar uno de un nuevo lenguaje. Reinventar la rueda es una cosa muy fea, a no ser que vayas a hacer una rueda más bonita ;P&lt;/li&gt;&lt;li&gt;&lt;a href="http://schemecookbook.org/Erlang/WebHome"&gt;Erlang Cookbook&lt;/a&gt;: ejemplos de cosas comunes en erlang. Recetillas&lt;/li&gt;&lt;li&gt;Comenté alguna otra referencia para empezar con este lenguaje en &lt;a href="http://yapw.blogspot.com/2007/04/programando-con-erlang.html"&gt;Programando con Erlang&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7481644987097523252?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7481644987097523252/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7481644987097523252' title='19 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7481644987097523252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7481644987097523252'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/05/visualizando-redes-sociales-amigos-en.html' title='Visualizando redes sociales: amigos en Barrapunto y menéame'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SzX3U6-RV_I/RltOIu7JD9I/AAAAAAAAACA/HT5lzpK5G7c/s72-c/bpraw.png' height='72' width='72'/><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6145420371811863975</id><published>2007-05-03T11:50:00.001+02:00</published><updated>2008-03-28T23:32:18.161+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tolerancia a fallos'/><category scheme='http://www.blogger.com/atom/ns#' term='tolerancia'/><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='gurús'/><category scheme='http://www.blogger.com/atom/ns#' term='Postel'/><category scheme='http://www.blogger.com/atom/ns#' term='Dracón'/><title type='text'>¿Postel o Dracón?</title><content type='html'>&lt;p&gt;La primera vez que leí sobre la &lt;a href="http://en.wikipedia.org/wiki/Postel's_Law"&gt;ley de Postel&lt;/a&gt;: &lt;em&gt;"Sé conservador con lo que envias, liberal con lo que recibes"&lt;/em&gt;(*) me pareció tan filosóficamente interesante que intenté escribir una entrada al respecto, pero no supe, porque no tengo el gen &lt;em&gt;gurú&lt;/em&gt; necesario para ello. Por eso, no está mal recurrir a los gurús de verdad, que sean ellos los que digan parte de lo que le ronda a uno por la cabeza. El caso es que en una semana dos &lt;em&gt;blogstars&lt;/em&gt; de esto de la programación y la tecnología han comentado algo relacionado, así que les cedo la palabra, claro (cada una de las entradas da mucho más de si, pero claro, para eso está enlazadas, para que se lean ;)):&lt;p&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000848.html"&gt;Jeff Atwood en Coding Horror habla de en "JavaScript and HTML: Forgiveness by Default" de como siendo tolerante a fallos se crea un ecosistema más robusto&lt;/a&gt;. En sus palabras: "el perdón por defecto es un requisito imprescindible para una adopción a gran escala tan masiva como la de la web". Eso si, no habla del precio que hay que pagar, porque una implementación tolerante a fallos, en general es más compleja. Hay que preguntarse &lt;a href="http://barrapunto.com/~mig21/journal/11469"&gt;¿qué hacer con los errores?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.intertwingly.net/blog/2007/05/02/Different-Drummer"&gt;Sam Ruby en "Different Drummer"&lt;/a&gt; habla del diseño de &lt;a href="http://en.wikipedia.org/wiki/HTML5"&gt;HTML5&lt;/a&gt; y se pregunta si ganarán los que siguen a &lt;a href="http://es.wikipedia.org/wiki/Drac%C3%B3n"&gt;Dracón&lt;/a&gt; o a &lt;a href="http://en.wikipedia.org/wiki/Jon_Postel"&gt;Postel&lt;/a&gt;. Él se decanta por Postel, claro. El resto del post muy interesante también. Muy gurú. Muy Sam Ruby :)&lt;br&gt; Por cierto que habla de &lt;a href="http://barrapunto.com/article.pl?sid=07/04/16/1229225"&gt;Silverlight&lt;/a&gt; y dice que también es Draconiano. En eso no me voy a meter, le cedo la palabra a otro que sabe más que yo (no voy a llamarle gurú porque igual no le gusta): &lt;a href="http://hronia.blogalia.com/historias/49119"&gt;Yogur Griego: "Silverlight ¿el imperio contraataca?"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Hablando de gurús y aunque no es nuevo, no me resisto a enlazar otra vez &lt;a href="http://www.dreamsongs.com/ObjectsHaveFailedNarrative.html"&gt;"Objects Have Failed" de Richard P. Gabriel&lt;/a&gt; debido a que uno de sus argumentos para la irrelevancia de los objetos es (exagerando creo, tiene algún recurso literario, quizás por eso me gusta más...): &lt;blockquote&gt;En el viejo mundo nos centrábamos en la eficiencia, la limitación de recursos, el rendimiento, los programas monolíticos, los sistemas aislados, los programas hechos por un sólo autor y las aproximaciones matemáticas. En el nuevo mundo pasarán a primer plano  la robustez, la flexibilidad, la adaptación, los sistemas distribuidos, los programas de múltiples autores y las metáforas biológicas de la computación.&lt;/blockquote&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;(*)Otras veces nombrado como "Sé conservador con lo que haces, liberal con lo que aceptas de otros". El enunciado es susceptible de ser políticamente interpretable más aún en esta segunda encarnación del principio. En este caso yo creo que es más bien interpretable desde el punto de vista de la ética. Como referencia se puede leer lo que dice &lt;a href="http://www.w3.org/People/Berners-Lee/UU.html"&gt;Tim Berners-Lee acerca de esto&lt;/a&gt; y de una frase (que fué durante un tiempo firma mía) acerca del funcionamiento descentralizado "We have no kings or presidents. We believe in rough consensus and running code". Eso si, con grandes influencias de &lt;a href="http://es.wikipedia.org/wiki/Unitarismo_universalista"&gt;Unitarismo universalista&lt;/a&gt;, una religión más o menos buenrollista, si es que eso es posible...&lt;/p&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/25948"&gt;"¿Postel o Dracón?" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6145420371811863975?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6145420371811863975/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6145420371811863975' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6145420371811863975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6145420371811863975'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/05/postel-o-dracn.html' title='¿Postel o Dracón?'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-6938116791816559605</id><published>2007-04-30T14:48:00.000+02:00</published><updated>2007-05-02T18:30:34.587+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='threads'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>Entrevista sobre YARV</title><content type='html'>&lt;p&gt;Vía &lt;a href="http://programming.reddit.com/"&gt;la sección de reddit de programación&lt;/a&gt; (que a pesar de su sistema de filtrado y puntuación, también tiene &lt;a href="http://yapw.blogspot.com/2007/01/exceso-de-informacin-filtros-bayesiano.html"&gt;el mal del exceso de información&lt;/a&gt;... ) he encontrado &lt;a href="http://blog.grayproductions.net/articles/2007/02/16/the-ruby-vm-serial-interview"&gt;una serie de entrevistas sobre la nueva máquina virtual que ejecutará Ruby&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/YARV"&gt;YARV&lt;/a&gt;. Responden las dos personas más involucradas en ello, &lt;a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Matz&lt;/a&gt; (recordemos, el creador del lenguaje) y a Koichi Sasada, el desarrollador principal.&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.grayproductions.net/articles/2007/03/16/the-ruby-vm-episode-ii"&gt;En la segunda parte de la entrevista se habla de las distintas implementaciones de los entornos de ejecución de Ruby&lt;/a&gt;. Por resumir, Koichi dice: "Necesitamos especificaciones, buenos test y buenos &lt;em&gt;benchmarks&lt;/em&gt;". Por las &lt;a href="http://barrapunto.com/journal.pl?op=top"&gt;bitácoras de barrapunto&lt;/a&gt; se ha hablado de ello, porque &lt;a href="http://barrapunto.com/~Robert+h+Quinn/"&gt;Robert h Quinn&lt;/a&gt; está trabajando en los test, según comentaba en &lt;a href="http://barrapunto.com/~Robert+h+Quinn/journal/25731"&gt; GSoC 2007 : De que va mi proyecto&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Sobre todo me ha gustado &lt;a href="http://blog.grayproductions.net/articles/2007/04/27/the-ruby-vm-episode-iii"&gt;la tercera parte, sobre el pasado el presente y el futuro de los threads en Ruby&lt;/a&gt;.En esta parte se argumentan las razones por las que se abandonó la implementación de threads en espacio de usuario por el uso de los threads nativos del sistema, además de explicar como eso afecta el soporte de &lt;a href="http://en.wikipedia.org/wiki/Continuation"&gt;continuaciones&lt;/a&gt;. &lt;br&gt;(Hablamos de estas cosas hace unos meses en &lt;a href="http://barrapunto.com/~mig21/journal/23411"&gt; Noticias sobre Ruby 2.0&lt;/a&gt; (que al parecer no son sobre 2.0 estrictamente...)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; Como me &lt;a href="http://barrapunto.com/comments.pl?sid=70362&amp;cid=905388"&gt;comenta Robert h Quinn&lt;/a&gt;, en &lt;a href="http://on-ruby.blogspot.com/"&gt;On Ruby&lt;/a&gt; tienen &lt;a href="http://on-ruby.blogspot.com/search/label/Interview"&gt;una serie de entrevistas a los desarrolladores de distintas implementaciones de entornos de ejecución de Ruby&lt;/a&gt;. Más para leer...&lt;/p&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/25910"&gt;"Entrevista sobre YARV" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-6938116791816559605?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/6938116791816559605/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=6938116791816559605' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6938116791816559605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/6938116791816559605'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/04/entrevista-sobre-yarv.html' title='Entrevista sobre YARV'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5611317999883450132</id><published>2007-04-18T23:53:00.000+02:00</published><updated>2007-04-19T09:25:52.590+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrencia'/><category scheme='http://www.blogger.com/atom/ns#' term='programación concurrente'/><category scheme='http://www.blogger.com/atom/ns#' term='programación funcional'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Programando con Erlang</title><content type='html'>&lt;p&gt;&lt;a href="http://pragdave.pragprog.com/pragdave/"&gt;Dave Thomas&lt;/a&gt; ha escrito una serie de apuntes introductorios a &lt;a href="http://es.wikipedia.org/wiki/Erlang"&gt;erlang&lt;/a&gt;, aprovechando el nuevo libro, &lt;a href="http://pragmaticprogrammer.com/titles/jaerlang/index.html"&gt;Programming Erlang de Joe Armstrong&lt;/a&gt; (un esfuerzo publicitario, porque el libro se publica bajo el amparo de &lt;a href="http://www.pragmaticprogrammer.com/"&gt;los programadores pragmáticos&lt;/a&gt;, pero aquí nos da igual, ¿no?)&lt;/p&gt;&lt;p&gt;Entonces pasemos a los enlaces:&lt;ul&gt;&lt;li&gt;&lt;a href="http://pragdave.pragprog.com/pragdave/2007/04/a_first_erlang_.html"&gt;A First Erlang Program&lt;/a&gt; Un programita para usar la API de servicios web de amazon&lt;/li&gt;&lt;li&gt;&lt;a href="http://pragdave.pragprog.com/pragdave/2007/04/adding_concurre.html"&gt;Adding Concurrency to Our Erlang Program&lt;/a&gt; El mismo programa, pero concurrente&lt;/li&gt;&lt;/ul&gt;Y algunos enlaces más&lt;ul&gt;&lt;li&gt;&lt;a href="http://pragmaticprogrammer.com/articles/erlang.html"&gt;What's all this fuss about Erlang?&lt;br /&gt;por Joe Armstrong&lt;/a&gt;, una introducción al lenguaje&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.erlang.org/download/erlang-book-part1.pdf"&gt;Concurrent Programming in Erlang, Part I (pdf 884 KB)&lt;/a&gt; un libro introductorio con el que estuve trasteando hace un tiempo, también de Armstrong (entre otros)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;Publicitado también desde los programadores pragmáticos... ¿le pasará lo mismo que a &lt;a href="http://es.wikipedia.org/wiki/Ruby"&gt;Ruby&lt;/a&gt;? ¿tendrá el mismo crecimiento? Personalmente lo dudo, a pesar de que el lenguaje tiene unas características muy interesantes, entre otras el tratamiento de la concurrencia. La principal &lt;em&gt;pega&lt;/em&gt; la comenta el propio Armstrong en el artículo introductorio: &lt;em&gt;¿Es Erlang difícil? No, pero es diferente&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;(Se habló en barrapunto de él hace bastante tiempo en &lt;a href="http://barrapunto.com/article.pl?sid=03/02/13/1442249"&gt; Otro lenguaje de programación: Erlang&lt;/a&gt;)&lt;/p&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/25759"&gt;Programando con Erlang en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5611317999883450132?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5611317999883450132/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5611317999883450132' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5611317999883450132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5611317999883450132'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/04/programando-con-erlang.html' title='Programando con Erlang'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-5328760874228199210</id><published>2007-04-17T14:37:00.000+02:00</published><updated>2007-04-18T10:26:42.807+02: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='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='escalabilidad'/><category scheme='http://www.blogger.com/atom/ns#' term='flame'/><title type='text'>Twitter, RoR, escalabilidad y flames</title><content type='html'>&lt;p&gt;Ha sido imposible escapar al contrahype: un desarrollador de &lt;a href="http://twitter.com/"&gt;twitter&lt;/a&gt;, el servicio &lt;em&gt;webdospuntocero&lt;/em&gt; de moda (¿o ya no está de moda?, no sé, a mi que no me pregunten, que yo en estas cosas estoy muy &lt;em&gt;démodé&lt;/em&gt;), &lt;a href="http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/"&gt;Alex Payne, declaró que Ruby on Rails no escala, que tiene un cuello de botella en la base de datos&lt;/a&gt; (comentado en barrapunto en &lt;a href="http://barrapunto.com/article.pl?sid=07/04/13/1617236"&gt; Entrevista con Alex Payne, uno de los desarrolladores de Twitter&lt;/a&gt;) y se desató el &lt;em&gt;multiflame&lt;/em&gt;. Debido a la relevancia y al ruido conseguido por los fans de &lt;a href="http://es.wikipedia.org/wiki/Ruby_on_Rails"&gt;RoR&lt;/a&gt; parece que se les tenía ganas... El hecho es que se ha levantado una polvareda de bytes bastante importante, lo que en estos tiempos significa una &lt;em&gt;conversación&lt;/em&gt; fragmentada de post cruzados en muchísimos blogs y alguna lista de correo, que aún quedan :)&lt;/p&gt;&lt;p&gt;Tengo que reconocer que me gustan los flames, sobretodo si no me tocan de cerca, porque en general y con un poco de suerte, de tanto ruido se puede extraer información interesante...&lt;/p&gt;&lt;p&gt;Aunque, debo confesar, esta vez me ha sorprendido que la onda expansiva ha llegado hasta la &lt;em&gt;blogosfera hispana&lt;/em&gt;, cosa que no suele ser usual... Primero pues, los enlaces en castellano. Ah, seguro que me dejo algo, se admiten sugerencias de enlaces interesantes :)&lt;ul&gt;&lt;li&gt;&lt;a href="http://mnm.uib.es/gallir/posts/2007/04/13/1050/"&gt;Ricardo Galli: Los problemas de Twitter (y la escalibilidad)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Un muy reciente &lt;a href="http://www.lacoctelera.com/porras/post/2007/04/17/la-polemica-sobre-escalabilidad-rails"&gt;La polémica sobre la escalabilidad de Rails&lt;/a&gt; (tan reciente que lo ha escrito mientras yo redactaba esto y que es un buen resumen y además &lt;a href="http://www.lacoctelera.com/myfiles/porras/ror_db_balancing.html"&gt;apunta posibles soluciones&lt;/a&gt;...) de &lt;a href="http://www.lacoctelera.com/porras"&gt;Sergio Gil (porras)&lt;/a&gt;, aunque ya dejó algún mensaje interesante en barrapunto: &lt;a href="http://barrapunto.com/comments.pl?sid=70040&amp;cid=899412"&gt;La escalabilidad de Rails&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://barrapunto.com/~rvr/journal/22086"&gt;rvr ya hizo referencia hace casi un año a un artículo&lt;/a&gt;, &lt;a href="http://darwinweb.net/article/Does_Rails_Scale_Down"&gt;Does Rails Scale Down?&lt;/a&gt; que pone de manifiesto el posible peligro.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.simplelogica.net/pipermail/ror-es/2007-April/007379.html"&gt;"Los dolores de Ruby on Rails" en la lista de correo ror-es&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Ahora en inglés. De David Heinemeier Hansson:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.loudthinking.com/arc/000608.html"&gt;Twitter trouble&lt;/a&gt;. Primera reacción de DHH (Parodiada en &lt;a href="http://diveintomark.org/archives/2007/04/16/dhh-translation"&gt;DHH translation&lt;/a&gt; con mucha acidez. Puro flame.)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.loudthinking.com/arc/000610.html"&gt;Scaling to multiple databases with Rails&lt;/a&gt; Solución rápida a la conexión a distintas bases de datos con rails&lt;/li&gt;&lt;/ul&gt;Ha habido respuesta de diversa índole, pero se pueden rastrear fácilmente. Solo voy a resaltar alguna que se va por las ramas, que son las que más me interesan ;)&lt;ul&gt;&lt;li&gt;&lt;a href="http://warrenseen.com/blog/2007/04/16/is-platform-selection-premature-optimisation/"&gt;Is platform selection premature optimisation?&lt;/a&gt; ¿cuando se empieza a optimizar? Dice el dicho, &lt;a href="http://barrapunto.com/~fernand0/journal/25738"&gt;comentado ahora mismo en la bitácora de fernand0, que &lt;em&gt;Primero haz que funcione, segundo hazlo elegante y después hazlo que sea rápido&lt;/em&gt;&lt;/a&gt; Y estoy completamente de acuerdo, pero a twitter el tercer paso le vino demasiado rápido, me temo... O sea ¿cuando llega el momento de optimizar?&lt;/li&gt;&lt;li&gt;&lt;a href="http://lambda-the-ultimate.org/node/2198"&gt;Twitter and Rails brouhaha&lt;/a&gt; Sobre la conveniencia de evaluar lenguajes y frameworks separadamente&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Actualización: &lt;/strong&gt;Me olvidé de poner uno interesante &lt;a href="http://www.codinghorror.com/blog/archives/000839.html"&gt;"Reddit: Language vs. Platform" en Coding Horror&lt;/a&gt;, en el que se recuerda el caso &lt;a href="http://reddit.com/"&gt;reddit&lt;/a&gt; con interesantes lecturas también...&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt; Dice &lt;a href="http://sobrerailes.com/articles/2007/4/17/de-twitter-rails-y-la-escalabilidad"&gt;Juan Lupión en "sobre railes" que permanezcamos a la escucha&lt;/a&gt;. Desde luego, un flame es un flame ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/25744"&gt;Twitter, RoR, escalabilidad y flames en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-5328760874228199210?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/5328760874228199210/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=5328760874228199210' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5328760874228199210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/5328760874228199210'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/04/twitter-ror-escalabilidad-y-flames.html' title='Twitter, RoR, escalabilidad y flames'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11818694.post-7921241831776055097</id><published>2007-04-10T23:55:00.000+02:00</published><updated>2007-04-12T22:14:25.806+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programación funcional'/><category scheme='http://www.blogger.com/atom/ns#' term='paradigmas'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='Joe Armstrong'/><category scheme='http://www.blogger.com/atom/ns#' term='programación orientada a objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Orientación a objetos: algunas críticas</title><content type='html'>Vía &lt;a href="http://programming.reddit.com/info/1gfov/comments"&gt;Reddit&lt;/a&gt; me he encontrado con un escrito, intencionadamente provocador diría yo, de &lt;a href="http://www.sics.se/~joe/index.html"&gt;Joe Armstrong&lt;/a&gt; (&lt;a href="http://yapw.blogspot.com/2007/04/entrevistas-gurs-de-la-programacin.html"&gt;de nuevo&lt;/a&gt;): &lt;a href="http://www.sics.se/~joe/bluetail/vol1/v1_oo.html"&gt;Why OO Sucks&lt;/a&gt;. No obstante me gustaría resaltar los argumentos, que dan que pensar y para eso estamos aquí:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Las estructuras de datos y las funciones no deberían ir juntas:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt; Esto es una característica en principio ventajosa de la POO, pero puede ser una servidumbre, además de que no deja aprovechar algoritmos genéricos al estilo de C++ con la &lt;a href="http://en.wikipedia.org/wiki/Standard_Template_Library"&gt;STL&lt;/a&gt;. No obstante hay que decir que variaciones de la programación orientada a objetos permiten el &lt;a href="http://en.wikipedia.org/wiki/Duck_typing"&gt;Duck typing, como en python o ruby&lt;/a&gt; que favorece la posibilidad de hacer algoritmos más genéricos...&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Todo debe ser un objeto:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt; Relacionada con la anterior, todo dato debe ser un objeto y tener la parafernalia necesaria para serlo. En esto los lenguajes van mejorando, creo yo, reduciendo lo necesario para ser objeto, a veces haciéndolo implícito.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;La estructura de datos está dispersa por todos lados:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;Y no le falta razón. Esto es particularmente importante si las estructuras de datos van a ser usadas para hacer la interoperabilidad entre sistemas heterogéneos&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Los objetos tienen un estado privado:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;Esta es una crítica muy desde la perspectiva de la &lt;a href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_funcional"&gt;Programación funcional&lt;/a&gt; (bueno, las otras también...) pero muy interesante. La primera vez que oí eso de que en &lt;a href="http://es.wikipedia.org/wiki/Erlang"&gt;Erlang&lt;/a&gt; (por ejemplo) no se podía &lt;em&gt;reasignar&lt;/em&gt; variables me resultó muy chocante, pero ver hacer las cosas de un modo diferente es muy ilustrativo a veces... Es el "truco" de estos lenguajes de no usar el estado para evitar efectos laterales, muy relevante también para programación concurrente.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Mi opinión sobre el tema ya la expresé en &lt;a href="http://barrapunto.com/article.pl?sid=07/02/12/1028245"&gt; ¿Ha muerto la orientación a objetos?&lt;/a&gt;:&lt;em&gt; Conceptos como encapsulamiento, interfaces, reusabilidad pueden seguir siendo útiles&lt;/em&gt;, pero hay que evaluar el impacto positivo, no sea que matemos moscas a cañonazos... &lt;/p&gt;Y ahora una serie de enlaces sobre el mismo tema:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.iwriteiam.nl/AoP_OOCH.html"&gt;Object-Oriented Considered Harmful&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.devx.com/opinion/Article/26776/1954?pf=true"&gt;OOP Is Much Better in Theory Than in Practice&lt;/a&gt; Una crítica desde el punto de vista del programador de a pie, comentado en &lt;a href="http://lambda-the-ultimate.org/node/489"&gt;lambda the ultimate&lt;/a&gt; y &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=31439"&gt;The Server Side&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://erick.cibercalli.com/blog/display/29"&gt;¿Porque ARC no es especialmente orientado a Objetos?&lt;/a&gt; por &lt;a href="http://www.paulgraham.com/index.html"&gt;Paul Graham&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dmoz.org/Computers/Programming/Methodologies/Object-Oriented/Criticism/"&gt;Listado de críticas a la orientación a objetos en dmoz&lt;/a&gt; que enlaza a un muy interesante &lt;a href="http://dreamsongs.com/ObjectsHaveFailedNarrative.html"&gt;Objects Have Failed&lt;/a&gt; de &lt;a href="http://www.dreamsongs.com/"&gt;Richard P. Gabriel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=187331"&gt;Software Reusability: Myth Or Reality?&lt;/a&gt; Una de las supuestas ventajas de la OO es la reusabilidad, pero ¿es posible conseguirla?&lt;/li&gt;&lt;li&gt;Y por fin algo por contrastar: &lt;a href="http://www.hacknot.info/hacknot/action/showEntry?eid=93"&gt;Invasion Of The Dynamic Language Weenies&lt;/a&gt; como respuesta a los fans forofos de los lenguajes dinámicos...&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barrapunto.com/~mig21/journal/25661"&gt;"Orientación a objetos: algunas críticas" en barrapunto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11818694-7921241831776055097?l=yapw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yapw.blogspot.com/feeds/7921241831776055097/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11818694&amp;postID=7921241831776055097' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7921241831776055097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11818694/posts/default/7921241831776055097'/><link rel='alternate' type='text/html' href='http://yapw.blogspot.com/2007/04/orientacin-objetos-algunas-crticas.html' title='Orientación a objetos: algunas críticas'/><author><name>mig21</name><uri>http://www.blogger.com/profile/11084202300080200239</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_SzX3U6-RV_I/SW8be62aKoI/AAAAAAAAADk/U8184qG0NOM/S220/p-cab9fa16436111ddae53003048343a40-large-1.jpg'/></author><thr:total>0</thr:total></entry></feed>
