tag:blogger.com,1999:blog-118186942024-03-07T06:14:08.002+01:00Yet Another Programming WeblogComo su propio nombre indica, aún otro weblog de programación másmig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.comBlogger154125tag:blogger.com,1999:blog-11818694.post-33030324297356593552011-06-13T10:21:00.004+02:002011-06-13T10:28:10.029+02:00Un Clúster con SLURM, uso y configuraciónHe 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.<div style="width:425px" id="__ss_8289890"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/miguelolivan/un-clster-con-slurm-uso-y-configuracin" title="Un Clúster con SLURM, uso y configuración">Un Clúster con SLURM, uso y configuración</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8289890" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/miguelolivan">miguelolivan</a> </div> </div>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-89227611360783608092011-05-13T23:23:00.004+02:002011-05-13T23:43:30.335+02:00Lo que todo programador de C debería saber sobre el "comportamiento indefinido"Este ha sido uno de los artículos damnificados por <a href="http://barrapunto.com/article.pl?sid=11/05/13/1020214">la caída de blogger.com</a> y por eso no lo he puesto aquí antes, pero me gustaría reseñar este <a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html">What Every C Programmer Should Know About Undefined Behavior 1/3</a> del <a href="http://blog.llvm.org/">blog de LLVM</a>. 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: <a href="http://blog.regehr.org/archives/213">A Guide to Undefined Behavior in C and C++, Part 1</a>, <a href="http://blog.regehr.org/archives/226">Part 2</a> y <a href="http://blog.regehr.org/archives/232">Part 3</a>.<br /><br />Del primero de esa serie, para que quede claro de qué va el asunto :) <blockquote>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.</blockquote> 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.<br /><br />Soy un atento seguidor del <a href="http://blog.llvm.org/">blog de LLVM</a>, pero esta vez lo he visto en <a href="http://twitter.com/#!/toomanysecrets">el twitter de TooManySecrets</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-44988620865929758572011-04-29T11:59:00.003+02:002011-04-29T12:04:21.816+02:00¿Testeo o especificaciones?¿Cómo se determina el comportamiento de un sistema? ¿Testeo o leyes, estándares, especificaciones...? Como siempre, es mi postura, <a href="http://yapw.blogspot.com/2007/07/testeo-o-correccin.html">las dos</a>. El ejemplo surge de una <a href="http://barrapunto.com/comments.pl?sid=86932&cid=1275396">incialización incompleta de un array de caracteres</a> ¿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?<br /><br />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 :)<br /><br />En el punto 8.5.2.3 del <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf">estándar C++0x</a> se habla de lo que ocurre si se proporcionan menos caracteres a la inicialización:<br /><br /><blockquote>If there are fewer initializers than there are array elements, each element not explicitly initialized shall be<br />zero-initialized </blockquote><br /><br />Sin embargo este punto está ausente en el <a href="http://www-d0.fnal.gov/~dladams/cxx_standard.pdf">C++98</a>. Los test aparentemente dicen que se suelen rellenar de ceros ¿Por qué? y ¿Podemos confiar en que <em>siempre</em> sea así?<br /><br />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 <a href="http://www-d0.fnal.gov/~dladams/cxx_standard.pdf">C++98</a>: <br /><blockquote> 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)<br />[Example:<br /> struct S { int a; char* b; int c; };<br /> S ss = { 1, "asdf" };<br /> initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form<br /> int(), that is, 0. ]<br /><br /></blockquote><br /><br />En <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf">C++0x</a> pensaba que quizás cambia algo pero el punto 8.5.1.7 para decir básicamente lo mismo:<br /><blockquote>If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member<br />not explicitly initialized shall be initialized from an empty initializer list (8.5.4)<br /></blockquote><br />Las diferencias vienen de los mejoradas <a href="http://en.wikipedia.org/wiki/C++0x#Initializer_lists">listas de inicialización de C++0x</a>.<br /><br />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...<br /><br />Lecciones a aprender, al menos tal como yo lo veo:<br /><ul><li>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</li><li>Conocer los estándares y especificaciones que usamos o al menos saber buscar en ellas en caso de duda</li><li>Testear. cuantas más pruebas se hagan al código más fácil es encontrar los "casos patológicos"</li><br /></ul>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-47361032349681085092010-12-02T15:41:00.006+01:002010-12-03T10:31:11.691+01:00Lo mínimo imprescindible para controlar código fuente con subversionHe realizado una presentación para ayudar a un pequeño cursito sobre <a href="http://subversion.apache.org/">subversion</a> 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 <a href="http://svnbook.red-bean.com/">Version Control with Subversion</a> y concretamente en el apartado del <a href="http://svnbook.red-bean.com/nightly/en/svn.tour.cycle.html">ciclo básico de trabajo con svn</a> con algunos añadidos de gráficos, buenas prácticas, programas auxiliares y algunos enlaces básicos. Por cierto, gracias a <a href="http://blackshell.usebox.net/">Juanjo</a> que le ha echado un vistazo y ha detectado alguna carencia. <br /><div style="width:425px" id="__ss_6006689"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/miguelolivan/sv-nbasico" title="Sistemas de control de versiones. Introducción a svn">Sistemas de control de versiones. Introducción a svn</a></strong><object id="__sse6006689" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=svnbasico-101202082650-phpapp01&stripped_title=sv-nbasico&userName=miguelolivan" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6006689" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=svnbasico-101202082650-phpapp01&stripped_title=sv-nbasico&userName=miguelolivan" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/miguelolivan">miguelolivan</a>.</div></div><br /><br />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 <a href="http://fernand0.blogalia.com//historias/68196">los científicos programen mejor</a>. En beneficio de todos :)mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com2tag:blogger.com,1999:blog-11818694.post-85399913937913684822010-11-11T10:55:00.002+01:002010-11-11T10:58:42.386+01:00Recuperar ficheros de texto de sistema de ficheros corruptoHace 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 :)<br /><br />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:<br />- Que la controladora del disco responda y que se pueda leer del dispositivo<br />- 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.<br />- 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 <tt>dd</tt>, pero se va de la recetilla que he aplicado)<br /><br />Entonces lo primero de todo (aplicable a cualquier situación donde un disco empiece a hacer cosas raras) es volcar el contenido del disco<br /><br /><tt>#dd if=/dev/sd[ndev] of=/[outfile] bs=[sizeblock] conv=sync,noerror</tt> <br /><br />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 <tt>sync, noerror</tt> 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 <tt>strings</tt>. 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:<br /><br /><tt>$ strings -n20 -a -t d outfile > outfile.str</tt><br /><br />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.<br />Posteriormente se pueden hacer <tt>grep</tt>s o buscar con <tt>less</tt> 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 <tt>dd</tt>:<br /><br /><tt>$ dd if=sdb1 bs=1 skip=[pos-offset] count=filesize 2>/dev/null > file.c</tt><br /><br />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...<br /><br />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.mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-82278884902515915662010-10-27T22:40:00.004+02:002010-10-28T09:29:17.894+02:00Electronic Arts publica EASTL como software libreYa lo he <a href="http://softlibre.barrapunto.com/article.pl?sid=10/10/27/2016236">publicado en barrapunto</a>, 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í :)<br /><br />El tema es que un pobrecito hablador ha envíado un enlace con la noticia de que <a href="http://github.com/paulhodge/EASTL">Electronic Arts (EA) ha publicado EASTL como software libre</a>. La <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html">EASTL</a> es la versión de EA de la <a href="http://en.wikipedia.org/wiki/Standard_Template_Library">STL</a>, la biblioteca estándar de plantillas de C++. Fue desarrollada por <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html#Motivation">EA motivados por las exigencias extremas del uso de la memoria y CPU en el ámbito de los juegos</a>. Ha sido publicada en la web <a href="http://gpl.ea.com/">de software libre de EA en formato zip</a>. <a href="http://github.com/paulhodge/EASTL">Paul Hodge ha creado posteriormente un repositorio en github con el mismo código</a>. En la <a href="http://www.reddit.com/r/programming/search?q=EASTL">sección de desarrollo de juegos de reddit</a> han publicado algunos enlaces y comentarios que me han parecido interesantes y los pego a continuación.<br /><br />Se puede leer allí <a href="http://www.reddit.com/r/gamedev/comments/dssua/gamedev_thought_you_might_know_eastl_has_been/">la propia noticia</a>, <a href="http://www.reddit.com/r/gamedev/comments/dw6po/analysis_of_a_day_integrating_eastl_in_a_simple/">las experiencias de un desarrollador tratando de integrarla en un pequeño proyecto existente</a> y también <a href="http://www.reddit.com/r/gamedev/comments/duuhl/eastl_benchmarked/">se apunta</a> a <a href="http://msinilo.pl/blog/?p=668">una comparativa de rendimiento</a> con otras bibliotecas como la STL estándar o como <a href="http://code.google.com/p/rdestl/">RDE STL</a> hecha por el autor de esta última.<br /><br /><strong>Actualización y bola extra:</strong> Me he encontrado con este artículo que también puede interesar a los lectores de este blog y de la noticia anterior: <a href="http://gamesfromwithin.com/start-pre-allocating-and-stop-worrying">Start Pre-allocating And Stop Worrying</a>. Los que vistan el blog físicamente (si es que existen) ya saben que estas cosas las suelo poner en mis <a href="http://www.google.com/reader/shared/miguelolivan">compartidos de google.</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-56372187832898496032010-06-28T13:22:00.006+02:002010-06-28T16:24:07.653+02:00Using the magic behind TFormulaI wanted to evaluate conditions at runtime and I'm a happy user of <a href="http://root.cern.ch/drupal/">ROOT</a>. So I was thinking to use the "magic" behind <a href="http://root.cern.ch/root/html/TFormula.html">TFormula</a>. But <a href="http://root.cern.ch/root/html/TFormula.html">TFormula</a> has some limitations: the name of the variables are "x, y z, t" and I need to use arbitrary names...<br /><br />Doing some research I found <a href="http://root.cern.ch/root/htmldoc/RooFormulaVar.html">RooFormulaVar</a>, a class that is part of <a href="http://root.cern.ch/drupal/content/roofit">RooFit</a> and it does the job :) I think that <a href="http://root.cern.ch/root/htmldoc/RooFormulaVar.html">RooFormulaVar</a> 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 :)<br /><br />A simple example:<br /><br /><pre class="brush: cpp"><br />RooRealVar a("a","a",3.);<br />RooRealVar b("b","b",7.);<br />RooFormulaVar plus(“aplusb”,”a+b”,RooArgSet(a,b));<br />//10<br />cout << plus.getVal() << endl;</pre><br /><br />Evaluating bitwise operations and passing a set of arguments in a more dynamic way:<br /><pre class="brush: cpp"><br />TClonesArray tca("RooRealVar",2)<br />RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); <br />RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);<br /><br />RooFormulaVar opor("var1orvar2","var1&var2",RooArgSet(tca));<br /><br />var1->setVal(2.);<br />var2->setVal(7.);<br />//2<br />cout << opor.getVal() << endl;<br /><br />var1->setVal(5.);<br />var2->setVal(1.);<br />//1<br />cout << opor.getVal() << endl;<br /><br />var1->setVal(8.);<br />var2->setVal(1.);<br />//0<br />cout << opor.getVal() << endl;<br /></pre><br />Finally, evaluating logical expressions:<br /><pre class="brush: cpp"><br />TClonesArray tca("RooRealVar",2)<br />RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); <br />RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);<br /><br />RooFormulaVar cond("var1littvar2big","var1<1 || var2>10",RooArgSet(tca));<br /><br /><br />var1->setVal(0.);<br />var2->setVal(17.);<br /><br />//true<br />cout << cond.getVal() << endl;<br /><br />var1->setVal(3.);<br />var2->setVal(11.);<br /><br />//true<br />cout << cond.getVal() << endl;<br /><br />var1->setVal(8.);<br />var2->setVal(1.);<br />//false<br />cout << cond.getVal() << endl;<br /></pre><br />I hope that this blog entry will be useful and someone will save time and code. Cheers and happy coding! :)mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-9962597007018873942010-06-28T08:57:00.010+02:002010-06-28T13:19:20.213+02:00Cómo evaluar expresiones lógico-matemáticas en tiempo de ejecución (y usar la magia de TFormula)C++ es un lenguaje poco dinámico. En otros lenguajes se dispone del propio lenguaje en tiempo de ejecución y, usando <a href="http://en.wikipedia.org/wiki/Eval">Eval</a> 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 :)<br /><br />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 :)<br /><br /><ul><li>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...</li><li>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.</li><li>Embeber un lenguaje dinámico dentro de programa. Introduciría dependencias nuevas. Sonaba seductor :), pero seguramente demasiado arriesgado</li></ul> <br />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...)<br /><br />Así que esta entrada servirá además para mostrar una funcionalidad interesante de <a href="http://root.cern.ch/drupal/">ROOT</a> que podría ser usada por separado. Más o menos. El hecho es que <a href="http://root.cern.ch/drupal/">ROOT</a>, una librería de gestión y análisis de datos (en grandes cantidades) ya posee un evaluador de formulas que se llama <a href="http://root.cern.ch/root/html/TFormula.html">TFormula</a>. Es capaz de evaluar tanto expresiones matemáticas como lógicas o a nivel de bit. Cubre sobradamente mis exigencias. Al <a href="http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/first_steps/tformula.html">informarme más sobre su uso</a>, 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, <a href="http://root.cern.ch/drupal/content/roofit">RooFit</a>, existía una no muy documentada <a href="http://root.cern.ch/root/htmldoc/RooFormulaVar.html">RooFormulaVar</a>, 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:<br /><pre class="brush: cpp"><br />RooRealVar a("a","a",3.);<br />RooRealVar b("b","b",7.);<br />RooFormulaVar plus(“aplusb”,”a+b”,RooArgSet(a,b));<br />//10<br />cout << plus.getVal() << endl;<br /></pre><br /><br />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:<br /><pre class="brush: cpp"><br />TClonesArray tca("RooRealVar",2)<br />RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); <br />RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);<br /><br />RooFormulaVar opor("var1orvar2","var1&var2",RooArgSet(tca));<br /><br />var1->setVal(2.);<br />var2->setVal(7.);<br />//2<br />cout << opor.getVal() << endl;<br /><br />var1->setVal(5.);<br />var2->setVal(1.);<br />//1<br />cout << opor.getVal() << endl;<br /><br />var1->setVal(8.);<br />var2->setVal(1.);<br />//0<br />cout << opor.getVal() << endl;<br /></pre><br />Por último y más importante para mí, evaluar condiciones lógicas, por ejemplo:<br /><pre class="brush: cpp"><br />TClonesArray tca("RooRealVar",2)<br />RooRealVar *var1 = new (tca[1]) RooRealVar("var1","var2",0); <br />RooRealVar *var2 = new (tca[0]) RooRealVar("var2","var2",0);<br /><br />RooFormulaVar cond("var1littvar2big","var1<1 || var2>10",RooArgSet(tca));<br /><br /><br />var1->setVal(0.);<br />var2->setVal(17.);<br /><br />//true<br />cout << cond.getVal() << endl;<br /><br />var1->setVal(3.);<br />var2->setVal(11.);<br /><br />//true<br />cout << cond.getVal() << endl;<br /><br />var1->setVal(8.);<br />var2->setVal(1.);<br />//false<br />cout << cond.getVal() << endl;<br /></pre><br />Espero que sirva a alguien y que esa persona se pueda ahorrar tiempo y código :)mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-1865632731198714552010-05-18T11:53:00.005+02:002010-05-18T13:58:15.666+02:00Diseño del software de adquisición de datos para ANAISCreo 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:<br /><div style="width:425px" id="__ss_4136133"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/miguelolivan/diseo-sw-anais-4136133" title="Diseño del software de adquisición de datos para ANAIS">Diseño del software de adquisición de datos para ANAIS</a></strong><object id="__sse4136133" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=diseoswanais-100518040342-phpapp02&stripped_title=diseo-sw-anais-4136133" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4136133" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=diseoswanais-100518040342-phpapp02&stripped_title=diseo-sw-anais-4136133" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/miguelolivan">miguelolivan</a>.</div></div>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 <a href="http://en.wikipedia.org/wiki/DAMA/LIBRA">experimento DAMA</a> que dio un resultado positivo en la búsqueda de candidatos a la materia oscura, pero <a href="http://resonaances.blogspot.com/2010/04/more-trouble-with-dama.html">cuyos resultados son problemáticos en su interpretación</a>, 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 <a href="http://es.wikipedia.org/wiki/Materia_oscura">la materia oscura se puede leer la wikipedia</a> y para profundizar más en lo que se hace en el el laboratorio de Canfranc: <a href="http://www.unizar.es/acz/05Publicaciones/Revistas/Revista63/p041.pdf">"Dos décadas de búsqueda de materia oscura en el Laboratorio Subterráneo de Canfranc" de María Luisa Sarsa</a>.mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com2tag:blogger.com,1999:blog-11818694.post-18965671624215025612010-04-15T13:05:00.002+02:002010-04-15T13:11:38.085+02:00Publicado GCC 4.5<a href="http://gcc.gnu.org/gcc-4.5/">GCC 4.5 acaba de ser publicado</a>. En la <a href="http://gcc.gnu.org/gcc-4.5/changes.html">lista de cambios</a> 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 <a href="http://gcc.gnu.org/gcc-4.5/cxx0x_status.html">un gran avance en el soporte experimental de C++0x</a> además de la inclusión en la rama principal del <a href="http://gcc.gnu.org/wiki/plugins">sistema de plugins</a>.<br /><br />Al hilo del sistema de plugins ha surgido una acalorada discusión a raíz de una propuesta de <a href="http://gcc.gnu.org/ml/gcc/2010-04/msg00171.html">incluir en un futuro por defecto el plugin DragonEgg en la distribución de GCC</a>. <a href="http://dragonegg.llvm.org/">DragonEgg</a> en un plugin que reeemplaza las optimizaciones y la generación de código de GCC por las de <a href="http://llvm.org/">LLVM</a>.<br /><br />La misma entrada y previsiblemente más comentarios en <a href="http://softlibre.barrapunto.com/article.pl?sid=10/04/15/114213">Publicado GCC 4.5</a> 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 :)mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-54170158039003700412010-02-10T00:06:00.004+01:002010-02-10T09:29:58.946+01:00Clang ya se autocompila y GCC ya tiene sus primeros pluginsComo puede leer en el <a href="http://blog.llvm.org/2010/02/clang-successfully-self-hosts.html">blog de LLVM/Clang</a>, el compilador con <a href="http://en.wikipedia.org/wiki/University_of_Illinois/NCSA_Open_Source_License">licencia similar a la BSD</a> patrocinado por Apple:<br /><blockquote>¡Clang ha completado su primera <a href="http://en.wikipedia.org/wiki/Self-hosting">autocompilación</a>! Hemos compilado toda la <a href="http://en.wikipedia.org/wiki/Low_Level_Virtual_Machine">LLVM</a> y el propio <a href="http://en.wikipedia.org/wiki/Clang">Clang</a> 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 <a href="http://en.wikipedia.org/wiki/Bootstrapping_(compilers)"> <i>bootstraping</i> </a>.</blockquote>Más comentarios en <a href="http://www.osnews.com/story/22838/LLVM_Clang_Successfully_Self-Hosts_">OSNews</a> y <a href="http://www.reddit.com/r/programming/comments/ayaoi/clang_successfully_selfhosts/">reddit</a>. En noticias relacionadas, <a href="//softlibre.barrapunto.com/article.pl?sid=09/01/29/1121248&tid=30">el sistema de plugins de GCC</a> va dando sus frutos y la fundación Mozilla ha desarrollado <a href="https://developer.mozilla.org/En/Dehydra">Dehydra</a> y <a href="https://developer.mozilla.org/En/Treehydra">Treehydra</a>, unos <a href="http://lwn.net/Articles/370717/">plugins para hacer análisis estático de código C++</a>.<br /><br /><a href="http://barrapunto.com/article.pl?sid=10/02/09/2149250">La misma entrada y espero que más comentarios en <em>Clang ya se autocompila</em> en barrapunto</a>.mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com1tag:blogger.com,1999:blog-11818694.post-44865711261916538402009-12-23T22:32:00.005+01:002009-12-24T13:38:20.962+01:00Triple arranque en un MacMiniPues 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.<br /><br /> - Windows (XP al menos) sólo se instala bien en la última partición<br /> - Windows (XP al menos) sólo se instala bien si existen menos de cuatro particiones<br /><br />Bajo estas dos premisas, el particionado del sistema da muy poco juego, sabiendo que <a href="http://es.wikipedia.org/wiki/Tabla_de_partici%C3%B3n_GUID">GPT</a> ya crea una que no se puede obviar. Los pasos, muy resumidos, que he seguido para dejarlo funcionando con triple arranque:<br /><br /> - Instalar OSX<br /> - Ejecutar el asistente de BootCamp<br /> - Instalar <a href="http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CAoQFjAA&url=http%3A%2F%2Frefit.sourceforge.net%2F&ei=-YoyS6imJpiqjAf41bifBw&usg=AFQjCNEA3P6D87LPFNxSsnCoYf_ps0po3Q&sig2=UkMajx19mJUtoaeYoNSzhQ">rEFIt</a><br /> - Reparticionar para dejar cuatro particiones<br /> - Instalar windows en la última<br /> - Instalar Linux en la penúltima, instalar grub<br /> - Editar desde OSX el fichero <a href="http://refit.sourceforge.net/doc/c3s3_config.html">refit.conf</a> para que no arranque por defecto OSX<br /> - 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.<br /><br />Para todo el proceso he seguido varios enlaces, pero los más importantes son:<br /><ul><li><a href="http://giingo.org/bitacora/pivot/entry.php?id=326"> Linux en un Mac Mini (Intel Core Duo)</a> que va bastante bien si solo quieres instalar Linux.</li><li><a href="http://wiki.onmac.net/index.php/Triple_Boot_via_BootCamp">Triple Boot via BootCamp</a> en donde se explica bastante bien todos los problemas que me había encontrado previamente y cómo solucionarlos, sobre todo el famoso <tt>cannot find hall.dll</tt> que salía cuando trataba de instalar Windows en una partición que no era la última</li></ul><br />Bueno, en el camino he aprendido algo, aunque no demasiado, de <a href="http://es.wikipedia.org/wiki/Extensible_Firmware_Interface">EFI</a>, <a href="http://es.wikipedia.org/wiki/Tabla_de_partici%C3%B3n_GUID">GTP</a> y otras hierbas. Quizás haya alguien que encuentre algún error, omisión, que le resulte útil o que quiera añadir algo...<br /><br /><a href="http://barrapunto.com/~mig21/journal/33585">La misma entrada y algún comentario más en <em>Triple arranque en un MacMini</em> en barrapunto</a>.mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com2tag:blogger.com,1999:blog-11818694.post-6873318259732615022009-09-12T00:16:00.004+02:002009-09-12T08:27:58.548+02:00Facebook publica Tornado, servidor web usado en FriendFeedComo cuentan en <a href="http://lwn.net/Articles/352056/">LWN</a>, <a href="http://developers.facebook.com/news.php?blog=1&story=301&_fb_noscript=1">Facebook ha anunciado el lanzamiento de su servidor web Tornado bajo la licencia Apache</a>. <a href="http://www.tornadoweb.org/">Tornado</a> es un servidor Web <a href="http://en.wikipedia.org/wiki/Non-blocking_I/O">no bloqueante</a> 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 <a href="http://friendfeed.com/">FriendFeed</a>, que tienen previsto mantener activamente. Tornado es similar a "frameworks" Web ya existentes (<a href="http://www.djangoproject.com/">Django</a>, <a href="http://code.google.com/appengine/">webapp de Google</a>, <a href="http://webpy.org/">web.py</a>) pero se centra en <a href="http://bret.appspot.com/entry/tornado-web-server">la velocidad y en manejar grandes cantidades de tráfico simultáneo</a>. El código se puede obtener de <a href="http://www.tornadoweb.org/">tornadoweb.org</a>. Lo comentan también en <a href="http://www.reddit.com/r/programming/comments/9j8yp/facebook_opensources_friendfeeds_python_web/">reddit</a>, <a href="http://developers.slashdot.org/story/09/09/11/0256233/Facebook-Releases-Open-Source-Web-Server?from=rss">Slashdot</a> y <a href="http://news.ycombinator.com/item?id=815665">Hacker News</a> entre otros.<br /><br />Hay que recordar además que <a href="http://yapw.blogspot.com/2008/12/facebook-publica-su-versin-modificada.html">Facebook publicó su versión modificada de memcached</a>, después de haber <a href="http://barrapunto.com/article.pl?sid=08/06/03/0015205">publicado parte de su código</a>. También recordar que <a href="http://barrapunto.com/article.pl?sid=09/08/10/2017235">hace poco más de un mes que Facebook ha adquirido Friendfeed</a>.<br /><br /><a href="http://softlibre.barrapunto.com/article.pl?sid=09/09/11/2157220">Más comentarios en <em>Facebook publica Tornado, servidor web usado en FriendFeed</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-3169905149988478112009-07-27T23:31:00.002+02:002009-07-27T23:35:07.672+02:00Enlaces varios (VI)Hace muchos días que no he podido escribir por aquí, así que quizás a alguien le pueda parecer interesante el <em>dump</em> de cosas que tenía <a href="http://www.google.com/reader/shared/08374875025225505515">semi-guardadas</a>:<br /><ul><li>Sobre el lío de la eliminación de los conceptos en el borrador C++0x y su retraso en general: <ul><li><a href="http://herbsutter.wordpress.com/2009/07/21/trip-report/">'Trip Report: Exit Concepts, Final ISO C++ Draft in ~18 Months' de Herb Sutter</a></li><li><a href="http://www.ddj.com/architect/218600111">'The C++0x "Remove Concepts" Decision' de Bjarne Stroustrup</a></li><li>También en <a href="http://tech.slashdot.org/story/09/07/23/1817225/Stroustrup-Says-New-C-Standard-Delayed-Until-2010-Or-Later">Slashdot</a> y <a href="http://www.reddit.com/r/programming/comments/92tnd/concepts_removed_from_c0x/">reddit</a></ul><li><a href="http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html">Smaller is Faster (and Safer Too)</a>. De cómo chromium se auto-parchea con diferencias binarias.</li><li><a href="http://rss.slashdot.org/~r/Slashdot/slashdotDevelopers/to/~3/5GHlbSt87cU/Tech-Or-Management-Beyond-Age-39">Tech Or Management Beyond Age 39?</a></li><li>Dos sobre concurrencia y excepciones: <a href="http://herbsutter.wordpress.com/2009/06/23/answering-email-about-error-handling-in-concurrent-code/">'Answering email about error handling in concurrent code' de Herb Sutter</a> y <a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,652962f1-5073-49a4-b233-9ca24b494742.aspx">'Concurrency and exceptions' de Joe Duffy</a></li></ul><br /><a href="http://barrapunto.com/~mig21/journal/32802">La misma noticia y más comentarios en <em>Enlaces varios (VI)</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-24065456808581339392009-06-25T23:25:00.006+02:002009-06-26T09:18:41.932+02:00MinGW publica GCC 4.4.0El equipo de <a href="http://www.mingw.org/">MinGW</a> ha publicado <a href="http://sourceforge.net/project/shownotes.php?release_id=691876">los binarios de GCC 4.4.0 para Windows</a>. De entre las novedades destacan un mejor tratamiento de excepciones, una versión de libstdc++ en forma de librería compartida, y soporte para <a href="http://en.wikipedia.org/wiki/Thread-local_storage">TLS (thread-local storage)</a>, además de todas las novedades de <a href="http://gcc.gnu.org/gcc-4.4/">la versión 4.4.0</a>. Hay que recordar que la anterior versión soportada oficialmente era GCC 3.4.5. Más en <a href="http://www.reddit.com/r/programming/comments/8v5dz/mingw_updates_to_gcc_440/">reddit</a>.<br /><br />El manejo de las excepciones ha mejorado drásticamente debido a que se ha usado una implementación basada en <a href="http://en.wikipedia.org/wiki/DWARF">DWARF</a>, dejando de lado el viejo modelo <a href="http://en.wikipedia.org/wiki/Setjmp.h">SJLJ</a>, que ya no estará disponible. Además con esta versión las excepciones ya pueden atravesar las fronteras de las DLL sin problemas.<br /><br /><a href="http://barrapunto.com/article.pl?sid=09/06/25/2121226">La misma noticia y más comentarios en <em>MinGW publica GCC 4.4.0</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-19095602378867031822009-05-26T22:40:00.003+02:002009-05-26T23:51:23.511+02:00memcpy y la concurrenciaSi el otro día comentaban en barrapunto que <a href="http://barrapunto.com/article.pl?sid=09/05/15/2146205">en MS marcaban como peligroso el uso de <tt>memcpy</tt></a> hoy podemos encontrar otra razón para usarlo con precaución. En <a href="http://blogs.sun.com/dave/entry/memcpy_concurrency_curiosities">memcpy() concurrency curiosities</a> 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 <a href="http://yapw.blogspot.com/2008/05/demasiadas-capas-de-abstraccin.html">las abstracciones que usamos evolucionan a su manera</a>, 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 <a href="http://www.reddit.com/r/programming/comments/8n8we/memcpy_concurrency_curiosities/">reddit</a><br /><br /><a href="http://barrapunto.com/~mig21/journal/32465">La misma entrada y más comentarios en <em>memcpy y la concurrencia</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-38463532034611990182009-05-05T19:48:00.002+02:002009-05-05T21:48:14.392+02:00Avances en las implementaciones de C++0xPor lo que he leído hace un tiempo y ahora puedo comentar aquí, tanto gcc como VC++ se están <em>poniendo las pilas</em> en la implementación de <a href="http://en.wikipedia.org/wiki/C++0x">C++0x</a>.<br /><ul><li>Vía <a href="http://icewinddale.blogspot.com/2009/04/qt-451-y-gcc-44.html">Drizzt, Qt 4.5.1 y gcc 4.4</a> leo que <a href="http://gcc.gnu.org/gcc-4.4/changes.html">entre las más notables novedades de gcc4.4 se incluyen muchas características del C++0x</a>, entre las cuales están declaraciones con <tt>auto</tt> 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 <a href="http://gcc.gnu.org/gcc-4.4/cxx0x_status.html">c++0x en gcc 4.4</a> 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...</li><li>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 <a href="http://blogs.msdn.com/vcblog/archive/2009/04/22/decltype-c-0x-features-in-vc10-part-3.aspx"> el blog oficial de <em>VisualC</em> hablan de decltype (C++0x Features in VC10, Part 3)</a> repasando <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf">esa característica de C++0x</a> que por cierto ya está implementada también en gcc. Además apuntan a las dos entradas anteriores, que también resultan instructivas <a href="http://blogs.msdn.com/vcblog/archive/2008/10/28/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx">Lambdas, auto, and static_assert: C++0x Features in VC10, Part 1</a> y <a href="http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx">Rvalue References: C++0x Features in VC10, Part 2</a></li></ul><br />Y ya que estamos en el tema dos enlaces de propina: <a href="http://www.justsoftwaresolutions.co.uk/files/designing_mt_programs.pdf">Designing Multithreaded Programs in C++0x de Anthony Williams</a> y <a href="http://blog.cplusplus-soup.com/2009/03/gcc-c0x-features-exploration.html">GCC C++0x Features Exploration en C++ Soup!</a> y por supuesto la imprescindible wikipedia que tiene un estupendo punto de entrada: <a href="http://en.wikipedia.org/wiki/C++0x">C++0x</a><br /><br /><a href="http://barrapunto.com/~mig21/journal/32316">La misma entrada y más comentarios en <em>Avances en las implementaciones de C++0x</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-56545733979012750102009-04-20T23:04:00.006+02:002009-04-21T09:56:20.379+02:00Bitácoras de Programación: selección personalLlego tarde a la discusión generada con <a href="http://barrapunto.com/~leonidas/journal/32205"> la entrada en la bitácora de leonidas en barrapunto</a> que <a href="http://preguntas.barrapunto.com/article.pl?sid=09/04/17/121245">rvr pasó a portada</a> acerca de blogs y feeds en general relacionados con la programación. Salen por supuesto muchos de los agregadores y planetas que consumo, como <a href="http://www.reddit.com/r/programming/">reddit</a>, <a href="http://news.ycombinator.com/news">hacker news</a> (uhmm, éste no sale), <a href="http://www.dzone.com">dzone</a> o <a href="http://www.planetacodigo.com/">planeta código</a>. 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 <em>el bloguerío</em> con un alto nivel técnico que dejan ver el sus posts. Allá van:<br /><ul><li><a href="http://mbpfernand0.wordpress.com/">Mbpfernand0's Blog</a>, el nuevo blog técnico de "nuestro" <a href="http://barrapunto.com/~fernand0/">fernand0</a>. El tema fundamental es la programación y la seguridad, aunque creo que no hace ningún asco a temas relacionados. Por cierto, que <a href="http://mbpfernand0.wordpress.com/2009/04/20/bitacoras-interesantes-de-programacion-i/">promete su propia selección de blogs sobre programación</a>. Habrá que estar atento.</li><li><a href="http://icewinddale.blogspot.com/">El valle del Viento Helado de Drizzt</a>, el <a href="http://barrapunto.com/~Drizzt/journal/">Drizzt de barrapunto</a> también. Sistemas operativos, compiladores, administración y seguridad. Muy interesante.</li><li><a href="http://geeks.ms/blogs/rfog/default.aspx">.NET o no .NET, esa es la cuestión</a>. 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.</li></ul><br />En inglés:<br /><ul><li><a href="http://intertwingly.net/blog/">intertwingly de Sam Ruby</a>. La web y sus estándares. Para mí, imprescindible.</li><li><a href="http://jeffr-tech.livejournal.com/">jeffr_tech's Journal</a>. Detalles internos del desarrollo de FreeBSD. No actualiza mucho pero merece la pena estar suscrito.</li><li><a href="http://daniel.haxx.se/blog/">daniel.haxx.se de Daniel Stenberg</a>. Del autor de <a href="http://curl.haxx.se/">curl</a> y <a href="http://www.rockbox.org/">Rockbox</a> <a href="http://daniel.haxx.se/projects/">entre otros</a>, el blog de un desarrollador prolífico.</li><li><a href="http://codingrelic.geekhold.com/">Coding Relic de Denton Gentry</a>. Normalmente sobre Software embebido, pero toca otros palos.</li><li><a href="http://udrepper.livejournal.com/">Ulrich Drepper</a>. El blog del mantenedor de la glib. Poco prolífico, pero para no perderse ni una sola entrada.</li><li><a href="http://www.nynaeve.net/">Nynaeve: Adventures in Windows debugging and reverse engineering.</a> No se me ocurriría un mejor título nunca</li><li>Y por fin el imprescindible <a href="http://herbsutter.wordpress.com/">Sutter’s Mill: Herb Sutter on software, hardware, and concurrency</a></li></ul><br /><br />Ahora no se me ocurre ninguno más, pero pueden ser las prisas...<br /><br /><strong>Actualización:</strong> He publicado este texto más o menos <a href="http://barrapunto.com/comments.pl?sid=80704&cid=1140371">en un comentario</a> por aquello de completar la información en su sitio. También lo pongo aquí y lo replicaré <a href="http://barrapunto.com/~mig21/journal/32224">en mi bitácora en barrapunto</a>, que a su vez se copiará en <a href="http://planetacodigo.com/">planeta código</a>, <a href="http://fernand0.blogalia.com/historias/62592">por aquello de que lo que se replica queda y de que hay URLs que desaparecen</a>...mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com6tag:blogger.com,1999:blog-11818694.post-76848427188890240432009-03-17T22:42:00.003+01:002009-03-17T23:47:50.888+01:00Erlang 5.7/OTP R13A: soporte para Unicode, mejoras en multicore y SSLAcaba de salir la nueva versión del conjunto <a href="http://erlang.org/">Erlang/OTP</a>, en concreto la versión <a href="http://www.erlang.org/doc/highlights.html">Erlang 5.7/OTP R13A</a>. 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 <a href="http://es.wikipedia.org/wiki/Unicode">Unicode</a>, posibilidad de usar <a href="http://www.wxwidgets.org/">WxWidgets</a> a través del WxErlang (de momento en beta) y reescritura del soporte para <a href="http://es.wikipedia.org/wiki/Transport_Layer_Security">SSL</a>. 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 <a href="http://www.reddit.com/r/programming/comments/85djx/erlangotp_r13a_released_unicode_multicore_and_ssl/">reddit</a> y <a href="http://news.ycombinator.com/item?id=520061">Hacker News</a><br /><br /><a href="http://barrapunto.com/%7Emig21/journal/32026">La misma entrada y más comentarios en <em>Erlang 5.7/OTP R13A: soporte para Unicode, mejoras en multicore y SSL</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-39595679825153428722009-03-11T23:44:00.008+01:002009-03-12T00:06:42.411+01:00Aprendiendo de los errores (II)<a href="http://barrapunto.com/article.pl?sid=09/03/05/0653213">Dan J. Berstein reconoció una vulnerabilidad en djbdns y la recompensó con mil dólares</a> 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.<br /><br />Entonces leo con interés, vía <a href="http://mbpfernand0.wordpress.com/2009/03/10/%c2%bfexisten-programas-sin-fallos-de-seguridad/">el nuevo <em>subarrapunto</em> de fernand0</a>, un <a href="http://www.hispasec.com/unaaldia/3785">comentario en hispasec que no por evidente debe dejar de repetirse</a>: 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.<br /><br />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 <a href="http://yapw.blogspot.com/2009/02/epigramas-sobre-programacion.html">Alan J. Perlis <em>A la larga cualquier programa se vuelve rococó. Después escombros.</em></a> Lo de siempre, funcionalidad contra robustez y simplicidad :)<br /><br />De todos modos el caso de djbdns es también interesante por el tipo de fallo encontrado. En <a href="http://news.ycombinator.com/item?id=502651">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</a>. Y precisamente <a href="http://cr.yp.to/djbdns/notes.html">Bernstein había hablado negativamente del método de compresión</a> (descrito, claro, en el <a href="http://www.ietf.org/rfc/rfc1035.txt">RFC 1035, 4.1.4, página 30</a>) Extractando de la crítica de Bernstein:<blockquote> <br />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.<br /><br />Otro problema con la compresión DNS es la cantidad de código necesario para generarlo correctamente. [...] <br /><br />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 [...]<em>(Y aquí habla de incompatibilidades de algunas versiones de BIND con el RFC)</em></blockquote>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 <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">Síndrome NIH</a>, de <em>hackerismo</em> o tenía algo que ver con las <a href="http://en.wikipedia.org/wiki/LZW#Patents_and_accreditation">patentes sobre estos tipos de compresión que llevaban haciéndose desde 1984</a> como la del <a href="http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=4464650.PN.&OS=PN/4464650&RS=PN/4464650">LZ78</a>. 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...<br /><br />Creo que la moraleja es clara, como se dice a veces exagerando <a href="http://yapw.blogspot.com/2007/06/el-mejor-cdigo-es-el-que-no-existe.html">el mejor código es el que no existe</a> sobre todo desde el punto de vista de la reducción de bugs y aún más si se trata de seguridad.<br /><br />(Esto se llama <em>Aprendiendo de los errores (II)</em> porque ya escribí en su día <a href="http://yapw.blogspot.com/2008/07/bugs-antiguos-y-moralejas.html">Bugs antiguos y moralejas </a>, 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)<br /><br /><br /><a href="http://barrapunto.com/~mig21/journal/31994">La misma entrada y más comentarios en <em>Aprendiendo de los errores (II)</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-67781704961516413392009-02-26T20:24:00.007+01:002009-02-27T11:12:33.513+01:00Lo que Paul Graham ha aprendido con Hacker News<a href="http://news.ycombinator.com/news">Hacker news</a> es un sitio de envío y comentario de noticias muy al modo de <a href="http://www.reddit.com/">reddit</a> (o <a href="http://digg.com/">digg</a> o <a href="http://meneame.net/">menéame</a>), pero con temática muy definida (temática técnica, <a href="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)">hacker en el sentido MIT</a> ), con editores estrictos y con políticas severas de <em>ontopic</em>. Pues Paul Graham, su creador ha escrito <a href="http://www.paulgraham.com/hackernews.html">What I've Learned from Hacker News</a>, 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:<br /><br /><blockquote>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:<blockquote>La clave del rendimiento es la elegancia, no un batallón de casos especiales.</blockquote><br />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.</blockquote><br /><br /><blockquote>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.</blockquote><br /><br /><blockquote>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 <em>slogan</em> como título cuesta cero, porque la gente lo vota sin ni siquiera visitar el enlace.</blockquote><br /><br /><blockquote>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.</blockquote><br /><br /><blockquote>[...]Visitar un foro <em>online</em> sólo cuesta un clic y se parece mucho superficialmente a trabajar. Puedes estar gastando tu tiempo, pero no estás parado. <a href="http://xkcd.com/386/">Alguien esta equivocado en Internet</a>, y tú estás arreglando el problema.</blockquote><br /><br /><blockquote>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.<br /><br />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 <em>agregar a favoritos</em> (Aún se pueden ver los fósiles de sus orígenes en sus diseños gráficos.)</blockquote><br /><br /><blockquote>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.<br /><br />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.</blockquote>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 :)<br /><br /><a href="http://barrapunto.com/~mig21/journal/31900">La misma entrada y más comentarios en <em>Lo que Paul Graham ha aprendido con Hacker News</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-60761832507430522592009-02-17T13:01:00.003+01:002009-02-17T22:31:22.153+01:00¿Varios pájaros de un tiro?Vía <a href="http://intertwingly.net/blog/2009/02/14/RDFa-in-HTML5">intertwingly, el blog de Sam Ruby</a>, me encuentro con una <a href="http://lists.w3.org/Archives/Public/public-rdf-in-xhtml-tf/2009Feb/0070.html">cita extraída de una de las listas del W3C</a> que traduzco sin más:<br /><blockquote>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.</blockquote><br />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.<br /><br />Me ha recordado además a un <a href="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SingleResponsibilityPrinciple2_5F00_71060858.jpg">"cartel motivador"</a> sobre el <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">principio de responsabilidad única</a> que vi hace poco en <a href="http://www.reddit.com/r/programming/comments/7ws12/motivational_posters_for_programmers/">reddit</a> (<a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx">Aquí se pueden ver todos los carteles</a>, por si a alguien le son de utilidad <a href="http://xkcd.com/541/">:)</a><br /><br />Ah, ya que estoy aquí, recomiendo la lectura del blog de Sam y de las listas relativas al <a href="http://en.wikipedia.org/wiki/HTML_5">HTML5</a> para ver <em>flames</em> de altura :)<br /><br /><br /><strong>Actualización <a href="http://fernand0.blogalia.com/historias/3033">egórica</a>:</strong> 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. <a href="http://intertwingly.net/blog/2009/02/14/RDFa-in-HTML5#c1234898405">Y me ha enlazado en un comentario</a>. Nunca lo hubiera pensado :)<br /><br /><a href="http://barrapunto.com/~mig21/journal/31824">La misma entrada y más comentarios en <em>¿Varios pájaros de un tiro?</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com3tag:blogger.com,1999:blog-11818694.post-90977891411171377532009-02-05T23:02:00.004+01:002009-02-06T09:08:09.542+01:00Epigramas sobre programaciónSiguiendo un enlace en <a href="http://www.technovelty.org/code/complexity.html"> technovelty</a> he llegado a <a href="http://www-pu.informatik.uni-tuebingen.de/users/klaeren/epigrams.html">un artículo de Alan J. Perlis</a> en el que a través de ciento treinta <a href="http://es.wikipedia.org/wiki/Epigrama">epigramas</a> 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:<br /><blockquote><br /><strong>Epigramas:</strong><br /><br />7. Es más fácil escribir un programa incorrecto que entender uno correcto.<br /><br />8. Un lenguaje de programación es de bajo nivel cuando sus programas requieren atención sobre lo irrelevante.<br /><br />9. Es mejor tener 100 funciones operando sobre una estructura de datos que 10 funciones sobre 10 estructuras de datos.<br /><br />14. A la larga cualquier programa se vuelve rococó. Después escombros.<br /><br />15. Todo debería desarrollarse <a href="http://es.wikipedia.org/wiki/Top-down_y_Bottom-up">de arriba a abajo</a>, excepto la primera vez.<br /><br />17. Si alguien parece que está asintiendo cuando le explicas tu programa, despiértale.<br /><br />19. Si un lenguaje no cambia el modo en el que ves la programación es que no merece la pena.<br /><br />21. La optimización dificulta la evolución.<br /><br />31. La simplicidad no precede a la complejidad, la sigue.<br /><br />40. Hay dos modos de escribir programas sin errores. Sólo la tercera funciona.<br /><br />57. Es más fácil cambiar la especificación para que se ajuste al programa que al contrario.<br /><br />58. Los locos ignoran la complejidad. Los pragmáticos la sufren. Algunos pueden evitarla. Los genios la eliminan.<br /><br />63. En computación, los invariantes son efímeros.<br /><br />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 <em>arimetizar</em>.<br /><br />75. Debido a su vitalidad la informática está a la busca desesperada de nuevos clichés: la banalidad calma nuestros nervios.<br /><br />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.<br /><br />95. No tengas buenas ideas si no eres capaz de responsabilizarte de ellas.<br /><br />104. La prueba del valor de un sistema es su existencia.<br /><br />115. Mucha gente encuentra el concepto de programar obvio, pero hacerlo les resulta imposible.<br /><br /><strong>MetaEpigramas:</strong><br /><br />124. Los epigramas son macros, porque son ejecutados en tiempo de lectura.<br /><br />125. Los epigramas cristalizan incongruencias.<br /><br />127. Los epigramas desdeñan los detalles y lo hacen con intención: son una documentación de alto nivel excelente.<br /></blockquote>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 :)<br /><br /><br /><a href="http://barrapunto.com/~mig21/journal/31729">La misma entrada y más comentarios en <em>Epigramas sobre programación</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-22680998806304300952009-02-04T10:14:00.002+01:002009-02-04T10:18:11.426+01:005 Secrets To Ninja Writing<a href="http://blog.wekeroad.com/blog/nothing-to-say/">5 Secrets To Ninja Writing</a>. (<a href="http://www.reddit.com/r/programming/comments/7un0f/5_secrets_to_ninja_writing_a_satire_of/">Vía reddit</a>)<br /><br />Es mucho más recomendable pinchar en el enlace anterior si conoces <a href="http://www.codinghorror.com/blog/">el blog de Jeff Atwood, Coding Horror</a>. <br /><br />Está muy logrado, sobre todo la parodia del abuso de la autorreferencia, un vicio muy de <em>blogstar</em>, muy feo :)<br /><br /><a href="http://barrapunto.com/~mig21/journal/31710">La misma entrada y más comentarios en <em>5 Secrets To Ninja Writing</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0tag:blogger.com,1999:blog-11818694.post-20647993494353584262009-01-28T22:47:00.003+01:002009-01-29T10:52:35.351+01:00El sistema de plugins cada vez más cerca de GCCHace bastante tiempo que se viene discutiendo el porqué <a href="http://lwn.net/Articles/301135/">de la falta de sistema de plugins en el compilador libre por excelencia, GCC</a>. Al parecer el principal problema era <i>legal</i>, es decir, el miedo fomentar la proliferación de <i>plugins</i> propietarios. Pues bien, ya se ha establecido el marco de licencias que pueden regir ese sistema, que es <a href="http://gcc.gnu.org/ml/gcc-announce/2009/msg00000.html">la nueva versión de la GCC Runtime Library Exception</a> 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 <a href="http://gplv3.fsf.org/">GPLv3</a> de algunas librerías del propio GCC. <a href="http://www.gnu.org/licenses/gcc-exception-faq.html">La FSF ha proporcionado un documento con las razones para esta licencia y las preguntas más frecuentes sobre ella</a>. Más comentarios en <a href="http://slashdot.org/article.pl?sid=09/01/27/223230">Slashdot: Plug-In Architecture On the Way For GCC</a>.<br /><br /><strong>Actualización:</strong> <a href="http://icewinddale.blogspot.com/">Drizzt</a> se ha puesto de acuerdo, otra vez casualmente, para hablar del mismo tema, con algunos comentarios sobre el cambio de la licencia: <a href="http://icewinddale.blogspot.com/2009/01/la-arquitectura-de-plugins-del-gcc-y.html">El valle del Viento Helado: La arquitectura de plugins del GCC y las licencias</a>.<br /><br /><a href="http://barrapunto.com/~mig21/journal/31658">La misma entrada y más comentarios en <em>El sistema de plugins cada vez más cerca de GCC</em> en barrapunto</a>mig21http://www.blogger.com/profile/11084202300080200239noreply@blogger.com0