<?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-8774163155458391091</id><updated>2012-01-08T15:17:25.900+01:00</updated><category term='Reparación de PCs'/><category term='BeOS'/><category term='Música'/><category term='OS/2'/><category term='opensource'/><category term='Linux'/><category term='ooRexx'/><category term='malware'/><category term='eComStation'/><category term='Programación'/><category term='Seguridad'/><category term='Hardware'/><category term='REXX'/><category term='Ciencia-ficción'/><category term='Windows'/><category term='Ciencia'/><category term='Programas'/><category term='Cine'/><title type='text'>A una indecisión pegado</title><subtitle type='html'>Un blog acerca de REXX, OS/2, eComStation, software libre y otras cosas fundamentalmente inútiles en la vida real.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-5166543823933439034</id><published>2011-05-22T10:41:00.000+02:00</published><updated>2011-05-22T10:42:35.751+02:00</updated><title type='text'>Air and Rod</title><content type='html'>Tu pequeño padawan te echaba de menos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-5166543823933439034?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/5166543823933439034/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=5166543823933439034' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5166543823933439034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5166543823933439034'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2011/05/air-and-rod.html' title='Air and Rod'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2578624325329874885</id><published>2011-03-02T23:19:00.002+01:00</published><updated>2011-03-02T23:40:13.389+01:00</updated><title type='text'>Ilusiones</title><content type='html'>Me parece enormemente curiosa la manera en que la vida da giros inesperados y te sorprende con cosas que jamás hubieses esperado. Cosas que solamente unos meses atrás hubiesen parecido situaciones imposibles si en algún momento las hubiesen planteado.&lt;br /&gt;&lt;br /&gt;A mí, al menos, me parecían imposibles.&lt;br /&gt;&lt;br /&gt;Pero esos imposibles se han convertido en hechos y últimamente duermo mejor, me despierto con una sonrisa en la cara y hago aquellas cosas que hago con más ilusión y con más ganas.&lt;br /&gt;&lt;br /&gt;Y la responsable directa de todo eso es una persona, probablemente la única persona que lea esta entrada (espero que esbozando esa dulce sonrisa que tanto me gusta en su cara).&lt;br /&gt;&lt;br /&gt;Todo esto que está sucediendo me hace recordar esa hermosa obra maestra que es &lt;span style="font-style:italic;"&gt;Blankets&lt;/span&gt; de Craig Thompson cuando el autor dice: &lt;span style="font-style:italic;"&gt;Qué satisfacción produce dejar una marca en una superficie en blanco. El dibujar el mapa de mis movimientos... ...sin que importe que no sea para siempre&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;No importará si esto que sucede no es para siempre, porque mientras tanto el viaje está siendo maravilloso.&lt;br /&gt;&lt;br /&gt;Gracias, pequeña.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2578624325329874885?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2578624325329874885/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2578624325329874885' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2578624325329874885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2578624325329874885'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2011/03/ilusiones.html' title='Ilusiones'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-605286531539281541</id><published>2011-02-03T19:51:00.003+01:00</published><updated>2011-02-03T19:54:39.135+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='Programas'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>qtDbf 0.9.3 en eComStation</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FvqfZGxiSUk/TUr5u3DNVwI/AAAAAAAAACo/KvtwmTOPUek/s1600/qtDbf093-os2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 211px; height: 320px;" src="http://1.bp.blogspot.com/_FvqfZGxiSUk/TUr5u3DNVwI/AAAAAAAAACo/KvtwmTOPUek/s320/qtDbf093-os2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5569538472643745538" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora he compilado &lt;a href="http://qt-apps.org/content/show.php/qtDbf?content=137863"&gt;qtDbf 0.9.3&lt;/a&gt; en OS/2 y está disponible en &lt;a href="http://hobbes.nmsu.edu/download/pub/incoming/qtDbf093-os2.zip"&gt;Hobbes&lt;/a&gt;. Es la segunda aplicación QT4 que consigo compilar sin problemas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-605286531539281541?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/605286531539281541/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=605286531539281541' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/605286531539281541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/605286531539281541'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2011/02/qtdbf-093-en-ecomstation.html' title='qtDbf 0.9.3 en eComStation'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FvqfZGxiSUk/TUr5u3DNVwI/AAAAAAAAACo/KvtwmTOPUek/s72-c/qtDbf093-os2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-3267690878044992899</id><published>2011-02-03T19:06:00.005+01:00</published><updated>2011-02-03T19:55:29.438+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='Programas'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>ehm 0.2 en eComStation: una pequeña calculadora en QT4</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FvqfZGxiSUk/TUrv2xU7Z9I/AAAAAAAAACg/8Ul-xtKx6to/s1600/ehm02-os2-small.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://3.bp.blogspot.com/_FvqfZGxiSUk/TUrv2xU7Z9I/AAAAAAAAACg/8Ul-xtKx6to/s320/ehm02-os2-small.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5569527613430130642" /&gt;&lt;/a&gt;&lt;br /&gt;Mi primer "port" para OS/2 de una calculadora muy simple llamada &lt;a href="http://qt-apps.org/content/show.php?content=138137"&gt;ehm&lt;/a&gt; ya está en &lt;a href="http://hobbes.nmsu.edu/download/pub/incoming/ehm02-os2.zip"&gt;Hobbes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Compilarlo ha sido absolutamente trivial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-3267690878044992899?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/3267690878044992899/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=3267690878044992899' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/3267690878044992899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/3267690878044992899'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2011/02/ehm-02-una-pequena-calculadora-en-qt4.html' title='ehm 0.2 en eComStation: una pequeña calculadora en QT4'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FvqfZGxiSUk/TUrv2xU7Z9I/AAAAAAAAACg/8Ul-xtKx6to/s72-c/ehm02-os2-small.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-8297161793324095938</id><published>2011-01-31T13:09:00.004+01:00</published><updated>2011-02-12T13:03:53.436+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Música'/><category scheme='http://www.blogger.com/atom/ns#' term='Cine'/><title type='text'>Adiós, Barry</title><content type='html'>John Barry (3 de noviembre de 1933 - 30 de enero de 2011).&lt;br /&gt;&lt;iframe title="YouTube video player" class="youtube-player" type="text/html" width="400" height="333" src="http://www.youtube.com/embed/KHvKviaeulg?rel=0" frameborder="0" allowFullScreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" class="youtube-player" type="text/html" width="400" height="255" src="http://www.youtube.com/embed/gljHVCBY8kQ?rel=0" frameborder="0" allowFullScreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-8297161793324095938?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/8297161793324095938/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=8297161793324095938' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/8297161793324095938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/8297161793324095938'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2011/01/adios-barry.html' title='Adiós, Barry'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/KHvKviaeulg/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-5002133275215261651</id><published>2011-01-20T00:00:00.002+01:00</published><updated>2011-01-20T00:18:40.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programas'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Un instalador de gnuplot para Windows</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Esta entrada va dedicada a una amiga que no para de burlarse del abandono de mi blog (aunque también se quejará de lo técnica que es la entrada). Va por ti, pequeña.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Hace unos escasos minutos he terminado un instalador de gnuplot para Windows para mi amigo José Joaquín y se lo he mandado por correo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FvqfZGxiSUk/TTdxF4DWQMI/AAAAAAAAACU/P6LqSKmOmRg/s1600/instalador_gnuplot.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 249px;" src="http://3.bp.blogspot.com/_FvqfZGxiSUk/TTdxF4DWQMI/AAAAAAAAACU/P6LqSKmOmRg/s320/instalador_gnuplot.png" alt="" id="BLOGGER_PHOTO_ID_5564040210399248578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hacía bastante tiempo que no tocaba sistemas de creación de instaladores para Windows tales como Inno Setup, NSIS y MakeMSI. Últimamente había creado algún que otro paquete instalable WarpIN para OS/2 y algún que otro paquete deb para distribuciones Linux basadas en Debian y podría decir que había olvidado el barroquismo y la insuficiencia de la documentación de esas herramientas para Windows, pero mentiría.&lt;br /&gt;&lt;br /&gt;Y es que con la influencia recibida por OS/2 por un lado y por Linux por el otro, ciertos detalles de los instaladores de Windows le hacen a uno pensar que Windows está mal diseñado (tal vez algún día explique por qué tengo esa impresión, pero hoy no).&lt;br /&gt;&lt;br /&gt;A pesar de todo, ha sido estimulante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-5002133275215261651?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/5002133275215261651/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=5002133275215261651' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5002133275215261651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5002133275215261651'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2011/01/un-instalador-de-gnuplot-para-windows.html' title='Un instalador de gnuplot para Windows'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FvqfZGxiSUk/TTdxF4DWQMI/AAAAAAAAACU/P6LqSKmOmRg/s72-c/instalador_gnuplot.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-6192564896286974061</id><published>2010-05-31T19:01:00.003+02:00</published><updated>2010-05-31T19:12:17.904+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='Programas'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>newLISP 10.2.8 en eComStation</title><content type='html'>Estos días he conseguido compilar la última versión del intérprete newLISP (la 10.2.8) para OS/2. He subido a Hobbes el resultado, si bien sé que al menos tiene un fallo (el servidor web que incluye solamente funciona con páginas estáticas).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FvqfZGxiSUk/TAPtm7ne3II/AAAAAAAAABc/nA_-3jAFH_I/s1600/newlisp_os2.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://3.bp.blogspot.com/_FvqfZGxiSUk/TAPtm7ne3II/AAAAAAAAABc/nA_-3jAFH_I/s320/newlisp_os2.jpg" alt="" id="BLOGGER_PHOTO_ID_5477482824906759298" border="0" /&gt;&lt;/a&gt;Todo el mérito de mi compilación lo tiene Norman Deppenbroek. Me he limitado a ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;make -f makefile_os2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y a añadir un icono.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-6192564896286974061?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/6192564896286974061/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=6192564896286974061' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/6192564896286974061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/6192564896286974061'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/newlisp-1028-en-ecomstation.html' title='newLISP 10.2.8 en eComStation'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FvqfZGxiSUk/TAPtm7ne3II/AAAAAAAAABc/nA_-3jAFH_I/s72-c/newlisp_os2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2159265426054748380</id><published>2010-05-30T22:39:00.002+02:00</published><updated>2010-05-30T23:20:05.353+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>QT 4.6.2 en eComStation</title><content type='html'>No deja de resultarme sorprendente la vitalidad de un sistema operativo que lleva "muerto" desde hace diez años.&lt;br /&gt;&lt;br /&gt;Gracias a las donaciones de usuarios de este viejo sistema operativo, &lt;a href="http://www.netlabs.org/en/site/index.xml"&gt;netlabs&lt;/a&gt; ha conseguido pagar el trabajo de Dmitry A. Kuminov que ha terminado con una versión de &lt;a href="http://svn.netlabs.org/qt4"&gt;QT 4.6.2 para eComStation&lt;/a&gt;. Esto ha abierto la posibilidad de que docenas de aplicaciones basadas en la célebre librería gráfica de Nokia estén disponibles para el sistema operativo.&lt;br /&gt;&lt;br /&gt;El australiano Paul Smedley ha actualizado los &lt;span style="font-style: italic;"&gt;ports&lt;/span&gt; de &lt;a href="http://www.lyx.org/"&gt;LyX&lt;/a&gt; y &lt;a href="http://www.scribus.net/"&gt;Scribus&lt;/a&gt;; Silvan Scherrer ha actualizado los de &lt;a href="http://kdiff3.sourceforge.net/"&gt;KDiff3&lt;/a&gt;, &lt;a href="http://smplayer.sourceforge.net/"&gt;SMPlayer&lt;/a&gt;, &lt;a href="http://qbittorrent.sourceforge.net/"&gt;QBitTorrent&lt;/a&gt; y Blubbels; el coreano KO Myung-Hun ha actualizado su beta de &lt;a href="http://www.videolan.org/vlc/"&gt;VLC&lt;/a&gt;... E imagino que eventualmente el holandés Elbert Pol actualizará algunos de sus &lt;span style="font-style: italic;"&gt;ports&lt;/span&gt; como el editor &lt;a href="http://ste.sintegrial.com/"&gt;S.T.E&lt;/a&gt; (entre muchos otros) y el japonés que ha hecho el de &lt;a href="http://code.google.com/p/qwit/"&gt;Qwit&lt;/a&gt; también lo actualizará.&lt;br /&gt;&lt;br /&gt;Espero ver algunos programas más en eComStation funcionando en breve gracias a QT 4.6.2:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://code.google.com/p/yacreader/"&gt;YACReader&lt;/a&gt;: es un lector de cómics. Visualiza cómics en formatos CBR y CBZ.&lt;br /&gt;- &lt;a href="http://kid3.sourceforge.net/"&gt;Kid3&lt;/a&gt;: es un editor de etiquetas para ficheros de audio.&lt;br /&gt;- &lt;a href="http://code.google.com/p/arora/"&gt;Arora&lt;/a&gt;: es un navegador web basado en WebKit.&lt;br /&gt;&lt;br /&gt;Es cierto que yo mismo he sugerido como característica para nuevas  versiones de Lucide un nuevo plugin que permita abrir cómics en formato  digital. También es cierto que ya existen dos programas de edición de etiquetas en OS/2 basados en QT4. Y es muy cierto que hay versiones de Firefox y SeaMonkey para OS/2...&lt;br /&gt;&lt;br /&gt;...pero me gustan las alternativas.&lt;br /&gt;&lt;br /&gt;Aquellos usuarios de Windows, Linux, Mac OS X o cualquier otra plataforma que tenga su versión de QT deberían echarle un vistazo a todos estos programas. Son alternativas interesantes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2159265426054748380?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2159265426054748380/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2159265426054748380' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2159265426054748380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2159265426054748380'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/qt-462-en-ecomstation.html' title='QT 4.6.2 en eComStation'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-4641510737555049616</id><published>2010-05-25T00:00:00.000+02:00</published><updated>2010-05-25T00:19:28.271+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ciencia-ficción'/><title type='text'>NO SE ASUSTE: 25 de mayo</title><content type='html'>Feliz día...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FvqfZGxiSUk/S_r0qnhF9dI/AAAAAAAAABU/iEOk1IbWULU/s1600/Towel+day.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_FvqfZGxiSUk/S_r0qnhF9dI/AAAAAAAAABU/iEOk1IbWULU/s320/Towel+day.jpg" alt="" id="BLOGGER_PHOTO_ID_5474957310021727698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;...&lt;a href="http://es.wikipedia.org/wiki/Douglas_Adams#El_d.C3.ADa_de_la_toalla"&gt;de la toalla&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-4641510737555049616?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/4641510737555049616/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=4641510737555049616' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/4641510737555049616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/4641510737555049616'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/no-se-asuste-25-de-mayo.html' title='NO SE ASUSTE: 25 de mayo'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FvqfZGxiSUk/S_r0qnhF9dI/AAAAAAAAABU/iEOk1IbWULU/s72-c/Towel+day.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-209411010938686921</id><published>2010-05-24T18:03:00.000+02:00</published><updated>2010-05-24T18:26:46.411+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='Programas'/><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><title type='text'>muStringConverter 0.2.0</title><content type='html'>Acabo de subir a &lt;a href="http://hobbes.nmsu.edu/"&gt;Hobbes&lt;/a&gt; la nueva versión de la pequeña utilidad muStringConverter.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FvqfZGxiSUk/S_qkEMCFQOI/AAAAAAAAABM/gj2hv4Qqvjs/s1600/muStringConverter020.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://2.bp.blogspot.com/_FvqfZGxiSUk/S_qkEMCFQOI/AAAAAAAAABM/gj2hv4Qqvjs/s320/muStringConverter020.jpg" alt="" id="BLOGGER_PHOTO_ID_5474868688878649570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una de las cosas que añade es el menú que copia al portapapeles lo que se encuentra en cada uno de los campos (binario, decimal, hexadecimal, octal y ASCII) tal como puede verse en la captura de pantalla.&lt;br /&gt;&lt;br /&gt;Otra de las cosas es menos evidente: he añadido el control externo del programa a través de una tubería con nombre (&lt;span style="font-style: italic;"&gt;named pipe&lt;/span&gt; en inglés).&lt;br /&gt;&lt;br /&gt;Aquellos usuarios de OS/2 o eComStation están habituados a ellas (cuando menos a que se las mencione); numerosos programas las utilizan. El reproductor de audio &lt;a href="http://dink.org/z/"&gt;Z!&lt;/a&gt; permite controlar el reproductor a través de una de estas tuberías: pausar la reproducción, salir del programa, preguntar al programa la información sobre el fichero que está reproduciendo, añadir un fichero a la lista de reproducción... El editor de texto &lt;a href="http://hobbes.nmsu.edu/download/pub/os2/apps/editors/fed0231s.zip"&gt;Fed&lt;/a&gt; permite usar una tubería con nombre para cambiar la posición del cursor... El visualizador de documentos PDF &lt;a href="http://svn.netlabs.org/lucide"&gt;Lucide&lt;/a&gt; permite avanzar o retroceder páginas, pasar a modo de presentación y más cosas a través de una tubería con nombre...&lt;br /&gt;&lt;br /&gt;En el caso de muStringConverter si en la consola se teclea:&lt;br /&gt;&lt;pre&gt;echo *quit &gt; \PIPE\MUSTRINGCONVERTER&lt;br /&gt;&lt;/pre&gt;el programa se cierra.&lt;br /&gt;&lt;br /&gt;Desde un &lt;span style="font-style: italic;"&gt;script&lt;/span&gt; REXX podríamos hacer lo siguiente:&lt;br /&gt;&lt;pre&gt;/**/&lt;br /&gt;&lt;br /&gt;pipeName = '\PIPE\MUSTRINGCONVERTER'&lt;br /&gt;&lt;br /&gt;call lineout pipeName, '*putbin 1010'&lt;br /&gt;call lineout pipeName&lt;br /&gt;call SysSleep 0.1&lt;br /&gt;&lt;br /&gt;call charout pipeName, '*getdec'&lt;br /&gt;say 'Decimal: ' linein(pipeName)&lt;br /&gt;call charout pipeName&lt;br /&gt;call SysSleep 1&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/pre&gt;Este &lt;span style="font-style: italic;"&gt;script&lt;/span&gt; simplemente pone la cadena 1010 en el campo de entrada, la convierte como si fuese una cadena binaria y después extrae el valor decimal resultante.&lt;br /&gt;&lt;br /&gt;Para aquellos usuarios de Linux y sistemas UNIX acostumbrados a usar tuberías con nombre en sus sistemas operativos: efectivamente, las tuberías con nombre de OS/2 (y de Windows) funcionan de un modo diferente a las de Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-209411010938686921?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/209411010938686921/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=209411010938686921' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/209411010938686921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/209411010938686921'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/mustringconverter-020.html' title='muStringConverter 0.2.0'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FvqfZGxiSUk/S_qkEMCFQOI/AAAAAAAAABM/gj2hv4Qqvjs/s72-c/muStringConverter020.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2993208181235650614</id><published>2010-05-23T19:31:00.000+02:00</published><updated>2010-05-23T20:01:32.842+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ciencia'/><title type='text'>Adiós a Martin Gardner</title><content type='html'>Martin Gardner, columnista de las revistas &lt;span class="citation web"&gt;&lt;span style="font-style: italic;"&gt;Scientific American&lt;/span&gt;&lt;span class="printonly"&gt; y &lt;span style="font-style: italic;"&gt;Skeptical Inquirer&lt;/span&gt;, falleció ayer sábado a la edad de 95 años.&lt;br /&gt;&lt;br /&gt;Hace unas semanas pude ver la mal llamada &lt;span style="font-style: italic;"&gt;Alicia en el país de las maravillas&lt;/span&gt;&lt;/span&gt;&lt;span class="reference-accessdate"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;de Tim Burton. Eso me trajo a la memoria una nota anecdótica de &lt;span style="font-style: italic;"&gt;The League of Extraordinary Gentlemen&lt;/span&gt; (el segundo volumen) de Alan Moore y Kevin O'Neill respecto al personaje de Alicia tras los sucesos de &lt;span style="font-style: italic;"&gt;A través del espejo&lt;/span&gt;. A su vez eso me hizo recordar quién fue la primera persona que me &lt;span style="font-style: italic;"&gt;habló&lt;/span&gt; de la homoquiralidad biológica en la literatura: Martin Gardner en &lt;span style="font-style: italic;"&gt;El universo ambidiestro&lt;/span&gt;.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;(Acerca de este tema llevo tiempo queriendo añadir una entrada en el blog.)&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Desde entonces he retomado la lectura de algunos de los pasajes de la obra de Gardner (tanto de sus juegos matemáticos como de sus artículos contra las pseudociencias) a lo largo de estos días. Y tras enterarme hoy mismo de la noticia, como ocurre con cada autor que me enseña tanto y me hace disfrutar en el proceso, no puedo evitar sentirme apenado por su muerte.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Si no habeis leído nada de él, hoy es un buen día para hacerlo. Es lo yo que haré esta noche.&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2993208181235650614?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2993208181235650614/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2993208181235650614' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2993208181235650614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2993208181235650614'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/adios-martin-gardner.html' title='Adiós a Martin Gardner'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-1883152336098491788</id><published>2010-05-21T18:25:00.000+02:00</published><updated>2010-05-21T18:48:04.323+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><title type='text'>eComStation 2.0 ya está aquí</title><content type='html'>Al entrar hoy en &lt;a href="http://www.os2world.com"&gt;OS2 World.Com&lt;/a&gt; me he encontrado con el &lt;a href="http://www.ecomstation.com/images/ecs20/banner_650.jpg"&gt;&lt;span style="font-style: italic;"&gt;banner&lt;/span&gt;&lt;/a&gt; publicitario que anuncia la salida al mercado de la nueva versión de &lt;a href="http://www.ecomstation.com"&gt;eComStation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El &lt;span style="font-style: italic;"&gt;banner&lt;/span&gt; muestra a un hombre y a una mujer en blanco y negro sacados de los años cincuenta de los Estados Unidos dándose la noticia por teléfono: &lt;span style="font-style: italic;"&gt;Hey listen up! Version 2 is here!&lt;/span&gt; (¡Ey, escucha! ¡La versión 2 está aquí!). Se ven las dos versiones del mismo, la &lt;span style="font-style: italic;"&gt;Home and Student&lt;/span&gt; y la &lt;span style="font-style: italic;"&gt;Business Edition&lt;/span&gt;, el logotipo del sistema operativo y las palabras &lt;span style="font-style: italic;"&gt;secure, versatile, powerfull, reliable&lt;/span&gt; (seguro, versátil, poderoso y fiable).&lt;br /&gt;&lt;br /&gt;Confieso que he encontrado el anuncio tan encantadoramente pasado de moda e ingenuo que me ha hecho sonreír.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-1883152336098491788?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/1883152336098491788/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=1883152336098491788' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1883152336098491788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1883152336098491788'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/ecomstation-20-ya-esta-aqui.html' title='eComStation 2.0 ya está aquí'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-8462919659467829452</id><published>2010-05-15T12:58:00.000+02:00</published><updated>2010-05-15T18:21:23.086+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='Programas'/><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><title type='text'>muStringConverter</title><content type='html'>Hace un par de semanas subí a &lt;a href="http://hobbes.nmsu.edu/"&gt;Hobbes&lt;/a&gt; (el &lt;span style="font-style: italic;"&gt;repositorio&lt;/span&gt; de aplicaciones de OS/2 por excelencia) una pequeña aplicación que programé allá por el 2004: muStringConverter.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FvqfZGxiSUk/S-7JRhDGJvI/AAAAAAAAABE/oj6Ni9ZBfmY/s1600/muStringConverter.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 246px;" src="http://1.bp.blogspot.com/_FvqfZGxiSUk/S-7JRhDGJvI/AAAAAAAAABE/oj6Ni9ZBfmY/s320/muStringConverter.jpg" alt="" id="BLOGGER_PHOTO_ID_5471531900068046578" border="0" /&gt;&lt;/a&gt;&lt;p&gt;Creo que queda claro por la imagen que es un pequeño programa que se limita a convertir una cadena entre distintos &lt;span style="font-style: italic;"&gt;formatos&lt;/span&gt; (binario, decimal, hexadecimal, octal y ASCII). Creo recordar que la interfaz fue una imitación de un pequeño programa que me enseñó mi amigo Manolo Pavón por aquel entonces.&lt;/p&gt;&lt;p&gt;En su momento este programa me resultó útil como ayuda para el juego de deducir el funcionamiento del formato MSG. Los ficheros MSG en OS/2 se utilizan como ficheros de mensajes de aplicaciones y son de tipo binario. A golpe de editor hexadecimal y con esta pequeña utilidad, conseguí crear un pequeño &lt;span style="font-style: italic;"&gt;decompilador&lt;/span&gt; de ficheros MSG escrito en REXX.&lt;/p&gt;&lt;p&gt;Probablemente el hecho de que las cadenas resultantes de la conversión estén en campos de entrada no editables sea un fallo de diseño, pero lo escogí así para que el usuario pueda moverse entre los campos de entrada fácilmente con el teclado.&lt;/p&gt;&lt;p&gt;Tengo una nueva versión lista que añade unos atajos de teclado para copiar los campos de entrada directamente al portapapeles y que además puede controlarse desde una tubería con nombre.&lt;/p&gt;&lt;p&gt;La versión en &lt;a href="http://hobbes.nmsu.edu/"&gt;Hobbes&lt;/a&gt; puede encontrarse &lt;a href="http://hobbes.nmsu.edu/h-search.php?key=mustringconverter&amp;amp;pushbutton=Search"&gt;aquí&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/8774163155458391091-8462919659467829452?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/8462919659467829452/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=8462919659467829452' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/8462919659467829452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/8462919659467829452'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2010/05/mustringconverter.html' title='muStringConverter'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FvqfZGxiSUk/S-7JRhDGJvI/AAAAAAAAABE/oj6Ni9ZBfmY/s72-c/muStringConverter.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-1910972583301277323</id><published>2007-09-16T23:16:00.000+02:00</published><updated>2007-09-16T23:21:28.090+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>GBM 1.52 o de la timidez de SSI</title><content type='html'>Heiko Nitzsche ha actualizado su versión mejorada de &lt;a href="http://heikon.home.tlink.de/"&gt;GBM&lt;/a&gt; (Generalised Bitmap Module) una librería y una serie de utilidades para trabajar con diversos formatos de imagen de mapa de bits (como los formatos JPEG, GIF o PNG). La última versión anterior al trabajo de Nitzsche de la dll (GBM.DLL) forma parte de eComStation 1.2; el procedimiento multimedia para ver ficheros JPEG (un reemplazo del original hecho por IBM, programado por Chris Wolgemuth) depende de esa biblioteca.&lt;br /&gt;&lt;br /&gt;El trabajo de Nitzsche no es moco de pavo: ha añadido nuevos formatos y mejorado el soporte de los formatos ya existentes, ha actualizado los visualizadores de imagen, ha añadido un &lt;i&gt;plugin&lt;/i&gt; para Firefox (y familia) y otro para Lucide, así como un API que permite previsualizar las imágenes en los diálogos de apertura de ficheros y una extensión que permite acceder a todas estas funcionalidades desde REXX y además todo esto lo hace utilizando compiladores modernos (OpenWatcom 1.7).&lt;br /&gt;&lt;br /&gt;De hecho, el conjunto de procedimientos multimedia parte de eSchemes Deluxe denominado &lt;i&gt;Imagination&lt;/i&gt; que añade nuevos formatos de imagen al sistema multimedia de OS/2 está basado en el trabajo de Nitzsche.&lt;br /&gt;&lt;br /&gt;Y ahora pasamos a Serenity Systems International, los responsables de eComStation y los listados de características de las betas de la próxima versión de su distribución de OS/2 (eComStation 2.0): en ningún lugar se habla de la inclusión de la versión de GBM mejorada por Nitzsche.&lt;br /&gt;&lt;br /&gt;Y eso me hace preguntarme por qué SSI realiza tan timidamente muchas modificaciones al sistema operativo (las referentes a ACPI, controladores de tarjetas de red y demás controladores podría decirse que son por necesidad). Hay docenas de programas que podrían ser incluidos y GBM es solamente un ejemplo: programas de grabación de CDs y DVDs (Audio/Data-CD-Creator, dvddao, cdrtools, All2Iso), clientes para compartir archivos (ctorrent -del que parece existir un &lt;i&gt;front-end&lt;/i&gt;-), clientes de correo (está incluido Thunderbird, pero RexxMail ¡es tan WPS...!), gestores de descargas (las últimas versiones de wget y el maravilloso Auto WGet Daemon), utilidades varias (la utilidad para el portapapeles ClipView), extensiones REXX (rxu, por mencionar el ejemplo más notable)...&lt;br /&gt;&lt;br /&gt;Además, uno supone que no debería ser difícil para SSI sustituir el visor de imágenes incluido en OS/2 por algo más moderno (al estilo del de Windows XP), hacer un conversor de formatos de imagen, un editor de imágenes (al estilo del MS Paint) e incluir un capturador de imágenes sencillo (Gotcha es un punto de partida para hacer uno bien integrado con el sistema, el visor de GBM incluye otro capturador)... por mencionar solamente uno de los tipos de datos que puede manejar un sistema operativo.&lt;br /&gt;&lt;br /&gt;¿Por qué no lo hacen? ¿Miedo a que el sistema pierda estabilidad? ¿Falta de recursos económicos y humanos (invertidos en el corazón del sistema, que es esencial para que todo lo demás funcione)? ¿Implicaciones legales? ¿Falta de ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-1910972583301277323?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/1910972583301277323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=1910972583301277323' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1910972583301277323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1910972583301277323'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/gbm-152-o-de-la-timidez-de-ssi.html' title='GBM 1.52 o de la timidez de SSI'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-7786474091257495671</id><published>2007-09-15T22:21:00.000+02:00</published><updated>2007-09-15T22:38:43.784+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='BeOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Como averiguar si un script está en una consola</title><content type='html'>En un mundo en el que las interfaces gráficas de usuario en general y los entornos de escritorio son algo omnipresente no deja de resultar muy curioso el hecho de que cada sistema operativo ha optado por métodos muy diferentes a la hora de ejecutar sus &lt;i&gt;scripts&lt;/i&gt; diseñados para la consola desde el entorno de escritorio. Es decir, cuando hacemos doble &lt;i&gt;click&lt;/i&gt; sobre el icono correspondiente al &lt;i&gt;script&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Windows y OS/2, por ejemplo, abren una consola cada vez que se ejecuta un fichero bat o cmd (en el caso de OS/2, los ficheros cmd pueden ser programas escritos en REXX o incluso pueden ser programas escritos en Python o Perl no simples ficheros de proceso por lotes). Windows no ofrece muchas facilidades para ocultar la ventana de la consola. OS/2 ofrece bastantes alternativas para ocultarlo si es necesario y modos de ejecutar pequeños diálogos gráficos cuando la consola está oculta.&lt;br /&gt;&lt;br /&gt;BeOS nunca abre una consola cuando se ejecuta un script. Tradicionalmente en BeOS todo aquel &lt;i&gt;script&lt;/i&gt; que estuviese pensado para el escritorio utilizaba el comando &lt;code&gt;alert&lt;/code&gt; de BeOS que permitía mostrar al usuario pequeños diálogos con sus correspondientes mensajes y botones.&lt;br /&gt;&lt;br /&gt;Con los entornos de escritorio usuales en Linux (Gnome y KDE, aunque haya docenas más con muy buenas ideas, por cierto) lo habitual es que el comportamiento fuese el mismo que en BeOS. Actualmente lo usual en Gnome (por ejemplo) es que cuando un usuario hace doble &lt;i&gt;click&lt;/i&gt; sobre un &lt;i&gt;script&lt;/i&gt; aparezca un diálogo que le pide confirmar si quiere ejecutarlo, ejecutarlo abriendo una terminal, editarlo o cancelar la apertura.&lt;br /&gt;&lt;br /&gt;Ocasionalmente puede ser interesante que un &lt;i&gt;script&lt;/i&gt; averigüe si se está ejecutando en una consola o no y para ello el comando &lt;code&gt;tty&lt;/code&gt; nos puede servir muy bien puesto que la salida de ese comando nos indica el número de terminal en el primer caso o nos dice "not a tty" en caso contrario. Así podemos hacer de forma sencilla lo siguiente:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  #!/bin/bash&lt;br /&gt;&lt;br /&gt;  if [ "$(tty)" = "not a tty" ]; then&lt;br /&gt;    echo "No es una terminal"&lt;br /&gt;  else&lt;br /&gt;    echo "Sí es una terminal"&lt;br /&gt;  fi&lt;br /&gt;&lt;br /&gt;  exit 0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Lo que en REXX quedaría como:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  /*bin/true;exec rexx "$0" "$@";exit # REXX */&lt;br /&gt;&lt;br /&gt;  'tty | rxqueue'&lt;br /&gt;  parse pull tty&lt;br /&gt;&lt;br /&gt;  if tty = 'not a tty' then&lt;br /&gt;    say 'No es una terminal'&lt;br /&gt;  else&lt;br /&gt;    say 'Sí es una terminal'&lt;br /&gt;&lt;br /&gt;  exit 0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;El código de retorno del comando nos da la misma información:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  #!/bin/bash&lt;br /&gt;&lt;br /&gt;  tty=$(tty)&lt;br /&gt;&lt;br /&gt;  if [ $? = 1 ]; then&lt;br /&gt;    echo "No es una terminal"&lt;br /&gt;  else&lt;br /&gt;    echo "Sí es una terminal" # $? es igual a 0&lt;br /&gt;  fi&lt;br /&gt;&lt;br /&gt;  exit 0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En REXX:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  /*bin/true;exec rexx "$0" "$@";exit # REXX */&lt;br /&gt;&lt;br /&gt;  'tty &gt; /dev/null'&lt;br /&gt;&lt;br /&gt;  if rc = 1 then&lt;br /&gt;    say 'No es una terminal'&lt;br /&gt;  else&lt;br /&gt;    say 'Sí es una terminal' /* rc es igual a 0 */&lt;br /&gt;&lt;br /&gt;  exit 0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Esto nos permite, por ejemplo, forzar la ejecución del programa en una terminal:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  #!/bin/sh&lt;br /&gt;  # Ejemplo para BeOS&lt;br /&gt;  # Cada entorno de escritorio tiene su propio ejecutable&lt;br /&gt;  # para la terminal.&lt;br /&gt;  myself=$0&lt;br /&gt;  if [ "$(tty)" = "not a tty" ]; then&lt;br /&gt;    Terminal -t "Ejemplo" /bin/sh -c "$myself"&lt;br /&gt;  else&lt;br /&gt;    echo 'Sí una terminal'&lt;br /&gt;  fi&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Con &lt;code&gt;kdialog&lt;/code&gt;, &lt;code&gt;zenity&lt;/code&gt; o &lt;code&gt;xdialog&lt;/code&gt; podemos hacer pequeños &lt;i&gt;scripts&lt;/i&gt; interactivos como en el siguiente caso:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  /*bin/true;exec rexx "$0" "$@";exit # REXX */&lt;br /&gt;&lt;br /&gt;  current_date = date('S')&lt;br /&gt;&lt;br /&gt;  'tty &gt; /dev/null'&lt;br /&gt;&lt;br /&gt;  gui = rc&lt;br /&gt;&lt;br /&gt;  if gui = 1 then do&lt;br /&gt;    'zenity --title "Escoja su fecha de nacimiento"' ||,&lt;br /&gt;      ' --calendar --date-format %Y%m%d | rxqueue'&lt;br /&gt;    pull birthday_date&lt;br /&gt;    if rc = 1 then&lt;br /&gt;      exit 1 /* Pulsado el botón "Cancelar" */&lt;br /&gt;    end&lt;br /&gt;  else do&lt;br /&gt;    say 'Introduzca su fecha de cumpleaños (19770223):'&lt;br /&gt;    parse pull birthday_date&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;  age_in_days = say date('B', current_date, 'S'),&lt;br /&gt;                - date('B', birthday_date, 'S')&lt;br /&gt;&lt;br /&gt;  if gui = 1 then do&lt;br /&gt;    'zenity --warning --text "Su edad en días es:',&lt;br /&gt;      age_in_days '"'&lt;br /&gt;  else do&lt;br /&gt;    say 'Su edad en días es' age_in_days&lt;br /&gt;&lt;br /&gt;  exit 0&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-7786474091257495671?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/7786474091257495671/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=7786474091257495671' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/7786474091257495671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/7786474091257495671'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/como-averiguar-si-un-script-est-en-una.html' title='Como averiguar si un script está en una consola'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-3238526022812343943</id><published>2007-09-13T22:10:00.000+02:00</published><updated>2007-09-13T22:58:48.274+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ooRexx'/><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>La máquina expendedora de ooRexx</title><content type='html'>David Ashley, uno de los líderes del desarrollo del intérprete &lt;a href="http://www.oorexx.org/"&gt;Open Object REXX&lt;/a&gt; (también conocido como ooRexx) anuncia hoy en comp.lang.rexx que el servidor de compilación de Open Object REXX está listo y la &lt;a href="http://build.oorexx.org/"&gt;página asociada para acceder a él&lt;/a&gt;, también lo está. Tal como estaba previsto hace ya bastantes meses y como al parecer se comentó en el simposio internacional de este año.Básicamente ese servidor es una máquina con un Fedora Core 6 y un conjunto de sistemas operativos ejecutados como invitados a través de un VMware Server 1.0.3. Por ahora las elecciones no son muy variadas: Fedora 7, Ubuntu 7, Windows 2000 y Windows XP. Esto deja fuera otros sistemas para los que ya existen versiones oficiales del intérprete (AIX, Mac OS X y Solaris) y versiones no oficiales (FreeBSD).Lo que más me llama la atención de esta iniciativa es la enorme conexión que establece entre un lenguaje que deriva de REXX y SmallTalk (y que por lo tanto tiene una tradición tan larga que hace que sea fácil tacharlo de antigüedad) y algo tan en boga y de moda como son las máquinas virtuales.La máquinas virtuales no son el único punto de conexión de ooRexx con cosas que no están nada trasnochadas: gracias a Rony Flatscher y sus alumnos tenemos BSF4Rexx que permite ejecutar código Java desde REXX (desde Object REXX de forma completamente transparente) y código REXX desde Java; gracias también a Rony se puede acceder a OpenOffice y su sistema de componentes UNO desde Open Object REXX permitiendo el control externo de la aplicación, así como el escribir macros en ooRexx; gracias a David Ashley también disponemos de una mod_rexx apto para las últimas versiones del servidor Apache; René Vincent Jansen insinua en su blog que la integración entre ooRexx y el sistema de &lt;i&gt;scripting&lt;/i&gt; de Mac OS X es cada vez mejor...En definitiva, la comunidad de viejos dinosaurios se mueve aun y se moderniza. Que el equipo de desarrolladores pongan al servicio de la comunidad esta máquina &lt;i&gt;expendedora&lt;/i&gt; que escupe la versión binaria más reciente correspondiente al código almacenado en los depósitos &lt;i&gt;Subversion&lt;/i&gt; resulta (al menos desde el punto de vista intelectual) muy estimulante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-3238526022812343943?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/3238526022812343943/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=3238526022812343943' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/3238526022812343943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/3238526022812343943'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/la-mquina-expendedora-de-oorexx.html' title='La máquina expendedora de ooRexx'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-5400657479067610882</id><published>2007-09-11T23:10:00.000+02:00</published><updated>2007-09-11T23:14:58.918+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Free Pascal Compiler 2.2.0 en OS/2 y eComStation</title><content type='html'>Ayer me enteré a través de &lt;a href="http://barrapunto.com"&gt;Barrapunto&lt;/a&gt; de la salida de la versión 2.2.0 de &lt;a href="http://www.freepascal.org/download.var"&gt;Free Pascal Compiler&lt;/a&gt;, un compilador de Pascal y Object Pascal de código abierto multiplataforma (OS/2, Linux -versiones de 32 y 64 así como para arm-, FreeBSD, Windows -incluidos Vista y CE-...) y me llama bastante la atención que no se haya mencionado nada todavía en ninguno de los portales dedicados a OS/2.&lt;br /&gt;&lt;br /&gt;Y me llama la atención porque Pascal, sus dialectos y sus derivados siempre han dado un buen puñado de programas populares y útiles para OS/2 (dejamos de lado el hecho de que en otros sistemas operativos uno de mis programas favoritos de todos los tiempos esté hecho en Delphi: Total Commander de Christian Ghisler).&lt;br /&gt;&lt;br /&gt;Por poner un ejemplo, en este mismo instante estas líneas las escribo en el editor de texto de eComStation, el AE de Aaron Lawrence, que está hecho en Sibyl (una especie de Delphi para OS/2), mientras tengo un cliente IRC hecho con Virtual Pascal (Virtual IRC) conectado y escucho esa deliciosa excentricidad de Mike Oldfield llamada &lt;i&gt;Amarok&lt;/i&gt; con el reproductor Z! hecho con Virtual Pascal. Y hay cientos de ejemplos así:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En Virtual Pascal: el reproductor MP3 en modo texto Z! (también disponible para Windows), Web/2 (un estupendo servidor web, ligero y sencillo también disponible para Windows), Virtual IRC (un cliente IRC), Normal Player (un reproductor que usa el sistema multimedia de OS/2)...&lt;/li&gt;&lt;li&gt;En Sibyl o su variante GPL WDSibyl (disponible para Windows): NewView (el nuevo visor de ayuda que es componente de eComStation), AE (el editor de texto que es componente de eComStation), el USB Resource Manager, el programa de configuración de TCP/IP de Reinhard Berger...&lt;/li&gt;&lt;li&gt;En Modula, un lenguaje derivado de Pascal: FTPServer (un estupendo servidor FTP) y Weasel (un estupendo servidor de correo) ambos de Peter Moylan.&lt;/li&gt;&lt;li&gt;En Oberon, otro derivado de Pascal, DrDialog (una herramienta gratuita de desarrollo RAD en REXX).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Viendo la tradición de Pascal en OS/2, me llama la atención que la comunidad en torno a este sistema operativo no se haya hecho hecho eco de la noticia de esta nueva versión del compilador FPC.&lt;br /&gt;&lt;br /&gt;Como nota curiosa, he descubierto que el cliente IRC está programado con Virtual Pascal cuando mi amiga Nerea ha intentado pasarme un fichero a través de DCC y el cliente ha dado un típico fallo en tiempo de ejecución de los que dan los programas hechos con ese compilador. Y el fallo era por una razón bastante peculiar: ¡me había quedado sin espacio en mi partición de OS/2!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-5400657479067610882?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/5400657479067610882/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=5400657479067610882' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5400657479067610882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5400657479067610882'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/free-pascal-compiler-220-en-os2-y.html' title='Free Pascal Compiler 2.2.0 en OS/2 y eComStation'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-5163129280385948363</id><published>2007-09-09T23:59:00.000+02:00</published><updated>2008-12-11T12:06:45.590+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Macros REXX en IBM Works</title><content type='html'>Mientras intento recuperarme de la impresión de ver &lt;i&gt;300&lt;/i&gt;, la adaptación del cómic de Frank Miller al cine (Miller, aunque algunos no le perdonemos aun el guion de &lt;i&gt;Robocop 2&lt;/i&gt;, parece tener bastante más suerte en esto que el pobre de Alan Moore), me gustaría hablar de cómo estaban implementadas las macros en una aplicación que ya tiene más de 10 años: IBM Works.&lt;br /&gt;&lt;br /&gt;Las macros, desde el punto de vista de un usuario final, son conjuntos de acciones que permiten ahorrar trabajo al usuario en un programa concreto. Ejecutando la macro al pulsar una combinación de teclas, pulsar un elemento de un menú, seleccionarla en un diálogo o como permita el programa, el usuario puede evitar realizar tareas repetitivas como &lt;i&gt;inserta el carácter hebreo aleph&lt;/i&gt;, &lt;i&gt;selecciona el párrafo y dale otro formato&lt;/i&gt;...&lt;br /&gt;&lt;br /&gt;  Ocasionalmente, las macros pueden tener una lógica interna más allá de una secuencia de tareas repetitivas y entonces el modo de realizarlas es a través de un lenguaje de programación de macros. Y son de estas macros de las que quiero hablar.&lt;br /&gt;&lt;br /&gt;  El problema que siempre ha existido con los lenguajes de programación de macros es que son específicos de la aplicación: el cliente IRC mIRC tiene su lenguaje de macros, Microsoft Office hasta ahora ha utilizado una variante de BASIC (Visual Basic for Applications), Open Office ha utilizado otra variante de BASIC, Lotus SmartSuite utiliza LotusScript, el editor de audio Audacity usa su propio lenguaje...&lt;br /&gt;&lt;br /&gt;Esto quiere decir que si el usuario desea aprender un lenguaje de macros, probablemente no pueda reutilizar sus conocimientos en otro sitio. Además, en algunos casos, la complejidad del lenguaje de macros para el tipo de tarea que desea el usuario puede resultarle excesiva (se encuentra con tipos de variables, declaraciones, módulos, objetos, métodos, sistemas de componentes y similares incluso para las macros más sencillas).&lt;br /&gt;&lt;br /&gt;Cuando hace más de 25 años, Mike Cowlishaw creó el lenguaje de programación REXX, uno de sus propósitos era que fácilmente pudiera ser utilizado como un lenguaje de macros. Y cuando IBM empezó a introducirlo como lenguaje de &lt;i&gt;scripts&lt;/i&gt; de todos sus sistemas operativos, también empezó a convertirse en el lenguaje de macros de muchas aplicaciones para esos sistemas.&lt;br /&gt;&lt;br /&gt;En el mundo de la informática personal, dos sistemas operativos (uno ajeno a IBM) escogieron implementaciones de REXX como su lenguaje de macros preferido: OS/2 y Amiga OS.&lt;br /&gt;&lt;br /&gt;En OS/2 existía un pequeño paquete de oficina llamado IBM Works cuya hoja de cálculo utiliza macros REXX aunque apenas aproveche las posibilidades de esto.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FvqfZGxiSUk/RuRtr1VtXWI/AAAAAAAAAAc/aa6IqnVn8x0/s1600-h/ibmworks.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_FvqfZGxiSUk/RuRtr1VtXWI/AAAAAAAAAAc/aa6IqnVn8x0/s320/ibmworks.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5108328477164920162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FvqfZGxiSUk/RuRtr1VtXXI/AAAAAAAAAAk/HEFVJJomTrA/s1600-h/ibmworks_spread.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_FvqfZGxiSUk/RuRtr1VtXXI/AAAAAAAAAAk/HEFVJJomTrA/s320/ibmworks_spread.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5108328477164920178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como puede verse en la segunda imagen, la primera columna corresponde a nombres de personas, la segunda a un NIF (Número de Identificación Fiscal) y la tercera muestra una comprobación de la validez del NIF utilizando una función de la hoja de cálculo IBM Works: &lt;code&gt;=rexx("isValidNIF.fnc",1,1,B4)&lt;/code&gt;. La función &lt;code&gt;rexx&lt;/code&gt; de IBM Works busca un fichero indicado en el primer parámetro (&lt;code&gt;isValidNIF.fnc&lt;/code&gt;), decide que el valor de la celda será texto (si tuviésemos 0 en lugar de 1 tras la primera coma, trataría la celda como número) y lo ejecuta pasándole el número de parámetros indicado en el tercero de sus parámetros (en este caso uno)... Y el código de la macro no puede ser más sencillo:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/* isValidNIF.fnc */&lt;br /&gt;  parse arg nif&lt;br /&gt;  letras  = 'TRWAGMYFPDXBNJZSQVHLCKE'&lt;br /&gt;  numeros = '0123456789'&lt;br /&gt;&lt;br /&gt;  letra   = right(nif, 1)&lt;br /&gt;  dni     = left(nif, length(nif) - 1)&lt;br /&gt;&lt;br /&gt;  select&lt;br /&gt;  when pos(letra, letras) = 0 then&lt;br /&gt;    ret = 'ERROR: Último carácter no es una letra'&lt;br /&gt;  when verify(dni,'1234567890') &lt;&gt; 0 then&lt;br /&gt;    ret = 'ERROR: El NIF debe comenzar por un número válido'&lt;br /&gt;  when letra = substr(letras, dni//23 + 1, 1) then&lt;br /&gt;    ret = 'NIF válido'&lt;br /&gt;  otherwise&lt;br /&gt;    ret = 'ERROR: La letra no corresponde al DNI'&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;return ret&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En esta aplicación concreta, la utilización de REXX como lenguaje de macros se ve reducida a su mínima expresión (al contrario que en casos como gnuplot, gdb, Photo&gt;Graphics, GoServe, EPM...) y a pesar de ello se aprecia la sencillez.&lt;br /&gt;&lt;br /&gt;  Esto no solventa uno de los problemas de los sistemas de lenguajes de macros: la dependencia de un lenguaje concreto.&lt;br /&gt;  Microsoft intentó eliminar la dependencia del lenguaje a través de su sistema de componentes COM que permite utilizar cualquier lenguaje para el que exista un WSE (&lt;i&gt;Windows Scripting Engine&lt;/i&gt;) en cualquier aplicación que funcione como WSH (&lt;i&gt;Windows Scripting Host&lt;/i&gt;) como son Internet Explorer o IIS, por ejemplo (y no es Microsoft Office, curiosamente), pero el sistema es incómodo para un no iniciado. OpenOffice desde sus últimas versiones permite ejecutar macros en más de un lenguaje, pero el sistema es tan barroco como el caso de los sistemas de Microsoft.&lt;br /&gt;  Quizás la aproximación que dando independencia de lenguaje conserva la sencillez es una de las que siguen virtualmente todos los servidores web y algunos editores de texto: la macro se ejecuta por el intérprete deseado y coge la információn necesaria de la entrada estándar, los parámetros y las variables de entorno y devuelve la información a la aplicación a través de su salida estándar. Así es como funcionan los CGIs en los servidores web y las macros en el editor de texto para programadores TextMate (aunque en este caso, la documentación del editor restringe el concepto de macro), por ejemplo.&lt;br /&gt;&lt;br /&gt;  Es una pena que a veces las cosas sean innecesariamente complejas.&lt;br /&gt;&lt;br /&gt;  Incidentalmente: en la distribución del intérprete &lt;a href="http://newlisp.org"&gt;newLISP&lt;/a&gt; para Windows puede encontrarse un ejemplo de fichero de Excel que incluye una macro en Visual Basic que define una función que permite ejecutar código newLISP en cualquier fórmula de Excel de un modo muy similar al ejemplo de IBM Works. Y el mismo sistema puede utilizarse para ejecutar código de otros lenguajes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-5163129280385948363?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/5163129280385948363/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=5163129280385948363' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5163129280385948363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/5163129280385948363'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/macros-rexx-en-ibm-works.html' title='Macros REXX en IBM Works'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FvqfZGxiSUk/RuRtr1VtXWI/AAAAAAAAAAc/aa6IqnVn8x0/s72-c/ibmworks.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2310819436396102626</id><published>2007-09-09T23:25:00.001+02:00</published><updated>2007-09-10T00:10:53.158+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Synergy en OS/2</title><content type='html'>,a href="http://www.netlabs.org":Netlabs,/a: cumple 10 aos, lo que es un buen motivo de celebracin... No es que me haya equivocado de tecla, es que estoy usando el teclado y el ratn del porttil de mi hermana (Windows) en mi ordenador de sobremesa (eComStation). Y que nadie piense que he sido tan bruto como para despedazar el porttil y hacer una chapuza, simplemente estoy usando Synergy a travs de la red. Pero volvamos a mi teclado...&lt;br /&gt;&lt;br /&gt;Hace unos días, &lt;a href="www.netlabs.org"&gt;Netlabs&lt;/a&gt; cumplía 10 años y explorando el directorio &lt;i&gt;incoming&lt;/i&gt; en &lt;a href="ftp://ftp.netlabs.org"&gt;su servidor FTP&lt;/a&gt; como hago de vez en cuando me tropecé con un misterioso fichero llamado &lt;i&gt;synergybart.zip&lt;/i&gt;. El &lt;i&gt;bart&lt;/i&gt; me sugería quién era probablemente el autor (Bart van Leeuwen), pero el &lt;i&gt;synergy&lt;/i&gt; me dejó descolocado y como la curiosidad extrema es uno de mis numerosos defectos, descargué el fichero y le eché un vistazo para encontrarme... que no llevaba ninguna documentación.&lt;br /&gt;&lt;br /&gt;Una rápida búsqueda a través de Google permite ver que &lt;a href="http://synergy2.sourceforge.net/"&gt;Synergy&lt;/a&gt; es un programa libre multiplataforma (hay versiones para Windows, Linux y Mac OS X) que permite usar el teclado y el ratón de un ordenador concreto (el servidor) en varios ordenadores conectados en una red. Es decir, podemos tener tres monitores correspondientes a tres CPUs distintas y controlar todos desde el mismo teclado y ratón. Moviendo el puntero a los bordes de un monitor, pasamos al siguiente...&lt;br /&gt;&lt;br /&gt;El que comparte el teclado y el ratón funciona como servidor ejecutando &lt;code&gt;synergys.exe&lt;/code&gt; con la configuración y los parámetros adecuados. En mi caso, el fichero de configuración &lt;code&gt;synergy.conf&lt;/code&gt; es así:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;section: screens&lt;br /&gt;        salva:&lt;br /&gt;        fran:&lt;br /&gt;end&lt;br /&gt;section: links&lt;br /&gt;        salva:&lt;br /&gt;                right = fran&lt;br /&gt;        fran:&lt;br /&gt;                left = salva&lt;br /&gt;end&lt;br /&gt;section: options&lt;br /&gt;        screenSaverSync = false&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En él se indican los nombres de los monitores y además la posición relativa de los mismos (&lt;code&gt;fran&lt;/code&gt; está a la derecha de &lt;code&gt;salva&lt;/code&gt; y &lt;code&gt;salva&lt;/code&gt; está a la izquierda de &lt;code&gt;fran&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;Si mi máquina tiene mi como IP la 192.168.0.3 y la de mi hermana tiene como IP la 192.168.0.1 y la mía funciona como servidor, debo ejecutar &lt;code&gt;synergys.exe --config synergy.conf --name salva&lt;/code&gt; en mi máquina y &lt;code&gt;synergyc.exe --name fran 192.168.0.3&lt;/code&gt; en el portátil de mi hermana. Mientras que en el caso en el que el servidor es el portátil, debo ejecutar &lt;code&gt;synergys.exe --config synergy.conf --name fran&lt;/code&gt; en el portátil y &lt;code&gt;synergyc.exe --name salva 192.168.0.1&lt;/code&gt; en mi ordenador.&lt;br /&gt;&lt;br /&gt;La versión de OS/2 del servidor parece no funcionar bien; solamente consigo que el puntero en el portátil se mueva, pero renqueando y sin que funcionen los botones y el teclado envía la señal al servidor en lugar de al cliente. (Digo &lt;u&gt;parece&lt;/u&gt; porque puede ser culpa de la configuración.) La versión de OS/2 del cliente parece funcionar bien, salvo por lo que queda patente en el primer párrafo de la entrada.&lt;br /&gt;&lt;br /&gt;De hecho, lo más &lt;i&gt;espectacular&lt;/i&gt; es ver cómo se copia y pega texto del &lt;i&gt;clipboard&lt;/i&gt; (portapapeles) de forma completamente transparente entre una máquina y otra. (ClipView, la utilidad de Dave Saville también permite compartir el portapapeles entre dos máquinas a través de la red.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2310819436396102626?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2310819436396102626/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2310819436396102626' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2310819436396102626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2310819436396102626'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/synergy-en-os2.html' title='Synergy en OS/2'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-6564411293856057454</id><published>2007-09-08T20:47:00.000+02:00</published><updated>2007-09-08T21:19:57.470+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>La sentencia parse version</title><content type='html'>La instrucción &lt;code&gt;parse&lt;/code&gt; de REXX permite, entre muchas otras cosas, saber con qué intérprete y qué versión del mismo estamos trabajando. A través de la sentencia &lt;code&gt;parse version rexxVersion&lt;/code&gt;, el intérprete da a la variable un valor que indica el nombre del intérprete, el nivel del lenguaje y la fecha del intérprete.&lt;br /&gt;&lt;br /&gt;Así, por ejemplo, si es el intérprete de REXX clásico de eComStation el que interpreta el código, la variable valdrá &lt;code&gt;REXXSAA 4.00 3 Feb 1999&lt;/code&gt;. Si es Regina, puede resultar algo como &lt;code&gt;REXX-Regina_3.3(MT) 5.00 25 Apr 2004&lt;/code&gt; en las versiones más recientes o &lt;code&gt;REXX-Regina_3.0 4.95 25 Apr 2002&lt;/code&gt; en versiones anteriores. Si es Reginald, puede devolver &lt;code&gt;REXX-Reginald_4.6 4.00 13 Aug 2005&lt;/code&gt;, por ejemplo. Si es Open Object REXX, el resultado podría ser &lt;code&gt;REXX-ooRexx_3.0(MT) 6.00 28 Mar 2005&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;En el primer ejemplo, &lt;code&gt;REXXSAA&lt;/code&gt; identifica el intérprete REXX como el que forma parte de OS/2 y eComStation (si bien el intérprete REXX que forma parte del sistema operativo PC-DOS de IBM también se identifica a sí mismo como &lt;code&gt;REXXSAA&lt;/code&gt; como probablemente le ocurra a alguna implementación más de IBM). El número &lt;code&gt;4.00&lt;/code&gt; corresponde al nivel del lenguaje: el 4.00 corresponde al definido por la segunda edición de &lt;i&gt;The REXX Language&lt;/i&gt; de Mike Cowlishaw, el nivel 5.00 corresponde al definido por el estándar ANSI de 1996 y el 6.00 corresponde al superconjunto de REXX clásico que es Object REXX. Y la fecha se supone que indica la fecha del intérprete en el mismo formato que &lt;code&gt;date()&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;El estándar ANSI especifica que el nombre del intérprete debe ser la palabra REXX en mayúsculas seguida del nombre del intérprete en si mismo. Pero en algunos casos, el intérprete no sigue esa norma, como en el caso del Object REXX de IBM, que devuelve &lt;code&gt;OBJREXX 6.00 18 May 1999&lt;/code&gt;, o BRexx, que devuelve &lt;code&gt;brexx 2.1.0 Mar 11 2003&lt;/code&gt; (debe apreciarse que en este caso BRexx tampoco indica el nivel del lenguaje, sino su versión y que el formato de fecha no es el que se considera correcto por el estándar ANSI).&lt;br /&gt;&lt;br /&gt;Entre los intépretes más modernos se ha extendido la costumbre de indicar la versión del intérprete y la indicación de si es o no &lt;i&gt;multithreaded&lt;/i&gt; (multihilo):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Regina (multihilo):&lt;/b&gt; REXX-Regina_3.3(MT) 5.00 25 Apr 2004&lt;/li&gt;&lt;li&gt;&lt;b&gt;Regina (ejecutable estático):&lt;/b&gt; REXX-Regina_3.3 5.00 25 Apr 2004&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reginald:&lt;/b&gt; REXX-Reginald_5.0 4.00 9 Apr 2006&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reginald Lite:&lt;/b&gt; REXX-RegLite_5.0 4.00 3 Apr 2006&lt;/li&gt;&lt;li&gt;&lt;b&gt;Open Object REXX:&lt;/b&gt; REXX-ooRexx_3.0(MT) 6.00 28 Mar 2005&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;El distinguir que intérprete y/o que nivel del lenguaje ejecuta nuestro código nos permite aprovechar características de un intérprete concreto o un nivel del lenguaje sin dejar a los otros fuera.&lt;br /&gt;&lt;br /&gt;El manejo de ficheros en REXX es una de las cosas que más cambian de una implementación a otra del lenguaje. Utilizando &lt;code&gt;parse version&lt;/code&gt; podemos hacer lo siguiente:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;parse version rxInterpreter rxLevel rxDate&lt;br /&gt;select&lt;br /&gt;when rxLevel &lt; 4 then&lt;br /&gt;  IO_routines = 'EXECIO'&lt;br /&gt;when rxLevel &lt; 5 then&lt;br /&gt;  IO_routines = 'ANSI'&lt;br /&gt;when rxLevel &gt;= 5 then&lt;br /&gt;  IO_routines = '.STREAM'&lt;br /&gt;otherwise&lt;br /&gt;  nop&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;para decidir si usamos el comando EXECIO de los &lt;i&gt;mainframes&lt;/i&gt; como sistema de manejo de ficheros, las funciones del estándar ANSI (&lt;code&gt;stream&lt;/code&gt;, &lt;code&gt;charin&lt;/code&gt;, &lt;code&gt;lineout&lt;/code&gt;...) o el objeto &lt;i&gt;Stream&lt;/i&gt; propio de Object REXX. O, si queremos dar soporte a BRexx y AREXX:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;parse version rxInterpreter rxLevel rxDate&lt;br /&gt;select&lt;br /&gt;when rxInterpreter = 'AREXX' then&lt;br /&gt;  IO_routines = 'AREXX'&lt;br /&gt;when rxInterpreter = 'brexx' then&lt;br /&gt;  IO_routines = 'BREXX'&lt;br /&gt;when rxLevel &lt; 4 then&lt;br /&gt;  IO_routines = 'EXECIO'&lt;br /&gt;when rxLevel &lt; 5 then&lt;br /&gt;  IO_routines = 'ANSI'&lt;br /&gt;when rxLevel &gt;= 5 then&lt;br /&gt;  IO_routines = '.STREAM'&lt;br /&gt;otherwise&lt;br /&gt;  nop&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;En ese ejemplo, consultando la variable &lt;code&gt;IO_routines&lt;/code&gt;, podemos decidir qué código queremos ejecutar.&lt;br /&gt;&lt;br /&gt;Evidentemente este sistema es de utilidad limitada. Hay tantos intérpretes REXX para tantas plataformas que es imposible para cualquier programador conseguir que un programa de mediana envergadura se aproveche de &lt;code&gt;parse version&lt;/code&gt; para que se ejecute en todos ellos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-6564411293856057454?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/6564411293856057454/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=6564411293856057454' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/6564411293856057454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/6564411293856057454'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/la-sentencia-parse-version.html' title='La sentencia parse version'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-4049876747043831020</id><published>2007-09-07T22:24:00.000+02:00</published><updated>2007-09-07T23:00:38.793+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reparación de PCs'/><title type='text'>Salvando datos a través de FTP</title><content type='html'>Un cliente nos trajo hace muy poquito un portátil HP al que deseaba que le realizásemos un formateo y una reinstalación del sistema operativo (un Windows XP Home Edition) sin borrarle sus ficheros y directorios de la partición de datos.&lt;br /&gt;&lt;br /&gt;El procedimiento no sería difícil de no ser por tres puntos esenciales:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;El sistema operativo no arranca ni en modo seguro.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El cliente ha destruido la partición de recuperación de HP&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Un Windows XP Home Edition Service Pack 2 ordinario no reconoce el disco duro SATA del citado portátil.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;La partición de recuperación que suelen incluir la mayor parte de los fabricantes que venden equipos preinstalados (HP, Dell, Acer...) generalmente es accesible a través de algún tipo de obscuro atajo de teclado en el arranque del PC. El PC arranca el sistema desde la partición de recuperación y normalmente puede recuperarse la partición del sistema tal como venía "de fábrica" sin tocar para nada la partición de los datos.&lt;br /&gt;En el peor de los casos, cuando desconocemos el atajo de teclado o éste no funciona, podemos establecer con una herramienta de particionado de disco duro (como &lt;a href="http://www.dfsee.com/"&gt;DFSee&lt;/a&gt; no como Partition Magic) la partición de recuperación como partición de arranque, dejar que recupere el sistema y volver a establecer la partición del sistema como partición activa.&lt;br /&gt;&lt;br /&gt;Al no tener partición de recuperación se puede optar por instalar desde un CD ordinario (dado que no tenemos los discos de recuperación del sistema y aunque los tuviésemos, no tenemos garantías de que respeten la partición de datos), pero se da la circunstancia de que Windows XP Home SP2 no tiene los drivers necesarios para detectar el disco SATA y como el portátil no tiene disquetera (y no, una disquetera USB &lt;b&gt;NO&lt;/b&gt; sirve) y por lo tanto no podemos instalar.&lt;br /&gt;&lt;br /&gt;Entonces es evidente que es necesario sacar los datos de algún modo del portátil. Un CD arrancable y un disco duro externo por USB parecen una buena opción, hasta que es patente que el único disco duro externo que tenemos no tiene suficiente espacio libre (y en ese momento no podemos liberar el espacio ocupado).&lt;br /&gt;&lt;br /&gt;Pienso un poquito y decido montar un servidor FTP con Filezilla en uno de nuestros ordenadores. Entonces inicio el portátil desde CD con un &lt;a href="http://www.puppylinux.org/"&gt;Puppy Linux&lt;/a&gt; (esa distribución es una verdadera joya en cuanto a ligereza y funcionalidad), configuro la red y con el cliente FTP que incluye (gFTP) transfiero todos los datos.&lt;br /&gt;&lt;br /&gt;Si los clientes fuesen conscientes de los malabarismos que a veces tenemos que hacer para proteger sus datos, quizás nos mirasen con otros ojos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-4049876747043831020?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/4049876747043831020/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=4049876747043831020' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/4049876747043831020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/4049876747043831020'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/salvando-datos-travs-de-ftp.html' title='Salvando datos a través de FTP'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2868454468973144262</id><published>2007-09-06T22:18:00.000+02:00</published><updated>2007-09-06T22:43:51.743+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>Multifunción que bloquea el arranque de un PC</title><content type='html'>Esta tarde me he enfrentado a uno de esos momentos tan poco gratificantes que se encuentran las personas demasiado a menudo en el mundo de la informática cuando un ordenador nuevecito, montado hacía apenas 24 horas, se negaba a arrancar.&lt;br /&gt;&lt;br /&gt;Puede ser bonito saber que el ordenador lleva en su interior una WinFast, pero cuando el logotipo permanece en la pantalla durante cinco minutos seguidos sin inmutarse por mucho que se pulsen las teclas (primero de uno de estos detestables teclados inalámbricos por USB -detestables por inalámbricos y por USB- y después con un teclado PS/2 de toda la vida) uno desea sacar un lanzagranadas y volar por los aires todo el equipo informático. Un equipo &lt;u&gt;completamente nuevo&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;De todos modos, en estos casos se impone el sentido común antes que la ira y uno piensa que &lt;i&gt;tal vez algún dispositivo externo o un extraíble está causando el problema&lt;/i&gt; aunque solamente sea porque ya ha visto cómo ordenadores se han bloqueado en el arranque al tener un llavero USB pinchado. Y un rápido vistazo permite comprobar que lo único inusual que tiene pinchado el PC es una multifunción Lexmark.&lt;br /&gt;&lt;br /&gt;En cuanto se despincha la multifunción, el ordenador arranca con completa normalidad.&lt;br /&gt;&lt;br /&gt;Presumiblemente el problema reside en el mismo punto que el caso de los llaveros USB pinchados en el momento del arranque, dado que la multifunción tiene un lector de tarjetas digitales que es tratado por el PC como un simple MSD (&lt;i&gt;Mass Storage Device&lt;/i&gt;, es decir, un dispositivo de almacenamiento masivo).&lt;br /&gt;&lt;br /&gt;Si alguien piensa que apagando la impresora se soluciona el problema, lamento decepcionarle. Si alguien está pensando que basta con desactivar en la BIOS la búsqueda de arranque en &lt;i&gt;removables&lt;/i&gt; (extraíbles), lamento decepcionarle.&lt;br /&gt;&lt;br /&gt;La solución más sencilla es quitar el cable de la multifunción y pincharla exclusivamente cuando el ordenador esté encendido.&lt;br /&gt;&lt;br /&gt;Sería interesante probar con distintas combinaciones de placas y multifunciones (conozco muchos casos de gente con multifunciones de HP que no tienen este tipo de problemas, desafortunadamente no sé si alguna de esos ordenadores tiene una WinFast) para ver cuáles dan este problema. Pero que no cuenten conmigo para ello.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2868454468973144262?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2868454468973144262/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2868454468973144262' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2868454468973144262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2868454468973144262'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/multifuncin-que-bloquea-el-arranque-de.html' title='Multifunción que bloquea el arranque de un PC'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-3577575362058055078</id><published>2007-09-05T22:33:00.000+02:00</published><updated>2007-09-05T23:27:23.313+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Precisión arbitraria en la aritmética REXX</title><content type='html'>Una de las características de la familia REXX (REXX clásico, Object REXX, NetREXX y otras variaciones) que la diferencia de otros lenguajes de programación más extendidos es su aritmética.&lt;br /&gt;&lt;br /&gt;En ella no nos encontramos cosas como los clásicos conceptos de variables numéricas de tipo &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt; o &lt;code&gt;double&lt;/code&gt;... pero de lo que quisiera hablar hoy es de una característica concreta de la aritmética REXX: la precisión arbitraria.&lt;br /&gt;&lt;br /&gt;¿Qué queremos decir con &lt;i&gt;precisión arbitraria&lt;/i&gt;?&lt;br /&gt;&lt;br /&gt;El siguiente código imprime el resultado del cociente de 1 entre 3:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;say 1/3&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;es decir: 0.333333333. Cualquiera que tenga claras ciertas nociones de matemáticas básicas sabrá que en realidad eso no es 1/3, sino simplemente una aproximación con 9 cifras significativas a 1/3 porque la representación decimal de 1/3 tiene infinitos decimales. &lt;br /&gt;&lt;br /&gt;REXX nos da el resultado con 9 cifras significativas porque es el número de cifras con el que trabaja.&lt;br /&gt;&lt;br /&gt;Si hacemos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;say 1000000000 + 1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;obtendremos 1.00000000E+9. Es decir, que perdemos ese 1 que hemos sumado. Puede que bajo ciertas circunstancias nos interesase ese dígito, pero dado que el lenguaje trabaja con 9 cifras significativas y que ese dígito extra sobrepasa los 9 parece que debamos quedarnos sin el mismo. Y aquí es donde entra en juego el carácter &lt;i&gt;arbitrario&lt;/i&gt; de la precisión:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;numeric digits 100&lt;br /&gt;say 1000000000 + 1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con esta sentencia nueva en el código, el resultado se convierte en 1000000001. Y en el caso anterior de 1/3 obtendríamos una ristra de cien cifras significativas (es decir, cien bonitos números 3 uno detrás del otro). La instrucción &lt;code&gt;numeric digits&lt;/code&gt; nos permite variar el número de cifras significativas.&lt;br /&gt;&lt;br /&gt;Consideremos la clásica función factorial escrita iterativamente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;factorial: procedure&lt;br /&gt;  parse arg n&lt;br /&gt;  factorial = 1&lt;br /&gt;  do i = 1 for n&lt;br /&gt;    factorial = factorial * i&lt;br /&gt;  end&lt;br /&gt;  return factorial&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si ejecutamos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;say factorial(100)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;el resultado es 9.33262137E+157. Mientras que si ejecutamos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;numeric digits 1000&lt;br /&gt;say factorial(100)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;el resultado es exactamente el factorial de 100: &lt;br /&gt;&lt;br /&gt;93326215443944152681&lt;br /&gt;69923885626670049071&lt;br /&gt;59682643816214685929&lt;br /&gt;63895217599993229915&lt;br /&gt;60894146397615651828&lt;br /&gt;62536979208272237582&lt;br /&gt;51185210916864000000&lt;br /&gt;000000000000000000.&lt;br /&gt;&lt;br /&gt;Intentad haced esto utilizando exclusivamente la aritmética básica de otro lenguaje de programación y probablemente descubrais que no podeis o es terriblemente más complicado. Esto no significa que REXX sea mejor, simplemente que es diferente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-3577575362058055078?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/3577575362058055078/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=3577575362058055078' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/3577575362058055078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/3577575362058055078'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/precisin-arbitraria-en-la-aritmtica.html' title='Precisión arbitraria en la aritmética REXX'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-7910818923857419114</id><published>2007-09-04T22:35:00.000+02:00</published><updated>2007-09-05T00:01:38.968+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='malware'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Seguridad'/><title type='text'>¡Contagie su ordenador a través de USB en tres sencillos pasos!</title><content type='html'>Esta misma mañana he invertido varias horas entre otras cosas en limpiar de &lt;i&gt;malware&lt;/i&gt; (esto es, de &lt;i&gt;software&lt;/i&gt; malintencionado como son los virus, los troyanos y los gusanos) unos cinco ordenadores de sobremesa, tres portátiles, seis llaveros USB y cuatro tarjetas de memoria (MMC y SD). Si bien no todos estaban infectados, era necesario comprobarlo uno a uno porque estaba claro cuál había sido el sistema de propagación de la mayoría de las infecciones presentes: los llaveros USB.&lt;br /&gt;&lt;br /&gt;Últimamente es algo muy común ver llaveros USB que transmiten virus de un ordenador a otro como si fuesen el mosquito anófeles transmitiendo la malaria. Y por lo que he podido ver, es algo que se produce con cierta frecuencia en centros públicos como colegios e institutos donde los usuarios llevan su información de un ordenador a otro. Sospecho que en estos casos la propagación es especialmente rápida y en una semana probablemente casi todos los ordenadores estén infectados.&lt;br /&gt;&lt;br /&gt;El modo en el que funciona el contagio es enormemente sencillo y se basa en lo que ya hace muchos años era para mí un fallo de diseño y seguridad de Windows 98: el &lt;i&gt;autorun&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Cada vez que se inserta un dispositivo extraíble como un CD, un DVD o un sistema de almacenamiento como una llave USB, Windows busca en la raiz de esa unidad un fichero de texto llamado &lt;i&gt;autorun.inf&lt;/i&gt;. Ese fichero de texto indica a Windows cosas como el icono con el que debe aparecer en &lt;i&gt;Mi PC&lt;/i&gt;, las acciones que deben agregarse al menú contextual de la unidad (el menú que aparece al pinchar con el botón derecho del ratón) y lo que debe pasar automaticamente al detectarse la unidad. Generalmente esto es utilizado en CDs y DVDs para iniciar algún tipo de asistente de instalación aunque yo mismo en un arranque de malicia hace años grabé algunos CDs con un &lt;i&gt;autorun.inf&lt;/i&gt; que apagaba el ordenador en el se introdujese y esa característica de Windows estuviese activada.&lt;br /&gt;&lt;br /&gt;Los CDs, que eran comunes como medio de transporte de información hace cinco años, y los DVDs (que para el caso podemos considerar como CDs &lt;i&gt;grandes&lt;/i&gt;) son dispositivos de &lt;b&gt;sólo lectura&lt;/b&gt;. No podemos arrastrar ficheros a ellos para copiarlos en ellos, no podemos modificar ficheros existentes y es &lt;b&gt;IMPOSIBLE&lt;/b&gt; añadir nada al CD si está finalizado. No son un modo cómodo de propagación para el &lt;i&gt;malware&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Pero desde que los llaveros USB y similares han desplazado casi completamente a los disquetes el &lt;i&gt;malware&lt;/i&gt; tiene un método de propagación nuevo puesto que son dispositivos de lectura y escritura. Y ahí tenemos el primero de los pasos: si se pincha un llavero en un ordenador infectado por cierto tipo de &lt;i&gt;malware&lt;/i&gt;, éste puede crear una o varias copias en el llavero y un fichero &lt;i&gt;autorun.inf&lt;/i&gt; con instrucciones para ejecutar alguna de las copias. El segundo paso consiste en que el usuario lleva el llavero USB a otra máquina. Y en el tercero, al pinchar el llavero infectado en un ordenador limpio, si la característica de &lt;i&gt;autorun&lt;/i&gt; está activada del modo adecuado, se ejecutará la copia del &lt;i&gt;malware&lt;/i&gt; que se copiará a sí misma en el disco duro del ordenador obligándole a ejecutarla cada vez que lo encendamos.&lt;br /&gt;&lt;br /&gt;Un método sencillo, simple y efectivo.&lt;br /&gt;&lt;br /&gt;Evitar el contagio no es sencillo pero hay algunas cosas que probablemente ayuden:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Si la llave USB lleva un método de bloqueo (los reproductores MP3 suelen llevar algún sistema de bloqueo generalmente etiquetado como &lt;i&gt;hold&lt;/i&gt; y otro tanto ocurre con muchas tarjetas digitales) y simplemente nos interesa llevar algo a un ordenador que no es de confianza (y el que lea esto debe pensar como un paranoico que, en el mejor de los casos, solamente su ordenador es de confianza) lo activamos y así el dispositivo no podrá ser infectado.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Desactivar algunas de las características del &lt;i&gt;autorun&lt;/i&gt; en nuestro Windows para que nada se ejecute automáticamente sin nuestro permiso (para ello, buscad información en Internet).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Darnos cuenta de que cuando en la ventana emergente que aparece al pinchar dispositivos extraíbles en Windows XP hay indicadores extraños sobre la lista de acciones con el nombre de "Programa", es probable que el llavero USB esté infectado y debamos someter a un escaneo tanto el llavero como el equipo.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Todo lo dicho solamente es aplicable a usuarios de Microsoft Windows. Aquellos que utiliceis otro sistema operativo (Linux, BeOS, Mac OS X, OS/2, FreeBSD... el que sea) podeis estar razonablemente seguros de que este sistema de infección no os afectará.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-7910818923857419114?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/7910818923857419114/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=7910818923857419114' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/7910818923857419114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/7910818923857419114'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/contagie-su-ordenador-travs-de-usb-en.html' title='¡Contagie su ordenador a través de USB en tres sencillos pasos!'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2729458583648292455</id><published>2007-09-03T23:06:00.000+02:00</published><updated>2007-09-04T00:14:14.687+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Reimplementando BIFs en REXX</title><content type='html'>En REXX es frecuente referirse oficiosamente a toda función que forma parte del núcleo del lenguaje como BIF: &lt;i&gt;Built-In Function&lt;/i&gt;. El estándar ANSI de 1996 define una serie de funciones dentro de esta categoría como por ejemplo &lt;code&gt;abbrev&lt;/code&gt;, &lt;code&gt;words&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt; o &lt;code&gt;address&lt;/code&gt;. En general las implementaciones del lenguaje tienen todas las BIFs definidas en el estándar, añadiendo aportaciones propias o tal vez careciendo de alguna concreta.&lt;br /&gt;&lt;br /&gt;Lo peculiar del caso es que REXX permite que el programador defina las funciones internas de su programa (aquellas que se incluyen dentro del mismo fichero) utilizando los mismos nombres que alguna BIF y aun así seguir utilizando la BIF cuyo nombre hemos utilizado.&lt;br /&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;  /* words.rex */&lt;br /&gt;&lt;br /&gt;  parse pull frase&lt;br /&gt;  say words(frase)&lt;br /&gt;&lt;br /&gt;  exit&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Este sencillo ejemplo se limita a contar el número de palabras que tiene una cadena que introduce el usuario utilizando la BIF &lt;code&gt;words&lt;/code&gt;. La línea con la sentencia &lt;code&gt;parse pull frase&lt;/code&gt; se limita a meter la entrada del usuario en la variable &lt;code&gt;frase&lt;/code&gt;. Y la siguiente línea nos dice la salida de la función &lt;code&gt;words&lt;/code&gt; aplicada sobre la variable &lt;code&gt;frase&lt;/code&gt;, es decir, muestra en pantalla el número de palabras.&lt;br /&gt;&lt;br /&gt;Si el programador introduce una función en el código como en el siguiente caso:&lt;br /&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;  /* words.rex */&lt;br /&gt;&lt;br /&gt;  parse pull frase&lt;br /&gt;  say words(frase)&lt;br /&gt;&lt;br /&gt;  exit&lt;br /&gt;&lt;br /&gt;  words: procedure&lt;br /&gt;    return 'No me apetece contar palabras'&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El resultado es que en lugar de ejecutarse la BIF &lt;code&gt;words&lt;/code&gt;, se ejecuta nuestra función. Es decir, que sea cual sea la entrada del usuario, el programa siempre imprimirá que no le apetece contar palabras.&lt;br /&gt;&lt;br /&gt;A pesar de tener &lt;i&gt;ocupado&lt;/i&gt; el nombre de la BIF &lt;code&gt;words&lt;/code&gt;, podemos seguir accediendo a ella llamandola por su nombre en mayúsculas entrecomillado (por comillas simples). Así, en el siguiente ejemplo, se imprime siempre que no le apetece contar palabras e inmediatamente después el número de palabras tal como lo cuenta la BIF &lt;code&gt;words&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;  /* words.rex */&lt;br /&gt;&lt;br /&gt;  parse pull frase&lt;br /&gt;  say words(frase)&lt;br /&gt;  say 'WORDS'(frase)&lt;br /&gt;&lt;br /&gt;  exit&lt;br /&gt;&lt;br /&gt;  words: procedure&lt;br /&gt;    return 'No me apetece contar palabras'&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente podemos ejecutar la BIF desde dentro de nuestra función:&lt;br /&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;  /* words.rex */&lt;br /&gt;&lt;br /&gt;  parse pull frase&lt;br /&gt;  say words(frase)&lt;br /&gt;&lt;br /&gt;  exit&lt;br /&gt;&lt;br /&gt;  words: procedure&lt;br /&gt;    parse arg cadena&lt;br /&gt;    return 'WORDS'(cadena)&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esto nos permite cierto número de posibilidades como &lt;i&gt;cambiar&lt;/i&gt; el comportamiento de las BIFs de nuestro intérprete. Esto puede ser interesante, por ejemplo, cuando un intérprete no implementa una BIF como estamos acostumbrados a utilizar. Imaginemos que un programador acostumbrado a las características de la BIF &lt;code&gt;date&lt;/code&gt; para hacer aritmética de fechas propias del estándar y presentes en Object REXX y Regina desea que su código funcione en REXX clásico en OS/2 (que carece de esa característica). Si hace una función &lt;code&gt;date&lt;/code&gt; que supla esas características ausentes en ese intérprete, solamente tiene que añadir esa función en la versión de su programa para OS/2 y no tendrá que tocar ninguna línea más de código.&lt;br /&gt;&lt;br /&gt;Lo interesante es que podemos reimplementar muchas de las BIFs orientadas a manejo de cadenas solamente utilizando bucles condicionales y la instrucción &lt;code&gt;PARSE&lt;/code&gt;. En el caso que nos ocupa, podríamos hacer:&lt;br /&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;  words: procedure&lt;br /&gt;    parse arg string&lt;br /&gt;    n = 0&lt;br /&gt;    do while string &lt;&gt; ''&lt;br /&gt;      parse var string . string&lt;br /&gt;      n = n + 1&lt;br /&gt;    end&lt;br /&gt;    return n&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;parse&lt;/code&gt; coge el &lt;i&gt;arg&lt;/i&gt;umento de la función que hemos escrito y lo introduce en la variable &lt;code&gt;string&lt;/code&gt;, mientras la variable &lt;code&gt;string&lt;/code&gt; no esté vacía &lt;code&gt;parse&lt;/code&gt; coge la primera palabra de la &lt;i&gt;var&lt;/i&gt;iable &lt;code&gt;string&lt;/code&gt; y la descarta (.) metiendo el resto en &lt;code&gt;string&lt;/code&gt;. Cada vez que descarta una palabra, aumenta el contador, y cuando las ha descartado todas, nos devuelve el valor de ese contador, es decir, del número de palabras. (Podríamos habernos ahorrado un par de líneas, pero he preferido dejarlo así por claridad.)&lt;br /&gt;&lt;br /&gt;Como ejercicio para principiantes, el intentar reimplementar BIFs sin utilizar BIFs es algo, creo yo, muy educativo. Permite apreciar el valor de la instrucción &lt;code&gt;parse&lt;/code&gt; y familiarizarse con las BIFs orientadas a cadenas.&lt;br /&gt;&lt;br /&gt;Solamente podemos "redefinir" las BIFs a través de funciones internas de nuestro programa. Las funciones externas no nos valdrán y tampoco aquellas que estén en el macroespacio (si la implementación lo tiene). Pero cuando la BIF no está definida en nuestro intérprete (como ocurre con &lt;code&gt;countstr&lt;/code&gt; en REXX clásico para OS/2), entonces podemos implementarla como una función externa y cargarla en el macroespacio...&lt;br /&gt;&lt;br /&gt;Pero, como decía Jack Lemmon en &lt;i&gt;Irma la dulce&lt;/i&gt;: &lt;i&gt;Eso es otra historia&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2729458583648292455?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2729458583648292455/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2729458583648292455' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2729458583648292455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2729458583648292455'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/reimplementando-bifs-en-rexx.html' title='Reimplementando BIFs en REXX'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-2486222801614330351</id><published>2007-09-02T23:26:00.000+02:00</published><updated>2007-09-02T23:38:52.892+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='eComStation'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>mplayer en OS/2 y eComStation</title><content type='html'>Aún recuerdo cómo hace años el proyecto &lt;a href="http://www.mplayerhq.hu/"&gt;mplayer&lt;/a&gt; puso en su lista negra a WarpVision, que por aquel entonces era practicamente el único reproductor de vídeo para OS/2 con cierta funcionalidad, porque había utilizado código fuente de mplayer (código bajo la licencia &lt;a href="http://es.wikipedia.org/wiki/GPL"&gt;GPL&lt;/a&gt;) y se trataba de un programa comercial.&lt;br /&gt;&lt;br /&gt;Tras el paso de los años el proyecto WarpVision cambió de tutela y pasó a &lt;a href="http://www.netlabs.org/"&gt;Netlabs&lt;/a&gt; que liberó su código fuente. Y lo que hace años era un prometedor reproductor multimedia para una plataforma de software virtualmente abandonada, ahora sigue siendo exactamente eso: un proyecto prometedor.&lt;br /&gt;&lt;br /&gt;Y precisamente el hecho de que las funcionalidades del programa y su estabilidad hayan mejorado tan poco significativamente resulta enormemente frustrante (como el mismo Adrian Gschwend, responsable de Netlabs, comentaba no hace muchos meses ante la decisión de despedir al desarrollador del programa). WarpVision no sigue un esquema de numerado de versiones claro y resulta muy difícil decidir qué versión utilizar porque hay características que dejan de funcionar en una versión nueva que ha corregido algún problema que tenía la versión anterior.&lt;br /&gt;&lt;br /&gt;En el transcurso de estos años el panorama ha cambiado en OS/2 de un modo curioso; toda una serie de personas individuales y comunidades han aportado una serie de herramientas de desarrollo que mantienen vivo a un sistema operativo que lleva muerto ya más de media década: Knut St. Osmundsen es el responsable de las versiones del compilador GCC y la biblioteca libc más actuales existentes para la plataforma (con características nuevas de las que carecen los equivalentes anteriores: EMX); Doodle ha portado &lt;a href="http://es.wikipedia.org/wiki/LibSDL"&gt;SDL&lt;/a&gt; y &lt;a href="http://cairographics.org/"&gt;Cairo&lt;/a&gt;; Dmitry A. Kuminov ha portado &lt;a href="http://es.wikipedia.org/wiki/Qt_%28biblioteca%29"&gt;QT3&lt;/a&gt;; la comunidad &lt;a href="http://www.openwatcom.org/"&gt;OpenWatcom&lt;/a&gt; ha sacado recientemente la versión 1.7 de su compilador de C, C++ y Fortran; varias personas mantienen todos los programas de la familia de productos Mozilla al día...&lt;br /&gt;&lt;br /&gt;En estas circunstancias en las que el software libre da una inyección de vitalidad al sistema, varias personas, probablemente insatisfechas con WarpVision, han mirado hacia afuera para ver qué podían traer hacia el sistema. Ese bendito australiano llamado &lt;a href="http://smedley.info/os2ports/"&gt;Paul Smedley&lt;/a&gt; portó ffplay (el reproductor basado en ffmpeg) y mplayer utilizando SDL con resultados discretos. El coreano KO Myung-Hun, basandose probablemente en el trabajo de Paul, ha hecho sus propias versiones de estos programas eliminando la dependencia de la biblioteca SDL y activando aceleración 2D a través de WarpOverlay y en el caso de mplayer ha creado una &lt;a href="http://hobbes.nmsu.edu/pub/os2/apps/mmedia/video/players/mplayer-dev-svn-r23698-os2-3.3.5.zip"&gt;verdadera joya&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mi máquina es muy modesta en recursos: un AMD K6-2 a 450 MHz, una tarjeta gráfica de tan solo 8 megas, una RAM de unos 500 megas... y en muchos casos no conseguía reproducir la mayor parte de los vídeos (aun en mis restantes sistemas operativos). Por poner un ejemplo: no conseguía ver los capítulos de &lt;span style="font-style: italic;"&gt;Naruto Shipuuden&lt;/span&gt; de ningún modo, no importaba el sistema operativo o el reproductor que utilizase o lo que jugase con las opciones de reproducción.&lt;br /&gt;&lt;br /&gt;Hasta el &lt;span style="font-style: italic;"&gt;port&lt;/span&gt; de mplayer de KO Myung-Hun.&lt;br /&gt;&lt;br /&gt;Hasta ahora ha resultado extraordinariamente estable, me ha permitido ver casi todos los vídeos que he probado (hasta ahora solamente se le resisten los FLV bajados de YouTube y los WMV), carga y sincroniza correctamente ficheros de subtítulos externos, reproduce DVDs sin problemas... y si un vídeo me da problemas con su resolución completa, con la opción "-lavdopts lowres=1:fast:skiploopfilter=all" puedo verlo en baja resolución sin inconvenientes (salvo, claro está, la resolución misma).&lt;br /&gt;&lt;br /&gt;Le faltan pequeñas cosas como reproducir VCD, ocultar el puntero de ratón en pantalla completa, desactivar el salvapantallas mientras está reproduciendo, que el ejecutable y la ventana de reproducción tenga un icono (es sorprendente lo que me importa una nimiedad como esa, teniendo en cuenta lo poco que suele importarme la estética)... Tal vez una interfaz gráfica sería deseable y dado que el trabajo de Myung-Hun incluye un modo esclavo que es necesario para hacer un &lt;span style="font-style: italic;"&gt;front-end&lt;/span&gt; (con el que he intentado jugar sin éxito alguno) ya existe todo lo necesario para ello (de hecho, el &lt;span style="font-style: italic;"&gt;front-end&lt;/span&gt; multiplataforma SMPlayer, basado en QT es un buen candidato a &lt;span style="font-style: italic;"&gt;port&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Pero mientras llegan esas cosas que no son vitales, &lt;span style="font-weight: bold;"&gt;¡qué irónico es que OS/2 se haya convertido en el sistema que he de usar para ver vídeos!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-2486222801614330351?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/2486222801614330351/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=2486222801614330351' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2486222801614330351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/2486222801614330351'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/09/mplayer-en-os2-y-ecomstation.html' title='mplayer en OS/2 y eComStation'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-1076690916069986971</id><published>2007-08-31T22:44:00.000+02:00</published><updated>2007-09-01T00:41:38.419+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS/2'/><category scheme='http://www.blogger.com/atom/ns#' term='REXX'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Pseudocompiladores REXX, la instrucción TRACE y la función SOURCELINE</title><content type='html'>Aunque &lt;a href="http://es.wikipedia.org/wiki/IBM"&gt;IBM&lt;/a&gt; ha desarrollado compiladores del lenguaje de programación &lt;a href="http://es.wikipedia.org/wiki/REXX"&gt;REXX&lt;/a&gt; que se han utilizado y se siguen utilizando en entornos de producción, el lenguaje es principalmente conocido por un gran abanico de intérpretes.&lt;br /&gt;&lt;br /&gt;El abanico es tan amplio que la lista pasa por los comerciales como &lt;a href="http://www.wrkgrp.com/unirexx/index.html"&gt;uni-REXX&lt;/a&gt;, los que forman parte del sistema operativo como el venerable REXX clásico de &lt;a href="http://es.wikipedia.org/wiki/OS/2"&gt;OS/2&lt;/a&gt;, los "shareware" para una plataforma concreta como &lt;a href="http://www.jaxo.com/rexx"&gt;REXX para Palm OS&lt;/a&gt;, los gratuitos que incluyen una herramienta de desarrollo RAD como &lt;a href="http://www.borg.com/%7Ejglatt/rexx/rexxuser.htm"&gt;Reginald &lt;/a&gt;o los libres presentes virtualmente en todas las plataformas de software existentes como &lt;a href="http://regina-rexx.sourceforge.net/"&gt;Regina&lt;/a&gt;... Pero ocasionalmente el abanico se queda pequeño porque es necesario generar un ejecutable bien sea porque el programa en concreto lo requiere o porque nos interesa ocultar el código. Y en estos casos lo que necesitamos es lo que personalmente suelo denominar como &lt;span style="font-style: italic;"&gt;pseudocompilador&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Un pseudocompilador genera un ejecutable a partir de un &lt;span style="font-style: italic;"&gt;script&lt;/span&gt; REXX, pero en ningún caso lo hace traduciendo el código REXX a código máquina. Se limita a añadir el código de algún modo a la estructura del ejecutable generado y ese ejecutable se limita a usar las bibliotecas dinámicas de una implementación concreta de intérprete REXX para interpretar el código que lleva adjunto.&lt;br /&gt;&lt;br /&gt;Por poner un ejemplo sencillo, partamos de un programa que nos pide una cadena y la devuelve invertida contenido en un fichero "bucle.cmd" para OS/2:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  /* bucle.cmd */&lt;br /&gt;  signal on halt&lt;br /&gt;&lt;br /&gt;  do forever&lt;br /&gt;    call charout , 'Introduzca una cadena: '&lt;br /&gt;    parse pull cadena&lt;br /&gt;    say reverse(cadena)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  exit&lt;br /&gt;&lt;br /&gt;  halt: exit&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora podemos recurrir a uno de los pseudocompiladores REXX disponibles para OS/2 como los de Dennis Bareis (rexx2exe), Veit Kannegieser (REXX_EXE) o Mark Hessling (Rexx/Wrapper) para generar un ejecutable:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  [C:\home\salvador] rexx2exe bucle.cmd bucle.exe&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ya tenemos un ejecutable que está enlazado dinámicamente con la biblioteca dinámica que implementa el intérprete REXX en OS/2 (REXX.DLL). Es decir, el ejecutable &lt;span style="font-weight: bold;"&gt;depende&lt;/span&gt; del intérprete REXX del sistema y &lt;span style="font-weight: bold;"&gt;utiliza&lt;/span&gt; el intérprete para ejecutar el código que lleva dentro.&lt;br /&gt;&lt;br /&gt;La mayor parte de los pseudocompiladores permiten encriptar el código o &lt;span style="font-style: italic;"&gt;tokenizarlo&lt;/span&gt;, lo que representa una oportunidad estupenda de ocultar el código. De hecho, las cuatro herramientas de desarrollo gráfico RAD disponibles para OS/2 (VisPro/REXX, VX-REXX, GPF REXX y DrDialog) pueden considerarse pseudocompiladores puesto que hacen exactamente lo mismo que los mencionados anteriormente y hay cientos de programas populares &lt;span style="font-style: italic;"&gt;pseudocompilados&lt;/span&gt; para OS/2.&lt;br /&gt;&lt;br /&gt;La &lt;span style="font-style: italic;"&gt;tokenización&lt;/span&gt;, para aquellos de vosotros que hayais llegado hasta aquí que sintais algo de curiosidad es el proceso que realiza el intérprete REXX al pasar del código que escribe el programador a una representación intermedia que es lo que se ejecuta. La &lt;span style="font-style: italic;"&gt;tokenización&lt;/span&gt; inevitablemente oculta el código original y permite ejecutar el código &lt;span style="font-style: italic;"&gt;tokenizado&lt;/span&gt; sin problemas. Pero como el proceso de &lt;span style="font-style: italic;"&gt;tokenización&lt;/span&gt; es tremendamente dependiente del intérprete, al decirle a un pseudocompilador &lt;span style="font-style: italic;"&gt;tokenice&lt;/span&gt; el código nos encontramos con que el ejecutable generado en principio solamente funcionará con una versión concreta de un intérprete particular.&lt;br /&gt;&lt;br /&gt;(Incidentalmente: Regina incluye opciones para generar programas &lt;span style="font-style: italic;"&gt;tokenizados&lt;/span&gt; -no ejecutables- y ejecutarlos posteriormente y otro tanto podemos decir de IBM Object REXX y Open Object REXX.)&lt;br /&gt;&lt;br /&gt;Eso nos deja con la encriptación del código como modo de ocultarlo sin que el ejecutable quede inutilizable por un cambio de intérprete o versión del intérprete y con una impresión de seguridad que echa por tierra una característica del intérprete REXX de OS/2 (y algunos otros): la variable de entorno RXTRACE.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  [C:\home\salvador] rexx2exe bucle.cmd bucle.exe&lt;br /&gt;  []-------------------------------------------------------------------------[]&lt;br /&gt;  | REXX2EXE version 99.349 (C)opyright Dennis Bareis 1994                    |&lt;br /&gt;  | http://www.labyrinth.net.au/~dbareis/index.htm (dbareis@labyrinth.net.au) |&lt;br /&gt;  []-------------------------------------------------------------------------[]&lt;br /&gt;&lt;br /&gt;  CHECKING : bucle.cmd&lt;br /&gt;&lt;br /&gt;          * Rexx Source length 176 bytes&lt;br /&gt;          * Rexx Binary length 176 bytes&lt;br /&gt;&lt;br /&gt;          * Target EXE  length 27,618 bytes&lt;br /&gt;          * Target code will not run in OS/2 version 2.x&lt;br /&gt;          * Rexx code encrypted in target (Key=0xF772F1AC)&lt;br /&gt;          * Code can't be recovered&lt;br /&gt;  [C:\home\salvador] SET RXTRACE=ON&lt;br /&gt;&lt;br /&gt;  [C:\home\salvador] bucle.exe&lt;br /&gt;       2 *-*   Signal On halt;&lt;br /&gt;         +++   Interactive trace. "Trace Off" to end debug, ENTER to Continue.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¿Qué ha sucedido?&lt;br /&gt;&lt;br /&gt;La variable de entorno RXTRACE cuando tiene el valor "ON" tiene el efecto de añadir la sentencia TRACE '?R' al comienzo del cualquier programa REXX que ejecutemos en ese entorno. La instrucción TRACE es una de esas joyas del lenguaje REXX: es lo que activa el depurador del lenguaje que forma parte de todo intérprete en tiempo de ejecución.&lt;br /&gt;&lt;br /&gt;A partir de este momento podemos &lt;span style="font-style: italic;"&gt;inyectar&lt;/span&gt; código nuestro en la ejecución del ejecutable encriptado "bucle.exe". Pero puesto que tenemos la función sourceline que permite decirnos el contenido de una línea concreta de un &lt;span style="font-style: italic;"&gt;script&lt;/span&gt; REXX, podemos &lt;span style="font-style: italic;"&gt;inyectar&lt;/span&gt; lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  do i=1 to sourceline();call lineout "source.cmd",sourceline(i);end;exit&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ya tenemos todo el código encriptado sacado sin problemas del ejecutable. Cualquiera que hubiese leído esa pequeña joya que es el &lt;span style="font-style: italic;"&gt;REXX Tips &amp;amp; Tricks&lt;/span&gt; de Bernd Schemmer conocería este detalle y habría experimentado con buenos resultados con ejecutables generados con todos los pseudocompiladores para OS/2 (salvo VX-REXX) y algunos para otras plataformas.&lt;br /&gt;&lt;br /&gt;La solución es sencilla: añadir la sentencia "rc=trace('o')" como primera sentencia de nuestro programa para desactivar el rastreo del programa si se activa a través de la variable de entorno RXTRACE.&lt;br /&gt;&lt;br /&gt;Desafortunadamente en las herramientas de desarrollo RAD para OS/2 como VisPro/REXX, es difícil determinar cuál es la primera sentencia. De hecho, en este caso particular la primera sentencia NO es responsabilidad del programador, puesto que VisPro/REXX añade un bloque de código sobre el cual no tenemos control salvo que hagamos un parche binario sobre el ejecutable generado o sobre el pseudocompilador (el ejecutable BLDNTEST.EXE). Es una tarea sencilla que se deja como ejercicio al lector.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-1076690916069986971?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/1076690916069986971/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=1076690916069986971' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1076690916069986971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1076690916069986971'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/08/pseudocompiladores-rexx-la-instruccin.html' title='Pseudocompiladores REXX, la instrucción TRACE y la función SOURCELINE'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8774163155458391091.post-1219769331921080685</id><published>2007-08-29T22:34:00.000+02:00</published><updated>2007-08-29T22:56:27.954+02:00</updated><title type='text'>Un comienzo a 56k</title><content type='html'>Decían los geniales Les Luthiers que Johann Sebastian Mastropiero tras titular cierto famoso madrigal como&lt;span style="font-style: italic;"&gt; La bella y graciosa moza marchose a lavar la ropa&lt;/span&gt; consideró que la longitud no era la apropiada para un título así que le dio en nuevo título de &lt;span style="font-style: italic;"&gt;La bella y graciosa moza marchose a lavar la ropa, la mojó en el arroyuelo y cantando la lavó, la frotó sobre una piedra, la colgó de un abedul.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al abrir este blog me he encontrado en un dilema similar salvo por el detalle de que no soy tan decidido como Mastropiero y tras mucho cavilar, pensando que, después de todo, un nombre no importa tanto, he optado por una sugerencia de mi buena amiga Nerea (cuya paciencia deja a la de Job a la altura del betún)... que después de todo me recuerda aquel genial soneto de Quevedo.&lt;br /&gt;&lt;br /&gt;Esta tímida entrada, escrita al ritmo de los geniales compases de &lt;span style="font-style: italic;"&gt;Horizontes de grandeza&lt;/span&gt; de Jerome Moross,  tras una conexión de 56 k, con un navegador que renquea al renderizar texto en un campo de entrada, es solamente un comienzo de una serie de divagaciones que iré plasmando por aquí ocasionalmente acerca de mis intereses y aficiones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8774163155458391091-1219769331921080685?l=sparrac.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sparrac.blogspot.com/feeds/1219769331921080685/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8774163155458391091&amp;postID=1219769331921080685' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1219769331921080685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8774163155458391091/posts/default/1219769331921080685'/><link rel='alternate' type='text/html' href='http://sparrac.blogspot.com/2007/08/un-comienzo-56k.html' title='Un comienzo a 56k'/><author><name>Salvador Parra Camacho</name><uri>http://www.blogger.com/profile/06043187618736820735</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
