<?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-8898534484367942134</id><updated>2011-12-30T18:31:36.225+01:00</updated><category term='flash'/><category term='libgd'/><category term='KDE'/><category term='frei0r'/><category term='Cygwin'/><category term='PDF'/><category term='GIF'/><category term='RCX'/><category term='PNG'/><category term='ffmpeg'/><category term='Phyton'/><category term='paradojas'/><category term='awk'/><category term='MinGW'/><category term='Matemáticas'/><category term='blogger'/><category term='chapuza'/><category term='virus'/><category term='gráficos'/><category term='GoogleCL'/><category term='Ubuntu'/><category term='tele'/><category term='x264'/><category term='yasm'/><category term='patch'/><title type='text'>Desde la línea de comandos</title><subtitle type='html'>Sonido, gráficos, HTML, flash y video: casi todo se puede hacer desde la línea de comandos. (&lt;a href="http://translate.google.com/translate?prev=hp&amp;amp;hl=en&amp;amp;js=n&amp;amp;u=http%3A%2F%2Flineadecomandos.blogspot.com%2F&amp;amp;sl=es&amp;amp;tl=en"&gt;and in English too&lt;/a&gt;)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-3324283864093021477</id><published>2011-12-26T12:47:00.002+01:00</published><updated>2011-12-30T18:31:36.232+01:00</updated><title type='text'>Imprimir desde Android</title><content type='html'>Pues es muy difícil.&lt;br /&gt;Se nota que está pensado para teléfonos: lo único oficial que he encontrado que soporta el sistema operativo es una &lt;a href="http://developer.android.com/reference/android/util/Printer.html"&gt;API miserable para imprimir sólo texto&lt;/a&gt;.&lt;br /&gt;Me recuerda los tiempos antiguos del MS-DOS: las aplicaciones gestionan directamente la impresión, normalmente respondiendo a las acciones &lt;a href="http://developer.android.com/reference/android/widget/ShareActionProvider.html"&gt;"share"&lt;/a&gt; o "view".Así que, no habiendo API oficial, exigen partir de formatos conocidos: PDF, imágenes, o documentos de MS Office.&lt;br /&gt;&lt;br /&gt;En lugar de arreglar la API para poder usar Bluetooth, o los USB, para conectarse directamente con tu impresora, las fuerzas mayores proponen matar moscas a cañonazos: enviar por HTTPS o correo los documentos a Internet y que llegen a la impresora que tienes al lado (Google Print Cloud, HP ePrint).&lt;br /&gt;&lt;br /&gt;Hay otras soluciones (de pago):&lt;br /&gt;- &lt;a href="http://www.printershare.com/mobile.sdf"&gt;PrinterShare&lt;/a&gt; Puede usar Wifi o bluetooth si la impresora los soporta. Acepta DOC, DOCX, XLS, XLSX, PPT, PPTX, PDF, TXT.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Otros enlaces interesantes:&lt;br /&gt;&lt;a href="http://www.slideshare.net/wolfpaulus/android-print-intent-8431140&amp;amp;usg=AFQjCNHSJmXqzduGNhBNtHXq59hQ15Gfxg"&gt;PrintIntent API&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.cups.org/"&gt;CUPS&lt;/a&gt;&lt;br/&gt;&lt;a href="http://hplipopensource.com/hplip-web/index.html"&gt;HPLIP&lt;/a&gt;Android PDF Viewer basado en MuPDF library&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-3324283864093021477?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/3324283864093021477/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2011/12/imprimir-desde-android.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3324283864093021477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3324283864093021477'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2011/12/imprimir-desde-android.html' title='Imprimir desde Android'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4709153585000306651</id><published>2011-02-07T19:30:00.004+01:00</published><updated>2011-03-05T09:37:02.394+01:00</updated><title type='text'>Velocidad de conversión de vídeo DV a DVD</title><content type='html'>Una sencilla comparativa de velocidad: partir de un fichero de vídeo DV, convertirlo a DVD PAL, y anotar los fotogramas por segundo que nos reporta &lt;a href="http://ffmpeg.org/"&gt;ffmpeg&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg -threads 2 -i a.dv -target pal-dvd -y a.vob&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para exprimir nuestro procesador al máximo, hay que compilar ffmpeg con las optimizaciones de nuestra arquitectura (usar --cpu= en configure), y hay que ejecutarlo con tantas "threads" como núcleos tengamos.&lt;br /&gt;&lt;br /&gt;Tengo bastante variedad de CPUs a mi alcance, e iré completando esta tabla: &lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;caption&gt;Fotogramas por segundo&lt;/caption&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;CPU&lt;/th&gt;&lt;th align="right"&gt;GHz&lt;/th&gt;&lt;th align="right"&gt;cache K&lt;/th&gt;&lt;th&gt;--cpu=&lt;/th&gt;&lt;th&gt;-threads 1&lt;/th&gt;&lt;th&gt;-threads 2&lt;/th&gt;&lt;th&gt;-threads 3&lt;/th&gt;&lt;th&gt;-threads 4&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pentium-M&lt;/td&gt;&lt;td align="right"&gt;1.40&lt;/td&gt;&lt;td align="right"&gt;1024&lt;/td&gt;&lt;td&gt;pentium-m&lt;/td&gt;&lt;td align="right"&gt;38&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;Amd Neo K125&lt;/td&gt;&lt;td align="right"&gt;1.70&lt;/td&gt;&lt;td align="right"&gt;1024&lt;/td&gt; &lt;td&gt;amdfam10&lt;/td&gt;&lt;td align="right"&gt;42&lt;/td&gt;&lt;td align="right"&gt;42&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intel D830&lt;/td&gt;&lt;td align="right"&gt;3.00&lt;/td&gt;&lt;td align="right"&gt;2048&lt;/td&gt;&lt;td&gt;prescott&lt;/td&gt;&lt;td align="right"&gt;41&lt;/td&gt;&lt;td align="right"&gt;65&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intel E6400&lt;/td&gt; &lt;td align="right"&gt;2.13&lt;/td&gt;&lt;td align="right"&gt;2048&lt;/td&gt;&lt;td&gt;core2&lt;/td&gt;&lt;td align="right"&gt;85&lt;/td&gt;&lt;td align="right"&gt;119&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intel E5200&lt;/td&gt;&lt;td align="right"&gt;2.50&lt;/td&gt;&lt;td align="right"&gt;2048&lt;/td&gt;&lt;td&gt;core2&lt;/td&gt;&lt;td align="right"&gt;89&lt;/td&gt;&lt;td align="right"&gt;129&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;td align="right"&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intel Q8300&lt;/td&gt; &lt;td align="right"&gt;2.50&lt;/td&gt;&lt;td align="right"&gt;4096&lt;/td&gt;&lt;td&gt;core2&lt;/td&gt;&lt;td align="right"&gt;103&lt;/td&gt;&lt;td align="right"&gt;133&lt;/td&gt;&lt;td align="right"&gt;158&lt;/td&gt;&lt;td align="right"&gt;132&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intel i7 640LM&lt;/td&gt; &lt;td align="right"&gt;2.13&lt;/td&gt;&lt;td align="right"&gt;4096&lt;/td&gt;&lt;td&gt;core2&lt;/td&gt;&lt;td align="right"&gt;86&lt;/td&gt;&lt;td align="right"&gt;118&lt;/td&gt;&lt;td align="right"&gt;142&lt;/td&gt;&lt;td align="right"&gt;160&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Sorprenden los resultados de mi humilde Pentium-M. La posible explicación es que está corriendo sobre Ubuntu, y este test debe estar limitado por el ancho de banda del disco (los demás procesadores corren sobre Cygwin).&lt;br /&gt;&lt;br /&gt;También es curioso que el Q8300 funcione mejor con 3 threads que con 4. Posible caso de &lt;a href="http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29"&gt;cache trashing&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4709153585000306651?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4709153585000306651/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2011/02/velocidad-de-conversion-de-video-dv-dvd.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4709153585000306651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4709153585000306651'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2011/02/velocidad-de-conversion-de-video-dv-dvd.html' title='Velocidad de conversión de vídeo DV a DVD'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-2263857327474604011</id><published>2011-01-16T21:08:00.000+01:00</published><updated>2011-01-16T21:08:32.443+01:00</updated><title type='text'>Recortar y rellenar con FFMpeg</title><content type='html'>Vamos a usar los filtros &lt;code&gt;&lt;a href="http://www.ffmpeg.org/libavfilter.html#SEC15"&gt;crop&lt;/a&gt;&lt;/code&gt; y &lt;code&gt;&lt;a href="http://www.ffmpeg.org/libavfilter.html#SEC31"&gt;pad&lt;/a&gt;&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Para recortar a una imagen 8 píxeles por la izquierda, y 8 por la derecha:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg.exe  -i input.png -vf 'crop=in_w-16' output.png&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para rellenar con verde (R=69,G=94,B=18) 4 píxeles por la izquierda, y 4 por la derecha, si la imagen tiene 142 de ancho:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg -i input.png -vf 'pad=150:0:8:0:699418' output.png&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El filtro &lt;code&gt;crop&lt;/code&gt; permite referenciar variables que representan el ancho/alto de la imagen. El filtro &lt;code&gt;crop&lt;/code&gt; todavía no admite variables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-2263857327474604011?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/2263857327474604011/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2011/01/recortar-y-rellenar-con-ffmpeg.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2263857327474604011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2263857327474604011'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2011/01/recortar-y-rellenar-con-ffmpeg.html' title='Recortar y rellenar con FFMpeg'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-8917741703813692274</id><published>2010-12-09T16:48:00.000+01:00</published><updated>2010-12-09T16:48:52.045+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><title type='text'>Crear imágenes monocromas con FFMpeg</title><content type='html'>Al pensar en FFmpeg como el mejor conversor de multimedia, nos solemos olvidar de que, aparte de vídeo y audio, también maneja imágenes.&lt;br /&gt;&lt;br /&gt;En los sistemas Unix tenemos &lt;code&gt;/dev/zero&lt;/code&gt; que es una fuente de ceros. Sólo tenemos que darle un tamaño, y una profundidad de bits para tener una imagen de color negro:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;# Black image bgra PNG&lt;br /&gt;ffmpeg -vframes 1 -s 64x32 -pix_fmt rgb32 -f rawvideo -i /dev/zero -pix_fmt rgb32 black64x32.png&lt;br /&gt;# Black image rgb PNG&lt;br /&gt;ffmpeg -vframes 1 -s 64x32 -pix_fmt rgb24 -f rawvideo -i /dev/zero -pix_fmt rgb24 black64x32.png&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si queremos otros colores, la cosa se complica: hay que usar filtros (lo cual implica un ffmpeg muy reciente). Los pasos son leer cualquier imagen de partida, superponer el generador de colores, y escalar al tamaño deseado:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;# Gray image 50% transparent&lt;br /&gt;ffmpeg -i black64x32.png -vf 'color=gray@.5:64x32:25 [over]; [in][over] overlay [out]' -vf scale=640:200:rgba -pix_fmt rgb32 gray640x200.png&lt;br /&gt;# Gray image &lt;br /&gt;ffmpeg -i black64x32.png -vf 'color=gray:64x32:25 [over]; [in][over] overlay [out]' -vf scale=640:200:rgb24 -pix_fmt rgb24 gray640x200.png&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Recordad que, de todos los formatos de píxels que muestra &lt;code&gt;ffmpeg -pix_fmts&lt;/code&gt;, sólo &lt;code&gt;rgb32&lt;/code&gt; y &lt;code&gt;yuva420p&lt;/code&gt; permiten transparencia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-8917741703813692274?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/8917741703813692274/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/12/crear-imagenes-monocromas-con-ffmpeg.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8917741703813692274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8917741703813692274'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/12/crear-imagenes-monocromas-con-ffmpeg.html' title='Crear imágenes monocromas con FFMpeg'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-7071321646658529415</id><published>2010-10-10T01:20:00.000+02:00</published><updated>2010-10-10T01:20:47.896+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='frei0r'/><title type='text'>Compilar frei0r para Windows desde Cygwin</title><content type='html'>Vamos a compilar "fuera del árbol de código". Así podemos tener un directorio para cada compilación (uno para Cygwin, otro para MinGW32, otro para MinGW64)&lt;br /&gt;&lt;code&gt;mkdir frei0r-mingw32; cd frei0r-mingw32&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;Queremos compilación cruzada (de Cygwin a MingGW32), así que hay que especificar a CMake el compilador que queremos, dónde están los includes/libs de MinGW32, y dónde queremos instalar los binarios resultantes. El último parámetro es dónde está nuestro código fuente.&lt;br /&gt;&lt;br /&gt;Creamos los "makefiles"&lt;br /&gt;&lt;code&gt;CFLAGS=-march=core2 cmake \&lt;br /&gt;-D CMAKE_HOST_SYSTEM_NAME=Unix \&lt;br /&gt;-D CMAKE_SYSTEM_NAME=Windows \&lt;br /&gt;-D CMAKE_C_COMPILER=/usr/bin/i686-w64-mingw32-gcc.exe \&lt;br /&gt;-D CMAKE_CXX_COMPILER=/usr/bin/i686-w64-mingw32-g++.exe \&lt;br /&gt;-D CMAKE_FIND_ROOT_PATH=/usr/i686-w64-mingw32/sys-root/mingw/ \&lt;br /&gt;-D CMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32/sys-root/mingw/ \&lt;br /&gt;../frei0r-plugins-1.2/ &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Compilamos&lt;br /&gt;&lt;code&gt;make&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dejamos los módulos mondos y lirondos&lt;br /&gt;&lt;code&gt;/usr/bin/i686-w64-mingw32-strip src/*/*/*.dll &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Instalamos&lt;br /&gt;&lt;code&gt;make install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Copiamos el include&lt;br /&gt;&lt;code&gt;cp -p ../frei0r-plugins-1.2/include/frei0r.h  /usr/i686-w64-mingw32/sys-root/mingw/include &lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-7071321646658529415?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/7071321646658529415/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/10/compilar-frei0r-para-windows-desde.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7071321646658529415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7071321646658529415'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/10/compilar-frei0r-para-windows-desde.html' title='Compilar frei0r para Windows desde Cygwin'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-3189668866182822779</id><published>2010-10-07T17:58:00.000+02:00</published><updated>2010-10-07T17:58:46.944+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PNG'/><title type='text'>Comprimir PNG: pngnq y pngcrush</title><content type='html'>Las fotos se suelen guardar en JPEG porque ocupan menos que en PNG. Pero si queremos transparencia, hay que usar PNG.&lt;br /&gt;&lt;br /&gt;Podemos usar un requantizador, &lt;a href="http://pngnq.sourceforge.net/"&gt;pngnq&lt;/a&gt;, que pase de ARGB de 32 bits por píxel a un formato de paleta de 256 colores, con 8 bits por píxel.&lt;br /&gt;&lt;br /&gt;Y después intentar buscar cuál de los variados algoritmos de zlib compactan mejor el PNG, con &lt;a href="http://pmt.sourceforge.net/pngcrush/"&gt;pngcrush&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Todo junto queda:&lt;br /&gt;&lt;code&gt;pngnq -n 256 imagen.png &amp;amp;&amp;amp; pngcrush -brute imagen-nq8.png imagen_final.png&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-3189668866182822779?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/3189668866182822779/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/10/comprimir-png-pngnq-y-pngcrush.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3189668866182822779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3189668866182822779'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/10/comprimir-png-pngnq-y-pngcrush.html' title='Comprimir PNG: pngnq y pngcrush'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-2345123830987131694</id><published>2010-10-03T23:16:00.000+02:00</published><updated>2010-10-03T23:16:30.799+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chapuza'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>El soporte para la Intel 855GM va a peor en Ubuntu</title><content type='html'>Mi portátil empezó su singladura en Ubuntu en 8.04. Todo se instaló sin problemas.&lt;br /&gt;La actualización a 8.10 transcurrió sin novedad. Tras modernizarme a 9.10, &lt;a href="https://wiki.ubuntu.com/KarmicKoala/ReleaseNotes#No%20Xv%20support%20for%20Intel%2082852/855GM%20video%20chips%20with%20KMS"&gt;la aceleración de vídeo dejó de funcionar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Acabo de actualizar a 10.04, y el soporte para mi tarjeta gráfica ha ido todavía, a peor: &lt;a href="https://wiki.ubuntu.com/LucidLynx/ReleaseNotes#Intel%208xx%20X%20freezes/crashes"&gt;ni siquiera arranca&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sí, hay ñapas para sobrevivir a ambos fallos, pero la gente instala Ubuntu por su facilidad de uso, es muy&amp;nbsp; raro que se lean las "Release Notes" (yo, desde luego, las leo sólo cuando todo falla).&lt;br /&gt;&lt;br /&gt;Está claro que la prioridad de los programadores de Intel es sabotear tarjetas antiguas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-2345123830987131694?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/2345123830987131694/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/10/el-soporte-para-la-intel-855gm-va-peor.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2345123830987131694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2345123830987131694'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/10/el-soporte-para-la-intel-855gm-va-peor.html' title='El soporte para la Intel 855GM va a peor en Ubuntu'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-1221175156128749422</id><published>2010-09-26T01:39:00.002+02:00</published><updated>2010-10-09T17:48:16.164+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='frei0r'/><title type='text'>Compilar frei0r</title><content type='html'>&lt;a href="http://piksel.org/frei0r"&gt;&amp;nbsp;frei0r&lt;/a&gt; es un conjunto de filtros de vídeo. Efectos visuales y tal.&lt;br /&gt;&lt;br /&gt;Para compilarlo en Cygwin, necesitaremos los paquetes &lt;code&gt;gcc4-core, gcc4-g++, cmake&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Nos bajamos el código fuente, y lo desempaquetamos:&lt;br /&gt;&lt;code&gt;wget http://www.piksel.no/frei0r/frei0r-plugins-1.2.tar.gz&lt;br /&gt;tar xvf frei0r-plugins-1.2.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Se puede construir usando &lt;a href="http://en.wikipedia.org/wiki/GNU_build_system"&gt;GNU autotools&lt;/a&gt; &lt;code&gt;( ./configure &amp;amp;&amp;amp; make )&lt;/code&gt; or &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt; &lt;code&gt;( cmake . &amp;amp;&amp;amp; make )&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;Usamos CMake. El primer problema es que la versión del paquete cmake de Cygwin es 2.6, así que cambio la primera línea de CMakeLists.txt a esto:&lt;br /&gt;&lt;code&gt;cmake_minimum_required (VERSION 2.6)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Construímos los "makefiles":&lt;br /&gt;&lt;code&gt;CFLAGS=-march=core2 cmake .&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y a compilar. Como tengo un Core2, pues lo aprovechamos:&lt;br /&gt;&lt;code&gt;make -j 2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para instalarlo:&lt;br /&gt;&lt;code&gt;make install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y, como se han olvidado, también:&lt;br /&gt;&lt;code&gt;cp -p include/frei0r.h /usr/local/include/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Desde el 24-sep-2010, (SVN r25165), &lt;a href="http://www.ffmpeg.org/"&gt;ffmpeg&lt;/a&gt; permite usar filtros de &lt;a href="http://piksel.org/frei0r"&gt;frei0r&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para construir ffmpeg con soporte para frei0r:&lt;br /&gt;&lt;code&gt;./configure --enable-frei0r &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Antes de usar los filtros, conviene avisar dónde están:&lt;br /&gt;&lt;code&gt;FREI0R_PATH=/usr/local/lib/frei0r-1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo de uso de un filtro:&lt;br /&gt;&lt;code&gt;./ffmpeg -i in.avi -vf "frei0r=water.dll:3.0:y:y:y:y:y:y" -y out.avi&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-1221175156128749422?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/1221175156128749422/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/compilar-frei0r.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/1221175156128749422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/1221175156128749422'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/compilar-frei0r.html' title='Compilar frei0r'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-508024934668702751</id><published>2010-09-19T00:45:00.003+02:00</published><updated>2011-01-10T22:54:53.422+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><title type='text'>Compilar para Windows desde Cygwin (IV)</title><content type='html'>Ya están disponibles en &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt; los paquetes para compilación cruzada preparados por el projecto &lt;a href="http://mingw-w64.sourceforge.net/"&gt;MinGW-w64&lt;/a&gt;, que generan código para Windows de 32 y de 64 bits.&lt;br /&gt;&lt;br /&gt;Si queremos compilar &lt;a href="http://ffmpeg.org"&gt;ffmpeg&lt;/a&gt; para Windows de 32 bits, nos bajamos los paquetes:&lt;br /&gt;&lt;code&gt;mingw64-i686-binutils, mingw64-i686-gcc-core, mingw64-i686-headers, mingw64-i686-pthreads, mingw64-i686-runtime&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;La invocación de configure queda así:&lt;br /&gt;&lt;code&gt;./configure --enable-memalign-hack --arch=x86 --target-os=mingw32 --enable-cross-compile --cross-prefix=i686-w64-mingw32- --disable-shared --enable-static --disable-dxva2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si queremos compilar &lt;a href="http://ffmpeg.org"&gt;ffmpeg&lt;/a&gt; para Windows de 64 bits, nos bajamos los paquetes:&lt;br /&gt;&lt;code&gt;mingw64-x86_64-binutils, mingw64-x86_64-gcc-core, mingw64-x86_64-headers, mingw64-x86_64-pthreads, mingw64-x86_64-runtime&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;La invocación de configure es ahora:&lt;br /&gt;&lt;code&gt;./configure --arch=x86_64 --target-os=mingw32 --enable-cross-compile --cross-prefix=x86_64-w64-mingw32- --disable-shared --enable-static --disable-dxva2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo de &lt;code&gt;--disable-dxva2&lt;/code&gt; es porque no uso la aceleración &lt;a href="http://en.wikipedia.org/wiki/DirectX_Video_Acceleration"&gt;DXVA2&lt;/a&gt; al decodificar &lt;a href="http://en.wikipedia.org/wiki/H264"&gt;h264&lt;/a&gt;.&lt;br /&gt;DXVA 2.0 necesita Vista como mínimo (-D_WIN32_WINNT=0x0600), y activar las macros para que C maneje los objetos que normalmente se acceden desde C++ (-DCOBJMACROS), así que, si la queréis, usad &lt;code&gt;--extra-cflags='-DCOBJMACROS -D_WIN32_WINNT=0x0600'&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-508024934668702751?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/508024934668702751/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/compilar-para-windows-desde-cygwin-iv.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/508024934668702751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/508024934668702751'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/compilar-para-windows-desde-cygwin-iv.html' title='Compilar para Windows desde Cygwin (IV)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6130420934036168282</id><published>2010-09-11T00:10:00.004+02:00</published><updated>2010-09-11T00:45:04.979+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chapuza'/><title type='text'>Ojo con el punto y la coma</title><content type='html'>Los anglosajones usan el punto para separar decimales. Los españoles usamos la coma.&lt;br /&gt;De vez en cuando, hay algún programa (suelen ser los que importan datos en &lt;a href="http://es.wikipedia.org/wiki/CSV"&gt;CSV&lt;/a&gt;) que pide ir al Panel de Control y cambiar el separador de decimales de coma a punto.&lt;br /&gt;&lt;br /&gt;Ojo, porque este acto, en apariencia inocente, confunde de mala manera a algunos programas escritos chapuceramente. Por ejemplo, al Administrador de Tareas de Vista:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y76DxN3V0g4/TIqr4CqwevI/AAAAAAAAADI/tzJyoUFqUbw/s1600/comapunto2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="259" src="http://1.bp.blogspot.com/_y76DxN3V0g4/TIqr4CqwevI/AAAAAAAAADI/tzJyoUFqUbw/s640/comapunto2.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;A la izquierda el separador de decimales es coma, y a la derecha es punto&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;O igual es que así los programas consumen mil veces menos memoria ...&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: right;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6130420934036168282?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6130420934036168282/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/ojo-con-el-punto-y-la-coma.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6130420934036168282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6130420934036168282'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/ojo-con-el-punto-y-la-coma.html' title='Ojo con el punto y la coma'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_y76DxN3V0g4/TIqr4CqwevI/AAAAAAAAADI/tzJyoUFqUbw/s72-c/comapunto2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-7569270444570791137</id><published>2010-09-03T22:50:00.010+02:00</published><updated>2010-09-03T23:19:53.161+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Mostrar entradas recientes</title><content type='html'>Encontré un &lt;a href="http://www.bloggersentral.com/2010/08/using-customnonstandard-fonts-with.html"&gt;JavaScript que muestra las entradas más recientes de una categoría&lt;/a&gt;:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;function recentpostslist(json) {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;document.write('&amp;lt;ul&amp;gt;');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;for (var i = 0; i &amp;lt; json.feed.entry.length; i++)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var j = 0; j &amp;lt; json.feed.entry[i].link.length; j++) {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (json.feed.entry[i].link[j].rel == 'alternate') {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var entryUrl = "'" + json.feed.entry[i].link[j].href + "'";//bs&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var entryTitle = json.feed.entry[i].title.$t;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var item = "&amp;lt;li&amp;gt;" + "&amp;lt;a href="+ entryUrl + '" target="_blank"&amp;gt;' + entryTitle + "&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt;";&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;document.write(item);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;document.write('&amp;lt;/ul&amp;gt;');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;script src="http://lineadecomandos.blogspot.com/feeds/posts/summary/-/awk?max-results=999&amp;amp;amp;alt=json-in-script&amp;amp;amp;callback=recentpostslist"&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Este código se puede usar dentro de una entrada (decid al editor que muestre HTML literalmente). Por ejemplo, aquí listo mis entradas sobre awk:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;function recentpostslist(json) { document.write('&lt;ul&gt;'); for (var i = 0; i &lt; json.feed.entry.length; i++) {    for (var j = 0; j &lt; json.feed.entry[i].link.length; j++) {      if (json.feed.entry[i].link[j].rel == 'alternate') {        break;      }    }var entryUrl = "'" + json.feed.entry[i].link[j].href + "'";//bsvar entryTitle = json.feed.entry[i].title.$t;var item = "&lt;li&gt;" + "&lt;a href="+ entryUrl + '" target="_blank"&gt;' + entryTitle + "&lt;/a&gt; &lt;/li&gt;"; document.write(item); } document.write('&lt;/ul&gt;'); }&lt;/script&gt;&lt;br /&gt;&lt;script src="http://lineadecomandos.blogspot.com/feeds/posts/summary/-/awk?max-results=999&amp;amp;alt=json-in-script&amp;amp;callback=recentpostslist"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;También se puede poner en un gadget HTML/Javascript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-7569270444570791137?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/7569270444570791137/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/mostrar-entradas-recientes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7569270444570791137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7569270444570791137'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/09/mostrar-entradas-recientes.html' title='Mostrar entradas recientes'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-8501048179275194349</id><published>2010-06-19T22:39:00.002+02:00</published><updated>2010-06-19T22:46:57.068+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Phyton'/><category scheme='http://www.blogger.com/atom/ns#' term='GoogleCL'/><title type='text'>Google admite comandos</title><content type='html'>Google ha tenido a bien crear &lt;a href="http://google-opensource.blogspot.com/2010/06/introducing-google-command-line-tool.html"&gt;googleCL&lt;/a&gt;, un script en Phyton para acceder a la funcionalidad de Blogger, Picassa, Calendar, Docs, Youtube.&lt;br /&gt;&lt;br /&gt;Lo he probado desde mi Ubuntu 9.10, creando la primera línea de esta entrada:&lt;br /&gt;&lt;code&gt;google blogger post --tags "GoogleCL, Phyton" --title "Google admite comandos" "Google ha tenido a bien crear un script en Phyton para acceder a la funcionalidad de Blogger, Picassa, Calendar, Docs, Youtube."&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tras pulsar enter, te pregunta el nombre de tu cuenta en Google, y te devuelve un URL para que lo valides desde tu navegador.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-8501048179275194349?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/8501048179275194349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/06/google-admite-comandos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8501048179275194349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8501048179275194349'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/06/google-admite-comandos.html' title='Google admite comandos'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-5581505075088858089</id><published>2010-04-23T10:33:00.002+02:00</published><updated>2010-04-23T11:12:12.289+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><title type='text'>Cygwin es lento (I)</title><content type='html'>Pero mucho, mucho.&lt;br /&gt;&lt;br /&gt;Lo más lento es ejecutar los &lt;span style="font-style: italic;"&gt;configure&lt;/span&gt;, que en Unix tardan segundos y en Cygwin minutos.&lt;br /&gt;La razón es la lentísima creación de processos (spawing) en Cygwin.&lt;br /&gt;&lt;br /&gt;Por ejemplo, el &lt;span style="font-style: italic;"&gt;configure &lt;/span&gt;de FFmpeg.&lt;br /&gt;&lt;br /&gt;Primero creamos un entorno óptimo, eliminando los directorios innecesarios de PATH:&lt;br /&gt;&lt;code&gt;export TMPDIR=/tmp&lt;br /&gt;export TEMP=/tmp&lt;br /&gt;export TMP=/tmp&lt;br /&gt;export PATH=/usr/local/bin:/usr/bin:/bin&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esta es mi invocación habitual de &lt;span style="font-style: italic;"&gt;configure&lt;/span&gt;:&lt;br /&gt;&lt;code&gt;time ksh ./configure --disable-shared --enable-static --enable-gpl --enable-avfilter --enable-avfilter-lavf --enable-pthreads --enable-avisynth --enable-bzlib --enable-libmp3lame --enable-libx264 --cc=gcc443 --cpu=core2 --enable-zlib --extra-cflags=-DX_DISPLAY_MISSING&lt;br /&gt;&lt;br /&gt;real    2m24.004s&lt;br /&gt;user    0m15.938s&lt;br /&gt;sys     0m41.157s&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La cuenta no sale: 2m24s -15s -42s = 86 segundos sin currar.&lt;br /&gt;&lt;br /&gt;Primer intento de mejorarlo: evitar las &lt;a href="http://msdn.microsoft.com/en-us/magazine/bb985014.aspx"&gt;reubicaciones de las DLLs&lt;/a&gt;.&lt;br /&gt;Para ello, invocamos la línea de comandos de Windows (&lt;span style="font-style: italic;"&gt;cmd.exe&lt;/span&gt;), vamos al directorio de los binarios de Cygwin, invocamos &lt;span style="font-style: italic;"&gt;dash&lt;/span&gt;, y lanzamos &lt;span style="font-style: italic;"&gt;rebaseall&lt;/span&gt;:&lt;br /&gt;&lt;code&gt;cd c:\cygwin\bin&lt;br /&gt;dash&lt;br /&gt;./rebaseall&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Volvemos a invocar el &lt;span style="font-style: italic;"&gt;configure &lt;/span&gt;de FFmpeg y nos da:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;real    2m20.758s&lt;br /&gt;user    0m15.713s&lt;br /&gt;sys     0m42.660s&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Bueno, hemos ganado 4 segundos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-5581505075088858089?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/5581505075088858089/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2010/04/cygwin-es-lento-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5581505075088858089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5581505075088858089'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2010/04/cygwin-es-lento-i.html' title='Cygwin es lento (I)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6604566986448977936</id><published>2010-03-13T00:34:00.000+01:00</published><updated>2010-03-13T13:06:02.177+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='tele'/><title type='text'>Mi tele lee multimedia (II)</title><content type='html'>Para las pruebas, necesito material HD, por ejemplo &lt;a href="http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov"&gt;Big Buck Bunny&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nos lo traemos:&lt;br /&gt;&lt;code&gt;wget http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov bbb.mov&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;FFmpeg nos dice:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg -i bbb.mov&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Atentos a que partimos de sonido envolvente: los 6 canales de audio.&lt;br /&gt;&lt;br /&gt;Convertiremos un trocito, por ejemplo 3 segundos, que a 24 cuadros por segundo, son 72 cuadros.&lt;br /&gt;&lt;br /&gt;Empezamos a probar conversiones.&lt;br /&gt;&lt;br /&gt;a) &lt;span style="font-weight: bold;"&gt;Calidad HD&lt;/span&gt;.&lt;br /&gt;Los codecs H.264 / AAC encajan con lo que la tele puede leer. El contenedor .mov es un dialecto de .mp4, así que basta con cambiar la extensión de fichero.&lt;br /&gt;&lt;br /&gt;Si queremos coger un trocito:&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec copy -acodec copy bbb_9300.mp4&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La tele muestra bbb_9300.mp4 correctamente.&lt;br /&gt;&lt;br /&gt;Si los codecs no hubieran coincidido:&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec libx264 -fpre normal -crf 22 -acodec libfaac -ab 192k bbb_9300.mp4&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b) &lt;span style="font-weight: bold;"&gt;Calidad DVD&lt;/span&gt;.&lt;br /&gt;La tele es 16:9, y Big Buck Bunny también, así que mejor usar "-aspect 16:9". Dotaremos de 8000kb/s al vídeo (los DVDs comerciales suelen quedarse en 6000kb/s).&lt;br /&gt;&lt;br /&gt;Preparamos las tres variantes de audio.&lt;br /&gt;&lt;br /&gt;b1) MPEG layer 2 (sólo estéreo)&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -target pal-dvd -aspect 16:9 -b 8000k -ac 2 -acodec mp2 bbb_8000_mp2.vob&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b2) LPCM, forzando audio estéreo.&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -target pal-dvd -aspect 16:9 -b 8000k -ac 2 -acodec pcm_s16be bbb_8000_lpcm.vob&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;b3) AC3, preservando los 6 canales.&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -target pal-dvd -aspect 16:9 -b 8000k -acodec pcm_s16be bbb_8000_lpcm.vob&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La tele los muestra correctamente.&lt;br /&gt;&lt;br /&gt;c) &lt;span style="font-weight: bold;"&gt;Calidad AVI&lt;/span&gt;.&lt;br /&gt;Mi tele no necesita la marca "-vtag DX50" que algunos reproductores requieren en Windows.&lt;br /&gt;&lt;br /&gt;Preparamos las tres variantes de audio.&lt;br /&gt;&lt;br /&gt;c1) MPEG layer 2 (sólo estéreo)&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec mpeg4 -s 720x576 -aspect 16:9 -b 8000k -ac 2 -acodec mp2 -ab 192k bbb_8000_mp2.avi&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;c2) MPEG layer 3 (sólo estéreo)&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec mpeg4 -s 720x576 -aspect 16:9 -b 8000k -ac 2 -acodec libmp3lame -ab 128k bbb_8000_mp3.avi&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;c3) AC3, preservando los 6 canales.&lt;br /&gt;&lt;code&gt;ffmpeg -ss 13 -vframes 72 -i bbb.mov -vcodec mpeg4 -s 720x576 -aspect 16:9 -b 8000k -acodec ac3 -ab 384k bbb_8000_ac3.avi&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La tele los muestra correctamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusión:&lt;/span&gt;&lt;br /&gt;La tele da bastante de sí: muy pocos reproductores de salón soportan 8000kb/s en MPEG4. Y menos aún, H.264/AAC.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Líneas de investigación:&lt;/span&gt;&lt;br /&gt;El fichero de partida tiene 23.97 fps (FILM). Hay que ver si la tele soporta 29.97fps (NTSC) y 25fps (PAL).&lt;br /&gt;Lo más probable es que sí, pero he notado que el movimiento con 23.97fps es a saltitos, no es suave.&lt;br /&gt;&lt;br /&gt;Hay que probar con distintos tamaños. En AVI he visto que 720x432, 704x298, 640x272, 720x400, 640x480 van bien.&lt;br /&gt;&lt;br /&gt;Hay que probar si traga tal cual el .mp4 de YouTube HD (1280x720, 640×360).&lt;br /&gt;&lt;br /&gt;El fabricante dice que la tele lee particiones FAT16, FAT32 y NTFS. Leer NTFS es inusual, así que hay que refrendrarlo con una pruebecilla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6604566986448977936?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6604566986448977936/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/12/mi-tele-lee-multimedia-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6604566986448977936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6604566986448977936'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/12/mi-tele-lee-multimedia-ii.html' title='Mi tele lee multimedia (II)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-5287449986743311861</id><published>2009-12-27T13:14:00.007+01:00</published><updated>2009-12-31T15:22:27.190+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='tele'/><title type='text'>Mi tele lee multimedia</title><content type='html'>Como &lt;a href="http://www.p4c.philips.com/cgi-bin/dcbint/faqview?scy=ES&amp;amp;subrequest=1&amp;amp;mid=Link_FAQs&amp;amp;new_tmpl=1&amp;amp;view=aa12_view_full.html&amp;amp;desc=Philips+TV+LCD+42PFL5604H+Televisor+digital+Full+HD+1080p+de+42%22+con+Pixel+Plus+HD&amp;amp;session=20091227070058_89.130.101.221&amp;amp;list=aa12_list_partial.html&amp;amp;slg=ESP&amp;amp;refnr=0074893&amp;amp;refdisplay=MTV_LCD_E_TV543_QAC_74893&amp;amp;dct=QAC&amp;amp;ctn=42PFL5604H/12"&gt;indica su fabricante&lt;/a&gt;, mi tele lee estos formatos:&lt;br /&gt;&lt;table border="1"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Extensión&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Vídeo&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Tamaño&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Kilobits/s&lt;/th&gt;&lt;br /&gt;&lt;th&gt;Audio&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;.avi&lt;/td&gt;&lt;br /&gt;&lt;td&gt;MPEG-4 SP&lt;br /&gt;MPEG-4 ASP&lt;/td&gt;&lt;br /&gt;&lt;td&gt;352×288&lt;br /&gt;720×576&lt;/td&gt;&lt;br /&gt;&lt;td&gt;384&lt;br /&gt;8000&lt;/td&gt;&lt;br /&gt;&lt;td&gt;MPEG layer 2/3&lt;br /&gt;AC3&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;.mpg&lt;br /&gt;.mpeg&lt;br /&gt;.vob&lt;/td&gt;&lt;br /&gt;&lt;td&gt;MPEG-1&lt;br /&gt;MPEG-2&lt;/td&gt;&lt;br /&gt;&lt;td&gt;352×288&lt;br /&gt;720×576&lt;/td&gt;&lt;br /&gt;&lt;td&gt;1500&lt;br /&gt;9800&lt;/td&gt;&lt;br /&gt;&lt;td&gt;MPEG layer 2&lt;br /&gt;LPCM&lt;br /&gt;AC3&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;.mp4&lt;/td&gt;&lt;br /&gt;&lt;td&gt;H.264, L2-CIF&lt;br /&gt;H.264, L4-HD&lt;/td&gt;&lt;br /&gt;&lt;td&gt;352×288&lt;br /&gt;1920×1080&lt;/td&gt;&lt;br /&gt;&lt;td&gt;2000&lt;br /&gt;20000&lt;/td&gt;&lt;br /&gt;&lt;td&gt;AAC-LC&lt;br /&gt;AAC-LC&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Los tamaños y tasas de bits los he mirado en &lt;a href="http://www.m4if.org/resources/profiles/index.php"&gt;MPEG-4&lt;/a&gt;, y &lt;a href="http://en.wikipedia.org/wiki/H.264#Profiles"&gt;H.264&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Me falta hacer una chuleta con las opciones que hay que pasar a FFmpeg para generar estos formatos.&lt;br /&gt;&lt;br /&gt;Y probarlos, claro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-5287449986743311861?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/5287449986743311861/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/12/mi-tele-lee-multimedia.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5287449986743311861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5287449986743311861'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/12/mi-tele-lee-multimedia.html' title='Mi tele lee multimedia'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-3603744621301398391</id><published>2009-12-18T16:49:00.003+01:00</published><updated>2009-12-18T17:10:22.376+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RCX'/><title type='text'>RCX</title><content type='html'>Tras profunda exploración del trastero, he re-encontrado mi &lt;a href="http://www.peeron.com/inv/sets/9747-1"&gt;Robotics Invention System 1.5&lt;/a&gt;.&lt;br /&gt;Dentro de esta caja, está el &lt;a href="http://graphics.stanford.edu/~kekoa/rcx/"&gt;RCX&lt;/a&gt;, que es un "ladrillo" amarillo que aloja un microcontrolador con sensores y salidas.&lt;br /&gt;&lt;br /&gt;Fue mi regalo de cumpleaños del 2000 o 2001 y me he llevado la desagradable sorpresa de que Lego quitó todas la referencias de su web oficial allá por 2008.&lt;br /&gt;&lt;br /&gt;Así que he tenido que ir escarbando:&lt;br /&gt;&lt;br /&gt;http://brickos.sourceforge.net/index.html&lt;br /&gt;&lt;br /&gt;http://www.mapageweb.umontreal.ca/cousined/lego/&lt;br /&gt;&lt;br /&gt;http://www.crynwr.com/lego-robotics/&lt;br /&gt;&lt;br /&gt;El RCX se comunica por infrarrojos, pero se habla con los PC a través de una cajita intermedia unida por el puerto serie. El &lt;a href="http://www.faqs.org/docs/Linux-HOWTO/Infrared-HOWTO.html#infrared-howto-c-lego-mindstorm"&gt;puerto infrarrojo de muchos portátiles no vale&lt;/a&gt;, porque Lego usa un protocolo rarito.&lt;br /&gt;&lt;br /&gt;Los que tengan un Palm, sí que pueden &lt;a href="http://www.harbaum.org/till/palm/pbrick/"&gt;comunicarse por infrarrojos con el RCX&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-3603744621301398391?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/3603744621301398391/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/12/rcx.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3603744621301398391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3603744621301398391'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/12/rcx.html' title='RCX'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-5257682365025224297</id><published>2009-10-25T01:28:00.007+02:00</published><updated>2009-10-26T19:46:44.425+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Compilar para Windows desde Ubuntu (II)</title><content type='html'>En vez de traernos los ejecutables necesarios para la compilación cruzada, podemos traernos los fuentes, y compilarlos.&lt;br /&gt;La ventaja es que podemos tener la última versión, y compilarlos para exactamente la CPU que tengamos (en mi caso, &lt;code&gt;CFLAGS=-march=pentium-m&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;Adaptado de la &lt;a href="http://thread.gmane.org/gmane.comp.video.ffmpeg.user/23628"&gt;receta de Ramiro&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nos instalamos algunas dependencias de gcc:&lt;br /&gt;&lt;code&gt;sudo apt-get install flex bison&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Algunas dependencias de FFmpeg.&lt;br /&gt;&lt;code&gt;sudo apt-get install texinfo yasm subversion&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y un entorno para poder testear los ejecutables de Windows, sin salir de Linux:&lt;br /&gt;&lt;code&gt;sudo apt-get install wine&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Nos preparamos un directorio para bajarnos y compilar el código fuente:&lt;br /&gt;&lt;code&gt;cd "$HOME"&lt;br /&gt;mkdir src&lt;br /&gt;export BASE_PATH="$HOME/src"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Traemos estos ficheros, y los dejamos en el directorio $BASE_PATH:&lt;br /&gt;&lt;code&gt;binutils-2.20.tar.bz2&lt;br /&gt;gcc-core-4.2.4.tar.bz2&lt;br /&gt;mingwrt-3.16-mingw32-dev.tar.gz (from http://sourceforge.net/projects/mingw/files/ under "MinGW Runtime")&lt;br /&gt;w32api-3.13-mingw32-dev.tar.gz (from same site as above under "MinGW API for MS-Windows")&lt;br /&gt;zlib-1.2.3.tar.gz (from http://prdownloads.sourceforge.net/libpng/ )&lt;br /&gt;bzip2-1.0.5.tar.gz (from http://bzip.org/downloads.html )&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;El compilador cruzado lo instalamos en &lt;code&gt;/usr&lt;/code&gt;. Pondrá su cosillas en &lt;code&gt;/usr/bin/i686-mingw32*&lt;/code&gt;, sin machacar las del compilador nativo de Ubuntu (que son &lt;code&gt;/usr/bin/i486-linux-gnu*&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;Importante:&lt;br /&gt;&lt;code&gt;sudo ln -s /usr/i686-mingw32 /mingw&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;binutils:&lt;br /&gt;&lt;code&gt;cd "$BASE_PATH"&lt;br /&gt;tar xfvj binutils-2.20.tar.bz2&lt;br /&gt;cd binutils-2.20&lt;br /&gt;mkdir build&lt;br /&gt;cd build&lt;br /&gt;../configure --target=i686-mingw32 --disable-werror --disable-nls --prefix=/usr&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;"runtime" de MinGW:&lt;br /&gt;&lt;code&gt;cd "$BASE_PATH"&lt;br /&gt;sudo tar zxfv mingwrt-3.16-mingw32-dev.tar.gz -C /mingw&lt;br /&gt;sudo tar zxfv w32api-3.13-mingw32-dev.tar.gz -C /mingw&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;compilador de C:&lt;br /&gt;&lt;code&gt;cd "$BASE_PATH"&lt;br /&gt;tar xfvj gcc-core-4.2.4.tar.bz2&lt;br /&gt;cd gcc-4.2.4&lt;br /&gt;mkdir build&lt;br /&gt;cd build&lt;br /&gt;CFLAGS=-march=pentium-m ../configure --target=i686-mingw32 --disable-nls --prefix=/usr&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En los entornos GNU, la manera de indicar que queremos usar compilación cruzada, en vez de nativa, es a través de las variables de entorno:&lt;br /&gt;&lt;code&gt;RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Compilamos para MinGW algunas bibliotecas de funciones:&lt;br /&gt;&lt;br /&gt;zlib:&lt;br /&gt;&lt;code&gt;cd $BASE_PATH&lt;br /&gt;tar zxfv zlib-1.2.3.tar.gz &lt;br /&gt;cd zlib-1.2.3&lt;br /&gt;CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR="i686-mingw32-ar rc" CC=i686-mingw32-gcc ./configure --prefix=/mingw&lt;br /&gt;make&lt;br /&gt;sudo make install &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;bzip2:&lt;br /&gt;&lt;code&gt;cd "$BASE_PATH"&lt;br /&gt;tar zxfv bzip2-1.0.5.tar.gz&lt;br /&gt;cd bzip2-1.0.5&lt;br /&gt;make libbz2.a CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc&lt;br /&gt;sudo cp bzlib.h /mingw/include/&lt;br /&gt;sudo cp libbz2.a /mingw/lib/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y con esto ya podemos compilar un FFmpeg para MinGW. Aquí la compilación cruzada se indica con &lt;code&gt;--cross-prefix=i686-mingw32- --target-os=mingw32&lt;/code&gt; y la CPU con &lt;code&gt;--arch=pentium-m --cpu=pentium-m&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;cd "$BASE_PATH"&lt;br /&gt;mkdir ffmpeg&lt;br /&gt;cd ffmpeg&lt;br /&gt;svn co svn://svn.ffmpeg.org/ffmpeg/trunk svn&lt;br /&gt;mkdir build-win32&lt;br /&gt;cd build-win32&lt;br /&gt;../svn/configure --enable-memalign-hack --cross-prefix=i686-mingw32- --target-os=mingw32 --arch=pentium-m --cpu=pentium-m&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y os preguntaréis, ¿por qué no compilar para MinGW desde MinGW?. Pues porque es más lento. Pero no un poco, sino algo exagerado: diez veces más lento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-5257682365025224297?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/5257682365025224297/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/10/compilar-para-windows-desde-ubuntu-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5257682365025224297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5257682365025224297'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/10/compilar-para-windows-desde-ubuntu-ii.html' title='Compilar para Windows desde Ubuntu (II)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4700790447392273884</id><published>2009-10-20T21:18:00.006+02:00</published><updated>2009-10-25T00:09:11.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Compilar para Windows desde Ubuntu (I)</title><content type='html'>Tres pasos para crear un entorno en Ubuntu que nos permita compilar para Windows.&lt;br /&gt;&lt;br /&gt;Nos traemos el paquete básico para compilar:&lt;br /&gt;&lt;code&gt;sudo apt-get install build-essential&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El compilador cruzado, binutils y el "runtime":&lt;br /&gt;&lt;code&gt;sudo apt-get install mingw32 mingw32-binutils mingw32-runtime&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y un entorno para poder testear los ejecutables que compilemos:&lt;br /&gt;&lt;code&gt;sudo apt-get install wine&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Podemos intentar compilar FFmpeg:&lt;br /&gt;&lt;code&gt;configure --enable-memalign-hack --cross-prefix=i586-mingw32msvc- --target-os=mingw32 --arch=i686 --cpu=i686&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pero nos da este error:&lt;br /&gt;&lt;code&gt;ERROR: MinGW runtime version must be &gt;= 3.15.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Es que en Ubuntu 9.04 las versiones de los paquetes de compilación cruzada a MinGW son algo antiguas:&lt;br /&gt;&lt;code&gt;dpkg -s mingw32 mingw32-binutils mingw32-runtime |fgrep Version&lt;br /&gt;Version: 4.2.1.dfsg-1ubuntu1&lt;br /&gt;Version: 2.18.50-20080109-1&lt;br /&gt;Version: 3.13-1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;FFmpeg tiene la costumbre de exigir la última versión de sus dependencias, con otros programas estos paquetes de Ubuntu nos podrían valer perfectamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4700790447392273884?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4700790447392273884/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/10/compilar-para-windows-desde-ubuntu-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4700790447392273884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4700790447392273884'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/10/compilar-para-windows-desde-ubuntu-i.html' title='Compilar para Windows desde Ubuntu (I)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-2661877246594576798</id><published>2009-08-25T20:02:00.003+02:00</published><updated>2009-08-25T20:41:12.652+02:00</updated><title type='text'>Cacharricos</title><content type='html'>En verano, los campos y las bitácoras se agostan. Ya se sabe, las vacaciones es el periodo del año en que conviene no recalentar el cerebro.&lt;br /&gt;&lt;br /&gt;Aún así, algo ha caído:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mi querido portátil, ha vuelto a la vida tras sustituirle el disco muerto de 40GB por otro de 160GB. El proceso requirió los correspondientos improrerios a la SGAE, al ver que se llevaba un 25% de la factura. En fin, Ramoncín tiene que ir pagando su hipoteca ...&lt;/li&gt;&lt;li&gt;Me quise comprar un &lt;a href="http://www.aceronline.es/shop/acer-acer-aspire-x1700-p-1821.html"&gt;PCecico para el salón&lt;/a&gt;. Oferta agotada para cuando me acerqué a la tienda, así que me llevé lo más parecido. No tan mono (es semitorre) pero con 1TB de disco.&lt;/li&gt;&lt;/ul&gt;Como uno gusta de la diversidad, el portátil tiene su &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 9.04, y el otro tiene Vista (y un &lt;a href="http://wubi-installer.org/"&gt;Wubi&lt;/a&gt; dentro que tengo que configurar).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-2661877246594576798?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/2661877246594576798/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/08/cacharricos.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2661877246594576798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2661877246594576798'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/08/cacharricos.html' title='Cacharricos'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-1032391515320275184</id><published>2009-07-01T21:32:00.001+02:00</published><updated>2009-07-03T10:38:31.022+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><title type='text'>Aligerar PDFs</title><content type='html'>Mensualmente me llega una revista digital en formato PDF.&lt;br /&gt;La mitad de las páginas son anuncios, así que suelo recortarlos con &lt;a href="http://www.accesspdf.com/pdftk/"&gt;pdftk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo, para dejar sólo las páginas 1, de la 14 a la 24, y de la 26 a la 36:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;pdftk MMH20090601.pdf cat 1 14-24 26-36 output MMH20090601-mini.pdf&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con lo cual se queda en la mitad de tamaño:&lt;br /&gt;&lt;code&gt;ls -s1 MMH20090601*&lt;br /&gt;26236 MMH20090601-mini.pdf&lt;br /&gt;48332 MMH20090601.pdf&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A los alérgicos a la línea de comando os tranquilizará saber que podéis usar &lt;a href="http://www.angusj.com/pdftkb/"&gt;PDFTK Builder&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-1032391515320275184?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/1032391515320275184/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/07/aligerar-pdfs.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/1032391515320275184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/1032391515320275184'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/07/aligerar-pdfs.html' title='Aligerar PDFs'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-1956062864848923583</id><published>2009-06-21T03:21:00.000+02:00</published><updated>2009-06-21T03:30:34.068+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><title type='text'>ld09.exe y podmena</title><content type='html'>Al parar el ordenador me pregunta "¿desea matar a cmd.exe, que tarda mucho?".&lt;br /&gt;¿uh? si no tengo ninguna línea de comando abierta.&lt;br /&gt;&lt;br /&gt;Lanzo el Administrador de Tareas y veo multipleas instancias de cmd.exe y un proceso iexplore.exe&lt;br /&gt;Raro, porque yo uso Firefox.&lt;br /&gt;&lt;br /&gt;Al intentar ejecutar "regedit" desde Inicio-&gt;Ejecutar se reiniciaba el Explorador.&lt;br /&gt;Uf, mala pinta.&lt;br /&gt;Pruebo a ejecutar "regedit" desde el administrador de tareas y también se muere.&lt;br /&gt;Uf, mal rollito seguro.&lt;br /&gt;&lt;br /&gt;Tengo gran aprecio al &lt;a href="http://technet.microsoft.com/es-es/sysinternals/bb795533.aspx"&gt;Process Explorer&lt;/a&gt; y desde ahí ya puedo lanzar con éxito a regedit.&lt;br /&gt;Nos vamos a&lt;br /&gt;&lt;code&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y lo que canta bastante (porque no me suena de nada) es "ld09.exe"&lt;br /&gt;&lt;br /&gt;Google nos da una página en blanco para LD09.exe&lt;br /&gt;&lt;code&gt;http://www.prevx.com/filenames/X1867469537856748618-X1/LD09.EXE.html&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pero la versión en la caché sí es más interesante:&lt;br /&gt;&lt;code&gt;http://209.85.229.132/search?q=cache:L30I0qUVx80J:www.prevx.com/filenames/X1867469537856748618-X1/LD09.EXE.html+ld09&amp;amp;cd=3&amp;amp;hl=es&amp;amp;ct=clnk&amp;amp;gl=es&amp;amp;client=firefox-a&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Es un informe muy exhaustivo de lo que hace el virus éste.&lt;br /&gt;Pone lo que hace, pero no cómo quitarlo, ya que la misma página aprovecha para venderte su antivirus.&lt;br /&gt;Me entra la duda ¿serán ellos los autores del virus? A ver si su antivirus es otro virus peor ...&lt;br /&gt;&lt;br /&gt;Bueno, en cualquiera caso la descripción de lo que hace me permite deshacer bastante:&lt;br /&gt;&lt;br /&gt;Borré&lt;br /&gt;&lt;code&gt;c:\windows\ld09.exe&lt;br /&gt;c:\program files\podmena\podmena.sys&lt;br /&gt;c:\program files\podmena\podmena.dll&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Fuí al Panel de Control, y desde el Firewall de Windows, quité al accesso a podmena.&lt;br /&gt;Borré la entrada "ld09.exe" del registro&lt;br /&gt;&lt;code&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run\&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y borre las ramas del registro&lt;br /&gt;&lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\podmena&lt;br /&gt;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\drv_podmena&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Cruzamos dedos (lo más fácil al tocar el registro con tanta inconsciencia es que no arranque) y reiniciamos.&lt;br /&gt;&lt;br /&gt;Bueno, superamos el arranque. Aunque seguimos con múltiples cmd.exe e iexplore.exe&lt;br /&gt;&lt;br /&gt;Hala, a mirar con más atención a&lt;br /&gt;&lt;code&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ajá: hay un "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe" y no tiene mucho sentido que el ayudante de conexión a internet se ejecute en cada arranque.&lt;br /&gt;&lt;br /&gt;Pues nada, borramos a "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe"&lt;br /&gt;y quitamos su entrada de "icwsetup.exe" del registro:&lt;br /&gt;&lt;code&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run\&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y reiniciamos. Pues que si quieres arroz, Catalina.&lt;br /&gt;&lt;br /&gt;¡El muy cuco! (usaría otra expresión, pero al crear el blog marqué la casilla de contenido apto para todos públicos).&lt;br /&gt;Resulta que ha vuelto a poner a "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe" como estaba.&lt;br /&gt;&lt;br /&gt;Otro intento, cogemos a "notepad.exe" y lo copiamos con otro nombre, casualmente "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe"&lt;br /&gt;&lt;br /&gt;Y reiniciamos. Je, je, esta vez sale una bonita ventana de "notepad" al arrancar, y no tenemos ya a los múltiples cmd.exe.&lt;br /&gt;&lt;br /&gt;Bueno, aunque el PC sigue malito, ya tenemos controlada la infección.&lt;br /&gt;Otro día toca erradicarla.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-1956062864848923583?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/1956062864848923583/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/ld09exe-y-podmena.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/1956062864848923583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/1956062864848923583'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/ld09exe-y-podmena.html' title='ld09.exe y podmena'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4732900034738677984</id><published>2009-06-14T18:45:00.000+02:00</published><updated>2009-06-15T12:01:12.332+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><category scheme='http://www.blogger.com/atom/ns#' term='libgd'/><title type='text'>Compilar para Windows desde Cygwin (II)</title><content type='html'>Vamos a compilar a &lt;a href="http://www.libgd.org/"&gt;libGD&lt;/a&gt; para Windows.&lt;br /&gt;&lt;br /&gt;Nos traemos el código fuente:&lt;br /&gt;&lt;code&gt;wget http://www.libgd.org/releases/gd-2.0.36RC1.tar.bz2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Lo desempaquetamos:&lt;br /&gt;&lt;code&gt;tar jxvf gd-2.0.36RC1.tar.bz2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Nos vamos a su directorio:&lt;br /&gt;&lt;code&gt;cd gd-2.0.36RC1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y le ponemos el &lt;a href="http://lineadecomandos.blogspot.com/2009/06/parches.html"&gt;parche&lt;/a&gt; para &lt;a href="http://lineadecomandos.blogspot.com/2009/03/gd-2036.html"&gt;aligerar libGD&lt;/a&gt;:&lt;br /&gt;&lt;code&gt;patch -p0 &lt; ..patches/libgd.trim.1.diff&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Podríamos compilar &lt;a href="http://www.libpng.org/"&gt;libpng&lt;/a&gt;, &lt;a href="http://www.ijg.org/"&gt;libjpeg&lt;/a&gt; y &lt;a href="http://www.freetype.org/"&gt;freetype&lt;/a&gt; desde su código fuente, pero vamos a bajarlos ya compilados desde &lt;a href="http://oss.netfarm.it/mplayer-win32.php"&gt;Mplayer Win32&lt;/a&gt;.&lt;br /&gt;Ojo, desempaquetamos cada cosa en su sitio (bibliotecas, includes y scripts de configuración) según la &lt;a href="http://lineadecomandos.blogspot.com/2009/06/compilar-para-windows-desde-cygwin-i.html"&gt;jerarquía de directorios que os comenté&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lo configuro desactivando la creación de la la bilioteca dinámica, y sólo hará la enlazada estáticamente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;CC="gcc-3" CFLAGS="-mno-cygwin -DNONDLL=1" ./configure --disable-shared --prefix=/mingw --with-png=/mingw --with-freetype=/mingw --with-jpeg=/mingw --without-xpm --without-fontconfig&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A construir:&lt;br /&gt;&lt;code&gt;make&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ya está, sólo falta instalarlo:&lt;br /&gt;&lt;code&gt;make install&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4732900034738677984?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4732900034738677984/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/compilar-para-windows-desde-cygwin-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4732900034738677984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4732900034738677984'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/compilar-para-windows-desde-cygwin-ii.html' title='Compilar para Windows desde Cygwin (II)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-3731508298830751969</id><published>2009-06-12T14:30:00.000+02:00</published><updated>2009-06-12T19:50:26.020+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patch'/><category scheme='http://www.blogger.com/atom/ns#' term='libgd'/><title type='text'>Parches</title><content type='html'>Imagina que modificas el código fuente de alguna utilidad. Cada vez que se libere una nueva versión, tendrás que volver a modificarla.&lt;br /&gt;Pero un &lt;a href="http://es.wikipedia.org/wiki/Larry_Wall"&gt;virtuoso programador&lt;/a&gt; (por ende: vago, orgulloso e impaciente) ideó a &lt;a style="font-family: courier new;" href="http://www.manpagez.com/man/1/patch/"&gt;patch&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Así que primero guardas en un ficherito tus cambios:&lt;br /&gt;&lt;code&gt;diff -u source.c.original source.c &gt; source.diff&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y luego puedes decir a patch que aplique esos cambios a la nueva versión:&lt;br /&gt;&lt;code&gt;patch &amp;lt; source.diff &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y por supuesto no está limitado a cambios en un solo fichero, puedes tener un directorio con la versión inicial, otro directorio con la versión modificada por tí, y luego aplicar los cambios a un tercer directorio.&lt;br /&gt;&lt;br /&gt;Por ejemplo, &lt;a href="http://lineadecomandos.blogspot.com/2009/03/gd-2036.html"&gt;aquí me entretuve en recortar cosillas que no necesitaba de la versión 2.0.36 de libGD&lt;/a&gt;, e hize un .diff que bautizaremos como &lt;span style="font-family:courier new;"&gt;libgd.trim.1.diff&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Cuendo esté disponible la versión 2.0.37, le aplicaré mi parche asi:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd src/gd-2.0.37&lt;br /&gt;patch -p0 &lt; ..patches/libgd.trim.1.diff &lt;/code&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-3731508298830751969?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/3731508298830751969/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/parches.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3731508298830751969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3731508298830751969'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/parches.html' title='Parches'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4280264812698311851</id><published>2009-06-10T10:37:00.000+02:00</published><updated>2009-06-12T19:54:53.254+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GIF'/><category scheme='http://www.blogger.com/atom/ns#' term='PNG'/><title type='text'>Tamaño de imágenes</title><content type='html'>La utilidad de menor tamaño que he encontrado para conocer al ancho y alto de las imágenes (PNG, GIF, JPEG, XPM) es &lt;a href="http://www.acme.com/software/image_size/"&gt;image_size&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Trivial de compilar para Cygwin:&lt;br /&gt;&lt;code&gt;gcc image_size.c -s -o image_size&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O para Windows:&lt;br /&gt;&lt;code&gt;gcc -mno-cygwin image_size.c -s -o image_size&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para usarlo, basta pasar los nombres de los ficheros, y nos devuelve el nombre y dimensiones de cada uno:&lt;br /&gt;&lt;code&gt;image_size *.png *.gif&lt;br /&gt;demoin.png: 128 128&lt;br /&gt;demoin.gif: 128 128&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4280264812698311851?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4280264812698311851/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/tamano-de-imagenes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4280264812698311851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4280264812698311851'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/tamano-de-imagenes.html' title='Tamaño de imágenes'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-3964692867271316147</id><published>2009-06-06T09:56:00.000+02:00</published><updated>2009-06-07T11:04:16.667+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='MinGW'/><title type='text'>Compilar para Windows desde Cygwin (I)</title><content type='html'>&lt;a href="http://www.cygwin.org/"&gt;Cygwin&lt;/a&gt; es una excelente simulación de &lt;a href="http://es.wikipedia.og/POSIX"&gt;POSIX&lt;/a&gt; sobre Windows, lo que facilita compilar programs que vengan del mundillo Unix.&lt;br /&gt;Aparte de programs para el propio entorno Cygwin, también permite compilar programas "puro-Windows", que no dependan de la &lt;a href="http://es.wikipedia.org/wiki/Biblioteca_%28programaci%C3%B3n%29"&gt;biblioteca de funciones&lt;/a&gt; cygwin1.dll.&lt;br /&gt;&lt;br /&gt;Básicamente, sólo hay que añadir el parámetro "-mno-cygwin" al compilar.&lt;br /&gt;&lt;br /&gt;Hay unos pocos paquetes Cygwin que contienen bibliotecas puras de Windows (que procedecen del proyecto &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt;): &lt;span style="font-family:courier new;"&gt;mingw-runtime&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;mingw-zlib&lt;/span&gt; y &lt;span style="font-family:courier new;"&gt;mingw-bzip2&lt;/span&gt;, más sus versiones &lt;span style="font-family:courier new;"&gt;-devel&lt;/span&gt; para desarrollar.&lt;br /&gt;&lt;br /&gt;Estos paquetes se instalan así:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;/usr/include/mingw/&lt;/span&gt; para los includes&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;/usr/lib/mingw/&lt;/span&gt; para las bibliotecas.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Resulta conveniente que ambos directorios partan de la misma raiz, así que yo tengo un par de enlaces simbólicos:&lt;br /&gt;&lt;ul&gt;&lt;li style="font-family: courier new;"&gt;/mingw/include -&gt; /usr/include/mingw/&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;/mingw/lib -&gt; /usr/lib/mingw/&lt;/li&gt;&lt;/ul&gt;También tengo &lt;span style="font-family:courier new;"&gt;/mingw/bin&lt;/span&gt; para guardar ejecutables puro-Windows o scripts de configuración de las bibliotecas puro-Windows.&lt;br /&gt;&lt;br /&gt;Vamos, que ejecuté estos comandos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir -p /mingw/bin&lt;br /&gt;ln -s /usr/include/mingw/ /mingw/include&lt;br /&gt;ln -s /usr/lib/mingw/ /mingw/lib&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-3964692867271316147?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/3964692867271316147/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/compilar-para-windows-desde-cygwin-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3964692867271316147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3964692867271316147'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/compilar-para-windows-desde-cygwin-i.html' title='Compilar para Windows desde Cygwin (I)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-7368242339173475482</id><published>2009-06-02T23:24:00.000+02:00</published><updated>2009-06-03T00:03:38.140+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><title type='text'>Jeroglíficos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://usuarios.arsystel.com/wzrlpy/lineadecomandos/texto_egipcio2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 455px; height: 75px;" src="http://usuarios.arsystel.com/wzrlpy/lineadecomandos/texto_egipcio2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mala fama tiene la línea de comando: inescrutable, críptica, y sólo apta para los iniciados en tan oscuro saber.&lt;br /&gt;&lt;br /&gt;¿Qúe mejor para perpetuar esa fama que escribir jeroglíficos con comandos? ;-)&lt;br /&gt;&lt;br /&gt;Ingredientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://lineadecomandos.blogspot.com/2009/04/graficos-desde-awk.html"&gt;xgawk&lt;/a&gt;&lt;/li&gt;&lt;li&gt;un tipo de letra adecuado, &lt;a href="http://greywolf.critter.net/fonts.htm"&gt;Greywolf Glyphs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;un sencillo script, que denominaremos jeroglífico.awk.&lt;/li&gt;&lt;/ul&gt;El sencillo script es éste, donde en lugar de comentarios he preferido poner "print" para ir mostrando los pasos:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@load gd&lt;br /&gt;&lt;br /&gt;BEGIN {&lt;br /&gt;MARGEN = 8&lt;br /&gt;TAM_LETRA = 48&lt;br /&gt;TIPO_LETRA = "GWGLYPTT.ttf"&lt;br /&gt;if (!("GDFONTPATH" in ENVIRON)) {&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   &lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;print "\n¡¡Recuerda definir GDFONTPATH!!\nHaz algo parecido a ...\n"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;   &lt;/span&gt;print "GDFONTPATH=/cygdrive/c/WINDOWS/Fonts/:/usr/X11R6/lib/X11/fonts/TTF/; export GDFONTPATH\n"&lt;br /&gt;  print "... y vuelve a lanzarme."&lt;br /&gt;  exit&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Averiguamos el ancho que ocupa nuestro texto"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt; &lt;/span&gt;err = gdImageStringFT("", brect, 0, TIPO_LETRA, TAM_LETRA, 0.0, 0, 0, txt)&lt;br /&gt;if (err) {&lt;br /&gt;  print err&lt;br /&gt;  print "\nEl tipo de letra Greywolf Glyphs está en:"&lt;br /&gt;  print "http://greywolf.critter.net/fonts.htm"&lt;br /&gt;  exit&lt;br /&gt;}&lt;br /&gt;ancho = brect[2]-brect[6] + MARGEN&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;print "Averiguamos el trazo más alto y el más bajo del tipo de letra"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt; &lt;/span&gt;err = gdImageStringFT("", brect, 0, TIPO_LETRA, TAM_LETRA, 0.0, 0, 0, "|ÑILMgf_q")&lt;br /&gt;alto  = brect[3]-brect[7] + MARGEN&lt;br /&gt;base  = -brect[7]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Creamos una imagen, del tamaño de nuestro texto"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt; &lt;/span&gt;im = gdImageCreateTrueColor(ancho, alto)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Definimos el color marrón"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; &lt;/span&gt;marron = gdImageColorAllocate(im, 204, 153, 51)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Rellenamos de marrón"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; &lt;/span&gt;gdImageFilledRectangle(im, 0, 0, ancho, alto, marron)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Definimos el color lila"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt; &lt;/span&gt;lila = gdImageColorAllocate(im, 128, 0, 255)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Dibujamos el texto en lila"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt; &lt;/span&gt;x = MARGEN/2&lt;br /&gt;y = base + MARGEN/2&lt;br /&gt;err=gdImageStringFT(im, brect, lila, TIPO_LETRA, TAM_LETRA, 0.0, x, y, txt)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "Guardamos el resultado"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt; &lt;/span&gt;gdImagePngName(im, salida)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;print "Destruímos la imagen"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;gdImageDestroy(im)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;print "¡Eso es todo, amigos!"&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Luego invocamos el comando:&lt;br /&gt;&lt;code&gt;xgawk -f jeroglifico.awk -vtxt="Maravilloso" -vsalida=texto_egipcio.png&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ya tenemos la imagen.&lt;br /&gt;&lt;br /&gt;Bueno, la verdad es que la he recomprimido un poquito más (un 38%), con el comando:&lt;br /&gt;&lt;code&gt;pngcrush.exe -brute texto_egipcio.png texto_egipcio2.png&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-7368242339173475482?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/7368242339173475482/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/jeroglificos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7368242339173475482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7368242339173475482'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/jeroglificos.html' title='Jeroglíficos'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-8957893681678005297</id><published>2009-06-01T22:00:00.000+02:00</published><updated>2009-06-01T22:13:19.516+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='paradojas'/><title type='text'>Termostatos e impaciencia</title><content type='html'>Ahora que se avecina el verano, no está de más recordar que poner al mínimo el termostato en absoluto acelera que lleguemos a la temperatura de confort.&lt;br /&gt;La causa es que los aparatos de aire acondicionado o están apagados o funcionan a plena potencia (salvo que sean "inverter").&lt;br /&gt;&lt;br /&gt;Y lo mismo pasa en invierno: poner al máximo el termostato no hace que lleguemos antes a una temperatura agradable, porque las calderas (todas) o están apagadas o funcionan a plena potencia.&lt;br /&gt;&lt;br /&gt;Vamos, que son dispositivos digitales, y el verdadero control de su potencia promedio se hace variando la relación entre el tiempo que permanecen encendidos y el tiempo que están apagados.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-8957893681678005297?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/8957893681678005297/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/termostatos-e-impaciencia.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8957893681678005297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8957893681678005297'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/06/termostatos-e-impaciencia.html' title='Termostatos e impaciencia'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-2751440336124116090</id><published>2009-05-19T03:13:00.000+02:00</published><updated>2009-05-19T03:13:00.394+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Más ancho para las entradas</title><content type='html'>Ya tenemos todos los GIF ensanchados, ahora hay que cambiar la plantilla de Blogger para los use.&lt;br /&gt;&lt;br /&gt;Como he guardado la plantilla antes y después de editarla, puedo usar diff para ver los cambios:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;diff -u lineadecomandos_plantilla-2009-05-16\ 1223.xml lineadecomandos_plantilla-2009-05-16\ 1616.xml&lt;/code&gt;&lt;br /&gt;&lt;code style="font-size:85%"&gt;&lt;br /&gt;--- lineadecomandos_plantilla-2009-05-16 1223.xml 2009-05-16 12:34:06.015625000 +0200&lt;br /&gt;+++ lineadecomandos_plantilla-2009-05-16 1616.xml 2009-05-16 16:53:48.312500000 +0200&lt;br /&gt;@@ -102,15 +102,15 @@&lt;br /&gt;    these measurements, the images will also need to change.&lt;br /&gt;    */&lt;br /&gt; #outer-wrapper {&lt;br /&gt;-  width:740px;&lt;br /&gt;+  width:960px;&lt;br /&gt;   margin:0 auto;&lt;br /&gt;   text-align:$startSide;&lt;br /&gt;   font: $bodyFont;&lt;br /&gt;   }&lt;br /&gt; #main-wrap1 {&lt;br /&gt;-  width:485px;&lt;br /&gt;+  width:705px;&lt;br /&gt;   float:$startSide;&lt;br /&gt;-  background:$mainBgColor url("http://www1.blogblog.com/rounders3/corners_main_bot.gif") no-repeat $startSide bottom;&lt;br /&gt;+  background:$mainBgColor url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/corners_main_bot705.gif") no-repeat $startSide bottom;&lt;br /&gt;   margin:15px 0 0;&lt;br /&gt;   padding:0 0 10px;&lt;br /&gt;   color:$mainTextColor;&lt;br /&gt;@@ -122,13 +122,13 @@&lt;br /&gt; #main-wrap2 {&lt;br /&gt;   float:$startSide;&lt;br /&gt;   width:100%;&lt;br /&gt;-  background:url("http://www1.blogblog.com/rounders3/corners_main_top.gif") no-repeat $startSide top;&lt;br /&gt;+  background:url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/corners_main_top705.gif") no-repeat $startSide top;&lt;br /&gt;   padding:10px 0 0;&lt;br /&gt;   }&lt;br /&gt; #main {&lt;br /&gt;-  background:url("http://www.blogblog.com/rounders3/rails_main.gif") repeat-y $startSide;&lt;br /&gt;+  background:url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/rails_main705.gif") repeat-y $startSide;&lt;br /&gt;   padding:0;&lt;br /&gt;-  width:485px;&lt;br /&gt;+  width:705px;&lt;br /&gt;   }&lt;br /&gt; #sidebar-wrap {&lt;br /&gt;   width:240px;&lt;br /&gt;@@ -142,14 +142,14 @@&lt;br /&gt; &lt;br /&gt; .main .widget { &lt;br /&gt;   margin-top: 4px;&lt;br /&gt;-  width: 468px;&lt;br /&gt;+  width: 688px;&lt;br /&gt;   padding: 0 13px;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; .main .Blog {&lt;br /&gt;   margin: 0;&lt;br /&gt;   padding: 0;&lt;br /&gt;-  width: 484px;&lt;br /&gt;+  width: 704px;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /* Links&lt;br /&gt;@@ -171,7 +171,7 @@&lt;br /&gt; /* Blog Header&lt;br /&gt; ----------------------------------------------- */&lt;br /&gt; #header-wrapper {&lt;br /&gt;-  background:$titleBgColor url("http://www2.blogblog.com/rounders3/corners_cap_top.gif") no-repeat $startSide top;&lt;br /&gt;+  background:$titleBgColor url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/corners_cap_top960.gif") no-repeat $startSide top;&lt;br /&gt;   margin-top:22px;&lt;br /&gt;   margin-$endSide:0;&lt;br /&gt;   margin-bottom:0;&lt;br /&gt;@@ -183,7 +183,7 @@&lt;br /&gt;   color:$titleTextColor;&lt;br /&gt;   }&lt;br /&gt; #header {&lt;br /&gt;-  background:url("http://www.blogblog.com/rounders3/corners_cap_bot.gif") no-repeat $startSide bottom;&lt;br /&gt;+  background:url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/corners_cap_bot960.gif") no-repeat $startSide bottom;&lt;br /&gt;   padding:0 15px 8px;&lt;br /&gt;   }&lt;br /&gt; #header h1 {&lt;br /&gt;@@ -585,11 +585,11 @@&lt;br /&gt;   padding:15px 0 0;&lt;br /&gt;   }&lt;br /&gt; #footer-wrap2 {&lt;br /&gt;-  background:$titleBgColor url("http://www2.blogblog.com/rounders3/corners_cap_top.gif") no-repeat $startSide top;&lt;br /&gt;+  background:$titleBgColor url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/corners_cap_top960.gif") no-repeat $startSide top;&lt;br /&gt;   color:$titleTextColor;&lt;br /&gt;   }&lt;br /&gt; #footer {&lt;br /&gt;-  background:url("http://www.blogblog.com/rounders3/corners_cap_bot.gif") no-repeat $startSide bottom;&lt;br /&gt;+  background:url("http://usuarios.arsystel.com/wzrlpy/lineadecomandos/corners_cap_bot960.gif") no-repeat $startSide bottom;&lt;br /&gt;   padding:8px 15px;&lt;br /&gt;   }&lt;br /&gt; #footer hr {display:none;}&lt;br /&gt;@@ -614,7 +614,7 @@&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; body#layout #outer-wrapper { &lt;br /&gt;-  width: 730px;&lt;br /&gt;+  width: 950px;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; body#layout #footer-wrap1 { &lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-2751440336124116090?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/2751440336124116090/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/mas-ancho-para-las-entradas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2751440336124116090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2751440336124116090'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/mas-ancho-para-las-entradas.html' title='Más ancho para las entradas'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6863716254580062167</id><published>2009-05-17T16:57:00.000+02:00</published><updated>2009-05-19T10:25:15.612+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='GIF'/><title type='text'>Cortando y pegando GIFs (III)</title><content type='html'>Recordemos que queremos pasar el ancho de 960 a 740, así que el aumento de ancho es 960-740=220&lt;br /&gt;&lt;br /&gt;Mientras que el GIF de cabecera es 740x8, el de las entradas es 485x15, por lo tanto:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;el tamaño del trozo curvo es 15x15.&lt;/li&gt;&lt;li&gt;la posición del trozo curvo derecho 485-15=470&lt;/li&gt;&lt;li&gt;nuevo ancho de entradas 485+220=705&lt;/li&gt;&lt;li&gt;nueva posición del trozo curvo derecho 485+220-15=590&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Con esto generamos los nuevos GIFs de las entradas:&lt;br /&gt;&lt;code&gt;for i in top bot&lt;br /&gt;do&lt;br /&gt;img=corners_main_$i&lt;br /&gt;gifsicle --same-background --crop 0,0+15x15 $img.gif --crop 470,0+15x15 --p 590,0 $img.gif | gifsicle -U "#1" &gt; ${img}705.gif&lt;br /&gt;done&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Hay otro GIF para hacer una línea vertical a ambos lados de las entradas, de 485x10.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;el tamaño del trozo significativo es 10x10.&lt;/li&gt;&lt;li&gt;la posición del trozo significativo derecho 485-10=475&lt;/li&gt;&lt;li&gt;nuevo ancho de entradas 485+220=705&lt;/li&gt;&lt;li&gt;nueva posición del trozo curvo derecho 485+220-10=695&lt;/li&gt;&lt;/ul&gt;Con esto generamos el nuevo GIF:&lt;br /&gt;&lt;code&gt;img=rails_main&lt;br /&gt;gifsicle --same-background --crop 0,0+10x10 $img.gif --crop 475,0+10x10 --p 695,0 $img.gif | gifsicle -U "#1" &gt; ${img}705.gif&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ya tenemos todos los GIFs. Falta subirlos a algún sitio de la Web. Si tienes ADSL, tu proveedor te suele dar entre 10 y 100 MB de espacio. Para subirlos, se puede usar el cliente ftp que venga con tu sistema operativo, &lt;a href="http://wput.sourceforge.net/"&gt;wput&lt;/a&gt;, o &lt;a href="http://filezilla-project.org/"&gt;FileZilla&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6863716254580062167?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6863716254580062167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/cortando-y-pegando-gifs-iii.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6863716254580062167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6863716254580062167'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/cortando-y-pegando-gifs-iii.html' title='Cortando y pegando GIFs (III)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-8381697816688744761</id><published>2009-05-16T10:55:00.000+02:00</published><updated>2009-05-19T10:25:36.582+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>svg2swf</title><content type='html'>&lt;a href="http://svg2swf.sourceforge.net/index.html"&gt;svg2swf&lt;/a&gt; convierte de &lt;a href="http://es.wikipedia.org/wiki/SVG"&gt;SVG&lt;/a&gt; (el formato que gasta &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt;) a &lt;a href="http://es.wikipedia.org/wiki/SWF"&gt;SWF&lt;/a&gt; (vamos, a &lt;a href="http://es.wikipedia.org/wiki/Adobe_Flash"&gt;Flash&lt;/a&gt;).&lt;br /&gt;Así que podemos convertir dibujitos vectoriales bastante bien.&lt;br /&gt;&lt;br /&gt;He probado con mi avatar, y no queda tan mal:&lt;br /&gt;&lt;code&gt;svg2swf --cubic 20 --default-font test_sans.fdb avatar.svg avatar.swf&lt;/code&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;SVG&lt;/th&gt;&lt;th&gt;SWF&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;br /&gt;       &lt;td&gt;&lt;object data="http://usuarios.arsystel.com/wzrlpy/lineadecomandos/gavatar100.svg" type="image/svg+xml" width="100" height="100"&gt;&lt;/object&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;       &lt;td&gt;&lt;object width="100" height="100"&gt;&lt;param name="movie" value="http://usuarios.arsystel.com/wzrlpy/lineadecomandos/gavatar100.swf"&gt;&lt;br /&gt;&lt;embed src="http://usuarios.arsystel.com/wzrlpy/lineadecomandos/gavatar100.swf" width="100" height="100"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;   &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Si usáis Internet Explorer, igual no véis el SVG: bajaos en tal caso el &lt;a href="http://www.adobe.com/svg/viewer/install/main.html"&gt;visor&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-8381697816688744761?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/8381697816688744761/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/svg2swf.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8381697816688744761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8381697816688744761'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/svg2swf.html' title='svg2swf'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-7002127938873132325</id><published>2009-05-11T03:00:00.000+02:00</published><updated>2009-05-19T10:28:52.381+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='GIF'/><title type='text'>Cortando y pegando GIFs (II)</title><content type='html'>Vamos a probar con &lt;a href="http://www.lcdf.org/gifsicle/"&gt;gifsicle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cortamos la esquina de la izquierda y la de la derecha (740-8=732):&lt;br /&gt;&lt;code&gt;gifsicle --same-background --crop   0,0+8x8 corners_cap_top.gif &gt; corners_cap_top_left8.gif&lt;br /&gt;gifsicle --same-background --crop 732,0+8x8 corners_cap_top.gif &gt; corners_cap_top_right8.gif&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y luego las ponemos en sus nuevas posiciones (960-8=952):&lt;br /&gt;&lt;code&gt;gifsicle corners_cap_top_left8.gif --p 952,0 corners_cap_top_right8.gif | gifsicle -U "#1" &gt; corners_cap_top960.gif&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;También podemos hacer todo en una única línea, sin ficheros intermedios:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;gifsicle --same-background --crop 0,0+8x8 corners_cap_top.gif --crop 732,0+8x8 --p 952,0 corners_cap_top.gif | gifsicle -U "#1" &gt; corners_cap_top960.gif&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y como tenemos que hacerlo con las esquinas de arriba y las de abajo:&lt;br /&gt;&lt;code&gt;for i in top bot&lt;br /&gt;do&lt;br /&gt;img=corners_cap_$i&lt;br /&gt;gifsicle --same-background --crop 0,0+8x8 $img.gif --crop 732,0+8x8 --p 952,0 $img.gif | gifsicle -U "#1" &gt; ${img}960.gif&lt;br /&gt;done&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-7002127938873132325?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/7002127938873132325/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/cortando-y-pegando-gifs-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7002127938873132325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7002127938873132325'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/cortando-y-pegando-gifs-ii.html' title='Cortando y pegando GIFs (II)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-96503212808724760</id><published>2009-05-10T05:44:00.000+02:00</published><updated>2009-05-19T10:30:07.718+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><title type='text'>BusyBox</title><content type='html'>Una multitud de programas Unix, con mínimo tamaño pero intentando que cumplan &lt;a href="http://es.wikipedia.org/wiki/POSIX"&gt;POSIX&lt;/a&gt;, y en un único ejecutable: eso es &lt;a href="http://www.busybox.net/"&gt;BusyBox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Es interesante porque es muy modular: durante la configuración eliges que programas quieres, con lo que puedes controlar el tamaño final del binario.&lt;br /&gt;&lt;br /&gt;Hice una prueba con el &lt;a href="http://busybox.net/downloads/busybox-1.13.3.tar.bz2"&gt;fuente de BusyBox 1.13.3&lt;/a&gt;, y con unos poquitos cambios, lo compilé dentro de Cygwin; lo configuré para generar sólo awk.&lt;br /&gt;&lt;br /&gt;Hoy he encontrado una &lt;a href="http://github.com/pclouds/busybox-w32/tree/master"&gt;versión para Windows&lt;/a&gt; que tengo que probar.&lt;br /&gt;&lt;br /&gt;La idea que llevo en mente es empezar por un binario que tenga &lt;a href="http://www.faqs.org/faqs/unix-faq/shell/hush-faq/"&gt;hush&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/Awk"&gt;awk&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-96503212808724760?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/96503212808724760/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/busybox.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/96503212808724760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/96503212808724760'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/busybox.html' title='BusyBox'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-5169113819288006214</id><published>2009-05-02T23:30:00.001+02:00</published><updated>2009-06-16T09:42:58.075+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='GIF'/><title type='text'>Cortando y pegando GIFs (I)</title><content type='html'>Resulta que Internet Explorer 6 no entiende los PNG con transparencias, excepto usando &lt;a href="http://www.howtocreate.co.uk/alpha.html"&gt;trucos realmente inmundos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Así que tenemos usar GIF, un formato algo anticuado pero que entiende todo el mundo, para por ejemplo las esquinas redondeadas de esta plantilla de Blogger.&lt;br /&gt;&lt;br /&gt;Los GIFs se pueden manipular con &lt;a href="http://www.irfanview.com"&gt;Irfanview&lt;/a&gt;, MS Paint, &lt;a href="http://www.getpaint.net/"&gt;Paint.NET&lt;/a&gt;, &lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;, etc. pero aquí usamos la línea de comando.&lt;br /&gt;&lt;br /&gt;Podemos usar &lt;a href="http://www.imagemagick.org/"&gt;ImageMagick&lt;/a&gt;, como explican &lt;a href="http://www.ibm.com/developerworks/library/l-graf2/?ca=dgr-lnxw15GraphicsLine"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pero aquí buscamos la utilidad de menor tamaño que permita realizar la tarea. Veamos &lt;a href="http://sourceforge.net/projects/giflib/"&gt;giflib&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La tarea es ensanchar el &lt;a href="http://www2.blogblog.com/rounders3/corners_cap_top.gif"&gt;GIF de cabecera&lt;/a&gt;, de 740x8 a 960x8.&lt;br /&gt;&lt;br /&gt;Separamos la esquina redondeada izquierda, y la derecha:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gifclip -i 0 0 7 7 corners_cap_top.gif | gifpos -s 960 8 &gt; corners_cap_top_left8.gif&lt;br /&gt;gifclip -i 732 0 739 7 corners_cap_top.gif | gifpos -s 960 8 -i 952 0 &gt; corners_cap_top_right8.gif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Cogemos un trocito de en medio, y lo ensanchamos hasta 960 -8 -8= 944:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gifclip -i 8 0 125 7 corners_cap_top.gif | gifrsize -x 8 | gifpos -s 960 8 -i 8 0 &gt; corners_cap_mid944.gif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y juntamos todo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gifasm corners_cap_top_left8.gif corners_cap_mid944.gif corners_cap_top_right8.gif &gt; multi.gif&lt;br /&gt;&lt;br /&gt;GIF-LIB error: Wrong record type detected.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Vaya, hombre, giflib no entiende los GIFs que genera ella misma.&lt;br /&gt;Habrá que usar otra cosa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-5169113819288006214?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/5169113819288006214/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/giflib.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5169113819288006214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5169113819288006214'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/05/giflib.html' title='Cortando y pegando GIFs (I)'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-7631776701524818355</id><published>2009-04-30T20:07:00.000+02:00</published><updated>2009-04-30T20:12:00.619+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Web Developer</title><content type='html'>Para ver la estructura de las páginas Web, resulta muy práctico navegar con Firefox y tener instalado &lt;a href="http://chrispederick.com/work/web-developer/"&gt;Web Developer&lt;/a&gt;.&lt;br /&gt;Por cierto, tiene una &lt;a href="http://chrispederick.com/work/web-developer/localization/"&gt;versión traducida&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para entender las CSS que gasta Blogger en particular, conviene activar el menú &lt;span style="font-weight:bold;"&gt;Information-&gt; Display class &amp; ID details&lt;/span&gt; y también  &lt;span style="font-weight:bold;"&gt;Outline -&gt; Outline block level elements&lt;/span&gt;, e imprimir el blog.&lt;br /&gt;Con esta especia de mapa, es más fácil seguir el código de las CSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-7631776701524818355?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/7631776701524818355/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/web-developer.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7631776701524818355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/7631776701524818355'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/web-developer.html' title='Web Developer'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6412600393589055789</id><published>2009-04-27T23:41:00.000+02:00</published><updated>2009-05-16T17:26:28.799+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Barra lateral con tres cajitas</title><content type='html'>Hoy he creado esta bitácora, con la plantilla inicial "Rounders 3", y la he modificado un poquito para que en la barra lateral tenga tres cajitas en vez de dos.&lt;br /&gt;¿Y qué he modificado?&lt;br /&gt;&lt;br /&gt;Es muy importante salvar la plantilla antes y después de cada cambio, así tenemos la posibilidad de ver las modificaciones con el comando 'diff':&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ diff -u lineadecomandos_plantilla-2009-04-27\ 2230.xml lineadecomandos_plantilla-2009-04-27\ 2334.xml &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La pena es que incrustar etiquetas XML dentro del editor de Blogger produce basura.&lt;br /&gt;Así que hay protegerlas para que no las interprete.&lt;br /&gt;Una manera es hacer una sustitución global de todos los &lt;span style="font-weight:bold;"&gt;&amp;gt;&lt;/span&gt; por &lt;span style="font-weight:bold;"&gt;&amp;amp;gt;&lt;/span&gt;,&lt;br /&gt;y de todos los &lt;span style="font-weight:bold;"&gt;&amp;lt;&lt;/span&gt; por &lt;span style="font-weight:bold;"&gt;&amp;amp;lt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ diff -u lineadecomandos_plantilla-2009-04-27\ 2230.xml lineadecomandos_plantilla-2009-04-27\ 2334.xml &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code style="font-size:85%"&gt;&lt;br /&gt;--- lineadecomandos_plantilla-2009-04-27 2230.xml       2009-04-27 22:34:02.538687800 +0200&lt;br /&gt;+++ lineadecomandos_plantilla-2009-04-27 2334.xml       2009-04-27 23:34:32.163687800 +0200&lt;br /&gt;@@ -13,6 +13,7 @@&lt;br /&gt; URL:      www.stopdesign.com&lt;br /&gt; Date:     27 Feb 2004&lt;br /&gt; Updated by: Blogger Team&lt;br /&gt;+Updated by Víctor Paesa, April 2009&lt;br /&gt; ----------------------------------------------- */&lt;br /&gt; &lt;br /&gt; /* Variable definitions&lt;br /&gt;@@ -27,20 +28,16 @@&lt;br /&gt;              type="color" default="#586" value="#558866"&amp;lt;&lt;br /&gt;    &amp;gt;Variable name="borderColor" description="Post Border Color" type="color"&lt;br /&gt;              default="#bbb" value="#bbbbbb"&amp;lt;&lt;br /&gt;-&lt;br /&gt;-&lt;br /&gt;    &amp;gt;Variable name="mainLinkColor" description="Link Color" type="color"&lt;br /&gt;              default="#456" value="#445566"&amp;lt;&lt;br /&gt;    &amp;gt;Variable name="mainVisitedLinkColor" description="Visited Link Color"&lt;br /&gt;              type="color" default="#234" value="#223344"&amp;lt;&lt;br /&gt;-&lt;br /&gt;    &amp;gt;Variable name="titleBgColor" description="Page Header Background Color"&lt;br /&gt;              type="color" default="#357" value="#335577"&amp;lt;&lt;br /&gt;    &amp;gt;Variable name="titleTextColor" description="Blog Title Color"&lt;br /&gt;              type="color" default="#fff" value="#ffffff"&amp;lt;&lt;br /&gt;-&lt;br /&gt;-   &amp;gt;Variable name="topSidebarHeaderColor"&lt;br /&gt;-             description="Top Sidebar Title Color"&lt;br /&gt;+   &amp;gt;Variable name="sidebarHeaderColor"&lt;br /&gt;+             description="Sidebar Title Color"&lt;br /&gt;              type="color" default="#fff" value="#ffffff"&amp;lt;&lt;br /&gt;    &amp;gt;Variable name="topSidebarBgColor"&lt;br /&gt;              description="Top Sidebar Background Color"&lt;br /&gt;@@ -52,13 +49,21 @@&lt;br /&gt;    &amp;gt;Variable name="topSidebarVisitedLinkColor"&lt;br /&gt;              description="Top Sidebar Visited Link Color"&lt;br /&gt;              type="color" default="#fff" value="#ffffff"&amp;lt;&lt;br /&gt;-   &amp;gt;Variable name="bottomSidebarHeaderColor"&lt;br /&gt;-             description="Bottom Sidebar Title Color"&lt;br /&gt;-             type="color" default="#abc" value="#aabbcc"&amp;lt;&lt;br /&gt;-&lt;br /&gt;+   &amp;gt;Variable name="middleSidebarBgColor"&lt;br /&gt;+             description="Middle Sidebar Background Color"&lt;br /&gt;+             type="color" default="#586" value="#6f6f5f"&amp;lt;&lt;br /&gt;+   &amp;gt;Variable name="middleSidebarLinkColor"&lt;br /&gt;+             description="Middle Sidebar Link Color"&lt;br /&gt;+             type="color" default="#99ddbb" value="#ffffff"&amp;lt;&lt;br /&gt;+   &amp;gt;Variable name="middleSidebarVisitedLinkColor"&lt;br /&gt;+             description="Middle Sidebar Visited Link Color"&lt;br /&gt;+             type="color" default="#ffffff" value="#ffffff"&amp;lt;&lt;br /&gt;+   &amp;gt;Variable name="bottomSidebarBgColor"&lt;br /&gt;+             description="Bottom Sidebar Background Color"&lt;br /&gt;+             type="color" default="#586" value="#aaccc0"&amp;lt;&lt;br /&gt;    &amp;gt;Variable name="bottomSidebarLinkColor"&lt;br /&gt;              description="Bottom Sidebar Link Color"&lt;br /&gt;-             type="color" default="#99ddbb" value="#99ddbb"&amp;lt;&lt;br /&gt;+             type="color" default="#99ddbb" value="#ffffff"&amp;lt;&lt;br /&gt;    &amp;gt;Variable name="bottomSidebarVisitedLinkColor"&lt;br /&gt;              description="Bottom Sidebar Visited Link Color"&lt;br /&gt;              type="color" default="#ffffff" value="#ffffff"&amp;lt;&lt;br /&gt;@@ -475,8 +480,8 @@&lt;br /&gt; &lt;br /&gt; #sidebartop h2 {&lt;br /&gt;   line-height:1.5em;&lt;br /&gt;-  color:$topSidebarHeaderColor;&lt;br /&gt;-  border-bottom: 1px dotted $topSidebarHeaderColor;&lt;br /&gt;+  color:$sidebarHeaderColor;&lt;br /&gt;+  border-bottom: 1px dotted $sidebarHeaderColor;&lt;br /&gt;   font: $headerFont;&lt;br /&gt;   margin-bottom: 0.5em;&lt;br /&gt; }&lt;br /&gt;@@ -512,18 +517,6 @@&lt;br /&gt;   margin-top: 0.5em;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;-#sidebarbottom-wrap1 {&lt;br /&gt;-  background:$titleBgColor url("http://www.blogblog.com/rounders3/corners_side_top.gif") no-repeat $startSide top;&lt;br /&gt;-  margin:0 0 15px;&lt;br /&gt;-  padding:10px 0 0;&lt;br /&gt;-  color: $titleTextColor;&lt;br /&gt;-}&lt;br /&gt;-&lt;br /&gt;-#sidebarbottom-wrap2 {&lt;br /&gt;-  background:url("http://www1.blogblog.com/rounders3/corners_side_bot.gif") no-repeat $startSide bottom;&lt;br /&gt;-  padding:0 0 8px;&lt;br /&gt;-}&lt;br /&gt;-&lt;br /&gt; .sidebar h2 {&lt;br /&gt;   margin-top:0;&lt;br /&gt;   margin-$endSide:0;&lt;br /&gt;@@ -556,10 +549,34 @@&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt; #sidebar h2 {&lt;br /&gt;-  color: $bottomSidebarHeaderColor;&lt;br /&gt;-  border-bottom: 1px dotted $bottomSidebarHeaderColor;&lt;br /&gt;+  color: $sidebarHeaderColor;&lt;br /&gt;+  border-bottom: 1px dotted $sidebarHeaderColor;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;+#sidebarmiddle-wrap1 {&lt;br /&gt;+  background:$middleSidebarBgColor url("http://www.blogblog.com/rounders3/corners_side_top.gif") no-repeat $startSide top;&lt;br /&gt;+  margin:0 0 15px;&lt;br /&gt;+  padding:10px 0 0;&lt;br /&gt;+  color: $titleTextColor;&lt;br /&gt;+}&lt;br /&gt;+&lt;br /&gt;+#sidebarmiddle-wrap2 {&lt;br /&gt;+  background:url("http://www1.blogblog.com/rounders3/corners_side_bot.gif") no-repeat $startSide bottom;&lt;br /&gt;+  padding:0 0 8px;&lt;br /&gt;+}&lt;br /&gt;+&lt;br /&gt;+#sidebarbottom-wrap1 {&lt;br /&gt;+  background:$bottomSidebarBgColor url("http://www.blogblog.com/rounders3/corners_side_top.gif") no-repeat $startSide top;&lt;br /&gt;+  margin:0 0 15px;&lt;br /&gt;+  padding:10px 0 0;&lt;br /&gt;+  color: $titleTextColor;&lt;br /&gt;+}&lt;br /&gt;+&lt;br /&gt;+#sidebarbottom-wrap2 {&lt;br /&gt;+  background:url("http://www1.blogblog.com/rounders3/corners_side_bot.gif") no-repeat $startSide bottom;&lt;br /&gt;+  padding:0 0 8px;&lt;br /&gt;+}&lt;br /&gt;+&lt;br /&gt; /* Footer&lt;br /&gt; ----------------------------------------------- */&lt;br /&gt; #footer-wrap1 {&lt;br /&gt;@@ -1105,8 +1122,55 @@&lt;br /&gt; &amp;gt;/b:section&amp;lt;&lt;br /&gt;     &amp;gt;/div&amp;lt;&amp;gt;/div&amp;lt;&lt;br /&gt; &lt;br /&gt;+    &amp;gt;div id='sidebarmiddle-wrap1'&amp;lt;&amp;gt;div id='sidebarmiddle-wrap2'&amp;lt;&lt;br /&gt;+      &amp;gt;b:section class='sidebar' id='sidebarmiddle' preferred='yes'&amp;lt;&lt;br /&gt;+&amp;gt;b:widget id='Label1' locked='false' title='Etiquetas' type='Label'&amp;lt;&lt;br /&gt;+&amp;gt;b:includable id='main'&amp;lt;&lt;br /&gt;+  &amp;gt;b:if cond='data:title'&amp;lt;&lt;br /&gt;+    &amp;gt;h2&amp;lt;&amp;gt;data:title/&amp;lt;&amp;gt;/h2&amp;lt;&lt;br /&gt;+  &amp;gt;/b:if&amp;lt;&lt;br /&gt;+  &amp;gt;div class='widget-content'&amp;lt;&lt;br /&gt;+    &amp;gt;ul&amp;lt;&lt;br /&gt;+    &amp;gt;b:loop values='data:labels' var='label'&amp;lt;&lt;br /&gt;+      &amp;gt;li&amp;lt;&lt;br /&gt;+        &amp;gt;b:if cond='data:blog.url == data:label.url'&amp;lt;&lt;br /&gt;+          &amp;gt;span expr:dir='data:blog.languageDirection'&amp;lt;&lt;br /&gt;+            &amp;gt;data:label.name/&amp;lt;&lt;br /&gt;+          &amp;gt;/span&amp;lt;&lt;br /&gt;+        &amp;gt;b:else/&amp;lt;&lt;br /&gt;+          &amp;gt;a expr:dir='data:blog.languageDirection' expr:href='data:label.url'&amp;lt;&lt;br /&gt;+            &amp;gt;data:label.name/&amp;lt;&lt;br /&gt;+          &amp;gt;/a&amp;lt;&lt;br /&gt;+        &amp;gt;/b:if&amp;lt;&lt;br /&gt;+        &amp;gt;span dir='ltr'&amp;lt;(&amp;gt;data:label.count/&amp;lt;)&amp;gt;/span&amp;lt;&lt;br /&gt;+      &amp;gt;/li&amp;lt;&lt;br /&gt;+    &amp;gt;/b:loop&amp;lt;&lt;br /&gt;+    &amp;gt;/ul&amp;lt;&lt;br /&gt;+&lt;br /&gt;+    &amp;gt;b:include name='quickedit'/&amp;lt;&lt;br /&gt;+  &amp;gt;/div&amp;lt;&lt;br /&gt;+&amp;gt;/b:includable&amp;lt;&lt;br /&gt;+&amp;gt;/b:widget&amp;lt;&lt;br /&gt;+&amp;gt;/b:section&amp;lt;&lt;br /&gt;+    &amp;gt;/div&amp;lt;&amp;gt;/div&amp;lt;&lt;br /&gt;+&lt;br /&gt;     &amp;gt;div id='sidebarbottom-wrap1'&amp;lt;&amp;gt;div id='sidebarbottom-wrap2'&amp;lt;&lt;br /&gt;-      &amp;gt;b:section class='sidebar' id='sidebar' preferred='yes'/&amp;lt;&lt;br /&gt;+      &amp;gt;b:section class='sidebar' id='sidebarbot' preferred='yes'&amp;lt;&lt;br /&gt;+&amp;gt;b:widget id='LinkList1' locked='false' title='Enlaces' type='LinkList'&amp;lt;&lt;br /&gt;+&amp;gt;b:includable id='main'&amp;lt;&lt;br /&gt;+&lt;br /&gt;+&amp;gt;b:if cond='data:title'&amp;lt;&amp;gt;h2&amp;lt;&amp;gt;data:title/&amp;lt;&amp;gt;/h2&amp;lt;&amp;gt;/b:if&amp;lt;&lt;br /&gt;+ &amp;gt;div class='widget-content'&amp;lt;&lt;br /&gt;+   &amp;gt;ul&amp;lt;&lt;br /&gt;+     &amp;gt;b:loop values='data:links' var='link'&amp;lt;&lt;br /&gt;+       &amp;gt;li&amp;lt;&amp;gt;a expr:href='data:link.target'&amp;lt;&amp;gt;data:link.name/&amp;lt;&amp;gt;/a&amp;lt;&amp;gt;/li&amp;lt;&lt;br /&gt;+     &amp;gt;/b:loop&amp;lt;&lt;br /&gt;+   &amp;gt;/ul&amp;lt;&lt;br /&gt;+   &amp;gt;b:include name='quickedit'/&amp;lt;&lt;br /&gt;+ &amp;gt;/div&amp;lt;&lt;br /&gt;+&amp;gt;/b:includable&amp;lt;&lt;br /&gt;+&amp;gt;/b:widget&amp;lt;&lt;br /&gt;+&amp;gt;/b:section&amp;lt;&lt;br /&gt;     &amp;gt;/div&amp;lt;&amp;gt;/div&amp;lt;&lt;br /&gt; &lt;br /&gt;   &amp;gt;/div&amp;lt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6412600393589055789?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6412600393589055789/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/barra-lateral-con-tres-cajitas.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6412600393589055789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6412600393589055789'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/barra-lateral-con-tres-cajitas.html' title='Barra lateral con tres cajitas'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6050719599443577653</id><published>2009-04-26T12:02:00.000+02:00</published><updated>2009-05-16T11:37:34.472+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GIF'/><category scheme='http://www.blogger.com/atom/ns#' term='gráficos'/><title type='text'>GIFs animados comprimidos</title><content type='html'>Un poco de Google y encuentro esta &lt;a href="http://www.lcdf.org/gifsicle/"&gt;utilidad para manipular GIFs&lt;/a&gt;.&lt;br /&gt;Trivial de compilar en Cygwin:&lt;br /&gt;&lt;code&gt;./configure --disable-gifview&lt;br /&gt;make&lt;br /&gt;strip src/*.exe&lt;br /&gt;make install&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sólo depende de la biblioteca estándar de C, así que también es trivial compilarlo para Windows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;make distclean&lt;br /&gt;CC=gcc-3 CFLAGS=-mno-cygwin ./configure --disable-gifview&lt;br /&gt;make&lt;br /&gt;strip src/*.exe&lt;br /&gt;make install&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y el comando mejorado para crear GIFs animados se queda en:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg -i avión.wmv -r 10 -vframes 50 -f gif -pix_fmt rgb24 -s 80x60 - |gifsicle -O2 &gt; avión.gif&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6050719599443577653?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6050719599443577653/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/gifs-animados-comprimidos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6050719599443577653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6050719599443577653'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/gifs-animados-comprimidos.html' title='GIFs animados comprimidos'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-9141850402143383727</id><published>2009-04-24T17:09:00.000+02:00</published><updated>2009-04-27T20:36:49.403+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='GIF'/><title type='text'>GIFs animados</title><content type='html'>Hay &lt;a href="http://www.google.es/search?&amp;amp;q=animated+GIF+tool"&gt;montones de herramientas para generar GIFs animados&lt;/a&gt;.&lt;br /&gt;Y &lt;a href="http://www.ffmpeg.org/"&gt;FFmpeg&lt;/a&gt; también puede crearlos.&lt;br /&gt;&lt;br /&gt;No es el mejor en cuanto a la calidad resultante (no busca la paleta de colores óptima), ni cuanto a espacio (los GIF que produce no están comprimidos), pero sí es el que más formatos de entrada admite.&lt;br /&gt;&lt;br /&gt;La situación puede mejorar pronto, porque en marzo se apuntó un &lt;a href="http://wiki.multimedia.cx/index.php?title=Small_FFmpeg_Tasks#GIF_LZW_Encoder_and_extend_Encoder_and_Decoder_to_support_Animated_GIFs"&gt;voluntario para crear GIFs comprimidos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Y ahora, un ejemplo de cómo convertir a GIF animado:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ffmpeg -i avión.wmv -r 10 -vframes 50 -f gif -pix_fmt&lt;/code&gt;&lt;code&gt; rgb24 -s 80x60 avión.gif&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://usuarios.arsystel.com/wzrlpy/pongamosporejemplo/a.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 80px; height: 60px;" src="http://usuarios.arsystel.com/wzrlpy/pongamosporejemplo/a.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-9141850402143383727?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/9141850402143383727/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/gifs-animados.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/9141850402143383727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/9141850402143383727'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/gifs-animados.html' title='GIFs animados'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-3726632437953288023</id><published>2009-04-18T00:42:00.000+02:00</published><updated>2009-04-27T20:36:49.410+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='libgd'/><title type='text'>KDE sobre Windows</title><content type='html'>¡Quién lo podía pensar, si hay &lt;a href="http://windows.kde.org"&gt;KDE para Windows&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;El instalador es muy similiar al de &lt;a href="http://www.cygwin.org"&gt;Cygwin&lt;/a&gt;.&lt;br /&gt;Tiene su entorno de desarrollo basado en MinGW (dice que también puede ser MSVC).&lt;br /&gt;De momento me he bajado las dependencias (iconv, expat, libpng, libjpeg) de &lt;a href="http:/www.libGD.org"&gt;libGD&lt;/a&gt; y &lt;a href="http://home.vrweb.de/~juergen.kahrs/gawk/XML/"&gt;xgawk&lt;/a&gt;, para ver si compilo una versión para MinGW y lo cuelgo junto a los binarios que ya tengo para Cygwin, &lt;a href="http://usuarios.arsystel.com/wzrlpy/xgawk/"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Con algo más de tiempo, igual se puede compilar &lt;a href="http://kdenlive.org"&gt;Kdenlive&lt;/a&gt;, el editor de video.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-3726632437953288023?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/3726632437953288023/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/kde-sobre-windows.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3726632437953288023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/3726632437953288023'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/kde-sobre-windows.html' title='KDE sobre Windows'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4993092451519648525</id><published>2009-04-18T00:25:00.000+02:00</published><updated>2009-04-27T20:36:49.417+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>SWFTools</title><content type='html'>Hoy &lt;a href="http://freshmeat.net"&gt;freshmeat&lt;/a&gt; anuncia versiones nuevas en un par de cosillas de mi interés: &lt;a href="http://www.swftools.org/"&gt;SWFTools&lt;/a&gt; y &lt;a href="http://mathomatic.org"&gt;Mathomatic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Con SWFTools se pueden hacer &lt;a href="http://melusine.eu.org/syracuse/swf/"&gt;animaciones Flash realmente curiosas&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4993092451519648525?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4993092451519648525/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/swftools.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4993092451519648525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4993092451519648525'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/swftools.html' title='SWFTools'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-5044212155955454489</id><published>2009-04-15T18:11:00.000+02:00</published><updated>2009-04-27T20:36:49.431+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='libgd'/><title type='text'>Gráficos desde awk</title><content type='html'>Por mi edad y mi ser austero, soy un fanático de &lt;a href="http://es.wikipedia.org/wiki/Awk"&gt;awk&lt;/a&gt;.&lt;br /&gt;Maravilloso para procesar ficheritos de texto, descubrí que había una variante que procesaba &lt;a href="http://es.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt;, bautizada con el no muy original y sí muy descriptivo nombre de &lt;a href="http://home.vrweb.de/~juergen.kahrs/gawk/XML/"&gt;XMLgawk&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La variante tenía un interesante interfaz para añadir extensiones al lenguaje, así que contribuí con una extensión para usar las funciones gráficas de &lt;a href="http://www.libgd.org/"&gt;libGD&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://usuarios.arsystel.com/wzrlpy/xgawk/"&gt;Aquí&lt;/a&gt; tenéis una austera página con los binarios para Cygwin, y unas someras explicaciones de cómo compilarlos desde los fuentes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-5044212155955454489?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/5044212155955454489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/graficos-desde-awk.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5044212155955454489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/5044212155955454489'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/graficos-desde-awk.html' title='Gráficos desde awk'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4346074403486718493</id><published>2009-04-14T00:01:00.000+02:00</published><updated>2009-04-27T20:36:49.424+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='Matemáticas'/><title type='text'>Polinomios</title><content type='html'>Pues sí, uno de los paquetes de &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; es una &lt;a href="http://www.mathomatic.org/"&gt;calculadora algebraica&lt;/a&gt;, que permite hacer derivadas, integrales, límites, resolver sus raíces, todo sobre polinomios.&lt;br /&gt;&lt;br /&gt;¡Ah si lo hubiera tenido en los tiempos que estudiaba! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4346074403486718493?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4346074403486718493/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/polinomios.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4346074403486718493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4346074403486718493'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/polinomios.html' title='Polinomios'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-9010898340739335355</id><published>2009-04-02T19:17:00.000+02:00</published><updated>2009-04-27T20:36:49.437+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><title type='text'>Traducción de WinFF</title><content type='html'>Hace algún tiempo hice la traducción a mi lengua nativa de &lt;a href="http://winff.org"&gt;WinFF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Si no lo conocéis, os lo recomiendo, creo que es el mejor de los programas que le ponen un interfaz gráfico a &lt;a href="http://ffmpeg.org"&gt;FFmpeg&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Matt ha sacado la versión 1.0beta, así que &lt;a href="http://www.biggmatt.com/forums/index.php?topic=345.msg1132#msg1132"&gt;le he actualizado la traducción&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-9010898340739335355?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/9010898340739335355/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/traduccion-de-winff.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/9010898340739335355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/9010898340739335355'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/04/traduccion-de-winff.html' title='Traducción de WinFF'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-4046134097634365423</id><published>2009-03-24T22:54:00.000+01:00</published><updated>2009-04-27T20:36:49.444+02:00</updated><title type='text'>Adornicos</title><content type='html'>Hoy ponemos un &lt;a href="http://www.favicon.cc/"&gt;favicon&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_y76DxN3V0g4/ScnkGG-o2YI/AAAAAAAAAA4/uRrdSEOvpSo/s1600-h/favicon.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 16px; height: 16px;" src="http://4.bp.blogspot.com/_y76DxN3V0g4/ScnkGG-o2YI/AAAAAAAAAA4/uRrdSEOvpSo/s200/favicon.PNG" alt="" id="BLOGGER_PHOTO_ID_5317031628691265922" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.favicon.cc/"&gt;&lt;/a&gt;que no es sino una miniatura de mi avatar:&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_y76DxN3V0g4/ScnjryBWp5I/AAAAAAAAAAw/bDwdobZPYs4/s1600-h/avatar.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 128px; height: 128px;" src="http://1.bp.blogspot.com/_y76DxN3V0g4/ScnjryBWp5I/AAAAAAAAAAw/bDwdobZPYs4/s200/avatar.png" alt="" id="BLOGGER_PHOTO_ID_5317031176388913042" border="0" /&gt;&lt;/a&gt;Sólo queda ahora poner el favicon en su sitio (que salga junto al enlace en "Favoritos") y plantar el avatar como imagen en la cabecera.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-4046134097634365423?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/4046134097634365423/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/adornicos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4046134097634365423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/4046134097634365423'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/adornicos.html' title='Adornicos'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y76DxN3V0g4/ScnkGG-o2YI/AAAAAAAAAA4/uRrdSEOvpSo/s72-c/favicon.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6786379178060617016</id><published>2009-03-23T18:43:00.000+01:00</published><updated>2009-04-27T20:36:49.472+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gráficos'/><category scheme='http://www.blogger.com/atom/ns#' term='chapuza'/><category scheme='http://www.blogger.com/atom/ns#' term='libgd'/><title type='text'>gd-2.0.36</title><content type='html'>Como parte de nuestra búsqueda de la brevedad y la bondad, vamos a aligerar un poco a &lt;a href="http://www.libgd.org/"&gt;libGD&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;El paquete oficial de Cygwin tiene como dependencias a:&lt;br /&gt;&lt;code&gt;cygwin libXpm4 libfontconfig1 libjpeg62 libpng12&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El problema es que &lt;code&gt;libXpm4 &lt;/code&gt;tiene como dependencias al megapaquetón &lt;code&gt;libX11_6&lt;/code&gt;, sólo para usar las funciones que manejan los bitmaps XPM, así que se puede sustituir por &lt;code&gt;libXpm-noX&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Quitar &lt;code&gt;libfontconfig1&lt;/code&gt;, es fácil: al compilar el fuente de libGD, tenemos una opción durante la configuración.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;libiconv&lt;/code&gt; sólo se usa para convertir de una &lt;a href="http://en.wikipedia.org/wiki/EUC-JP"&gt;oscura codificación de japonés&lt;/a&gt; a Unicode. Así que fuera, mejor usar Unicode directamente para los (ejem, escasos) textos en japonés que yo maneje.&lt;br /&gt;&lt;br /&gt;Otro ahorro es quitar la tipografía de tamaño fijo.&lt;br /&gt;&lt;br /&gt;Así que vamos poco a poco editando los fuentes e intentando compilarlos, y cuando ya ya funciona, guardamos los cambios en un parche:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;diff -u Makefile.am.org Makefile.am &gt; ../patches/libgd.trim.1.diff&lt;br /&gt;diff -u configure.ac.org configure.ac &gt;&gt; ../patches/libgd.trim.1.diff&lt;br /&gt;diff -u config/gdlib-config.in.org config/gdlib-config.in &gt;&gt; ../patches/libgd.trim.1.diff&lt;br /&gt;diff -u gdft.c.org  gdft.c &gt;&gt; ../patches/libgd.trim.1.diff&lt;br /&gt;diff -u gddemo.c.org gddemo.c &gt;&gt; ../patches/libgd.trim.1.diff&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El parche es una chapucilla: lo elegante sería un parche por cambio, y enviarlos a &lt;a href="http://www.libgd.org/"&gt;libGD&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El parche es éste:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;--- Makefile.am.org 2007-11-27 09:30:34.000000000 +0100&lt;br /&gt;+++ Makefile.am 2009-03-19 11:30:01.260819300 +0100&lt;br /&gt;@@ -13,17 +13,19 @@&lt;br /&gt;&lt;br /&gt;EXTRA_DIST = README-JPEG.TXT README.TXT configure.pl bdftogd demoin.png err.out index.html install-item makefile.sample readme.jpn entities.html entities.tcl&lt;br /&gt;&lt;br /&gt;-include_HEADERS = gd.h gdfx.h gd_io.h gdcache.h gdfontg.h gdfontl.h gdfontmb.h gdfonts.h gdfontt.h entities.h&lt;br /&gt;+include_FIXFONTS = gdfontg.h gdfontl.h gdfontmb.h gdfonts.h gdfontt.h&lt;br /&gt;+&lt;br /&gt;+include_HEADERS = gd.h gdfx.h gd_io.h gdcache.h entities.h&lt;br /&gt;&lt;br /&gt;lib_LTLIBRARIES = libgd.la&lt;br /&gt;&lt;br /&gt;-libgd_la_SOURCES = gd.c gdfx.c gd_security.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_gif_in.c gd_gif_out.c gd_io_file.c gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c gd_wbmp.c gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c gdft.c gdhelpers.c gdhelpers.h gdkanji.c gdtables.c gdxpm.c jisx0208.h wbmp.c wbmp.h&lt;br /&gt;+libgd_la_FIXFONTSOURCES = gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c&lt;br /&gt;&lt;br /&gt;-libgd_la_LDFLAGS = -version-info 2:0:0 $(XTRA_LDFLAGS)&lt;br /&gt;+libgd_la_SOURCES = gd.c gdfx.c gd_security.c gd_gd.c gd_gd2.c gd_io.c gd_io_dp.c gd_gif_in.c gd_gif_out.c gd_io_file.c gd_io_ss.c gd_jpeg.c gd_png.c gd_ss.c gd_topal.c gd_wbmp.c gdcache.c gdft.c gdhelpers.c gdhelpers.h gdtables.c gdxpm.c jisx0208.h wbmp.c wbmp.h&lt;br /&gt;&lt;br /&gt;-libgd_la_LIBADD = $(LTLIBICONV)&lt;br /&gt;+libgd_la_LDFLAGS = -version-info 2:0:0 $(XTRA_LDFLAGS)&lt;br /&gt;&lt;br /&gt;-LDADD = ./libgd.la $(LIBICONV)&lt;br /&gt;+LDADD = ./libgd.la&lt;br /&gt;&lt;br /&gt;dist-zip: distdir&lt;br /&gt;zip -qr $(distdir).zip $(distdir)&lt;br /&gt;--- configure.ac.org 2009-03-17 16:42:29.526062500 +0100&lt;br /&gt;+++ configure.ac 2009-03-18 16:44:50.994075200 +0100&lt;br /&gt;@@ -61,19 +61,6 @@&lt;br /&gt;AC_HEADER_STDC&lt;br /&gt;AC_CHECK_HEADERS([errno.h limits.h stddef.h stdlib.h string.h unistd.h])&lt;br /&gt;&lt;br /&gt;-AM_ICONV&lt;br /&gt;-# if test -n "$LIBICONV" ; then&lt;br /&gt;-#   LIBS="$LIBS $LIBICONV"&lt;br /&gt;-# fi&lt;br /&gt;-&lt;br /&gt;-AC_CHECK_HEADERS(iconv.h,&lt;br /&gt;-  [AC_MSG_CHECKING(whether iconv.h defines iconv_t)&lt;br /&gt;-   AC_EGREP_HEADER([typedef.*iconv_t],iconv.h,&lt;br /&gt;-     [AC_MSG_RESULT(yes)&lt;br /&gt;-      AC_DEFINE(HAVE_ICONV_T_DEF, 1,&lt;br /&gt;-                [Define if &lt;iconv.h&gt; defines iconv_t.])],&lt;br /&gt;-      AC_MSG_RESULT(no))])&lt;br /&gt;-&lt;br /&gt;# Checks for typedefs, structures, and compiler characteristics.&lt;br /&gt;#AC_C_CONST&lt;br /&gt;#AC_TYPE_SIZE_T&lt;br /&gt;@@ -524,10 +511,9 @@&lt;br /&gt;&lt;br /&gt;if test "$withval" != no; then&lt;br /&gt; AC_CHECK_LIB(Xpm,XpmReadFileToXpmImage,&lt;br /&gt;-    [LIBS="-lXpm -lX11 $LIBS"&lt;br /&gt;+    [LIBS="-lXpm $LIBS"&lt;br /&gt;    FEATURES="GD_XPM $FEATURES"&lt;br /&gt;-     AC_DEFINE(HAVE_LIBXPM, 1, [ Define if you have the Xpm library. ])],,&lt;br /&gt;-    [-lX11])&lt;br /&gt;+     AC_DEFINE(HAVE_LIBXPM, 1, [ Define if you have the Xpm library. ])])&lt;br /&gt;else&lt;br /&gt; ac_cv_lib_Xpm_XpmReadFileToXpmImage=no&lt;br /&gt;fi&lt;br /&gt;--- config/gdlib-config.in.org 2009-03-19 16:12:36.221283200 +0100&lt;br /&gt;+++ config/gdlib-config.in 2009-03-19 16:12:06.709311200 +0100&lt;br /&gt;@@ -71,7 +71,7 @@&lt;br /&gt;echo @LDFLAGS@&lt;br /&gt;;;&lt;br /&gt;   --libs)&lt;br /&gt;- echo @LIBS@ @LIBICONV@&lt;br /&gt;+ echo @LIBS@&lt;br /&gt;;;&lt;br /&gt;   --cflags|--includes)&lt;br /&gt;echo -I@includedir@&lt;br /&gt;@@ -84,7 +84,7 @@&lt;br /&gt;echo "includedir: $includedir"&lt;br /&gt;echo "cflags:     -I@includedir@"&lt;br /&gt;echo "ldflags:    @LDFLAGS@"&lt;br /&gt;- echo "libs:       @LIBS@ @LIBICONV@"&lt;br /&gt;+ echo "libs:       @LIBS@"&lt;br /&gt;echo "libdir:     $libdir"&lt;br /&gt;echo "features:   @FEATURES@"&lt;br /&gt;;;&lt;br /&gt;--- gdft.c.org 2009-03-20 10:08:09.643623800 +0100&lt;br /&gt;+++ gdft.c 2009-03-20 10:07:19.824264500 +0100&lt;br /&gt;@@ -1081,26 +1081,7 @@&lt;br /&gt;     return "No character set found";&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;-#ifndef JISX0208&lt;br /&gt;-  if (encoding == gdFTEX_Shift_JIS)&lt;br /&gt;-    {&lt;br /&gt;-#endif&lt;br /&gt;-      if ((tmpstr = (char *) gdMalloc (BUFSIZ)))&lt;br /&gt;- {&lt;br /&gt;-   any2eucjp (tmpstr, string, BUFSIZ);&lt;br /&gt;-   next = tmpstr;&lt;br /&gt;- }&lt;br /&gt;-      else&lt;br /&gt;- {&lt;br /&gt;  next = string;&lt;br /&gt;- }&lt;br /&gt;-#ifndef JISX0208&lt;br /&gt;-    }&lt;br /&gt;-  else&lt;br /&gt;-    {&lt;br /&gt;-      next = string;&lt;br /&gt;-    }&lt;br /&gt;-#endif&lt;br /&gt;&lt;br /&gt;#if 0&lt;br /&gt;fprintf(stderr,"dpi=%d,%d metric_res=%d ptsize=%g\n",hdpi,vdpi,METRIC_RES,ptsize);&lt;br /&gt;--- gddemo.c.org 2009-03-20 10:36:35.767539000 +0100&lt;br /&gt;+++ gddemo.c 2009-03-20 10:38:27.198319800 +0100&lt;br /&gt;@@ -38,7 +38,9 @@&lt;br /&gt; int i;&lt;br /&gt;&lt;br /&gt; /* gd fonts for font test */&lt;br /&gt;+#ifdef CONFIG_FIXFONT&lt;br /&gt; gdFontPtr fonts[5];&lt;br /&gt;+#endif&lt;br /&gt; int y;&lt;br /&gt;&lt;br /&gt; /* Create output image, in true color. */&lt;br /&gt;@@ -136,6 +138,7 @@&lt;br /&gt;     /* Draw the styled, brushed line */&lt;br /&gt;     gdImageLine (im_out, 0, 255, 255, 0, gdStyledBrushed);&lt;br /&gt;   }&lt;br /&gt;+#ifdef CONFIG_FIXFONT&lt;br /&gt; /* Text (non-truetype; see gdtestft for a freetype demo) */&lt;br /&gt; fonts[0] = gdFontGetTiny ();&lt;br /&gt; fonts[1] = gdFontGetSmall ();&lt;br /&gt;@@ -156,6 +159,7 @@&lt;br /&gt;        (unsigned char *) "hi", red);&lt;br /&gt;     y += fonts[i]-&gt;h;&lt;br /&gt;   }&lt;br /&gt;+#endif&lt;br /&gt; /* Random antialiased lines; coordinates all over the image,&lt;br /&gt;    but the output will respect a small clipping rectangle */&lt;br /&gt; gdImageSetClip (im_out, 0, gdImageSY (im_out) - 100,&lt;br /&gt;&lt;/iconv.h&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Los comandos para configurar y compilar quedan así:&lt;br /&gt;&lt;code&gt;LC_ALL=C autoreconf -i&lt;br /&gt;CC=gcc-4 TMPDIR=/tmp CFLAGS="-march=core2 -DXPM_NO_X" ./configure --x-includes=/usr/include/noX --x-libraries=/usr/lib/noX --with-xpm --without-x --without-fontconfig&lt;br /&gt;LC_ALL=C TMPDIR=/tmp make&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6786379178060617016?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6786379178060617016/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/gd-2036.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6786379178060617016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6786379178060617016'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/gd-2036.html' title='gd-2.0.36'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-8008027809711177677</id><published>2009-03-17T02:35:00.000+01:00</published><updated>2009-04-27T20:36:49.463+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='yasm'/><category scheme='http://www.blogger.com/atom/ns#' term='x264'/><title type='text'>x264-20090315</title><content type='html'>Toca compilar &lt;a href="http://www.videolan.org/developers/x264.html"&gt;x264&lt;/a&gt; para &lt;a href="http://www.cygwin.com"&gt;Cygwin&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Cogemos el &lt;a href="ftp://ftp.videolan.org/pub/videolan/x264/snapshots/"&gt;x264 de hoy&lt;/a&gt;, y, como cuando detecta a Cygwin lo que hace es una compilación cruzada para &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt;, le aplicamos un parche:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;patch &amp;lt; x264.cygwin.diff&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El contenido de &lt;code&gt;x264.cygwin.diff&lt;/code&gt; es:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;diff --git a/configure b/configure&lt;br /&gt;index eb51091..31da92e 100755&lt;br /&gt;--- a/configure&lt;br /&gt;+++ b/configure&lt;br /&gt;@@ -212,11 +212,8 @@ case $host_os in&lt;br /&gt;LDFLAGS="$LDFLAGS -lm"&lt;br /&gt;;;&lt;br /&gt;cygwin*)&lt;br /&gt;-    SYS="MINGW"&lt;br /&gt;-    CFLAGS="$CFLAGS -mno-cygwin"&lt;br /&gt;-    LDFLAGS="$LDFLAGS -mno-cygwin"&lt;br /&gt;+    SYS="CYGWIN"&lt;br /&gt;EXE=".exe"&lt;br /&gt;-    DEVNULL="NUL"&lt;br /&gt;;;&lt;br /&gt;mingw*)&lt;br /&gt;SYS="MINGW"&lt;br /&gt;@@ -241,6 +238,8 @@ case $host_cpu in&lt;br /&gt;ASFLAGS="-O2"&lt;br /&gt;if [ "$SYS" = MACOSX ]; then&lt;br /&gt;ASFLAGS="$ASFLAGS -f macho -DPREFIX"&lt;br /&gt;+    elif [ "$SYS" = CYGWIN ]; then&lt;br /&gt;+      ASFLAGS="$ASFLAGS -f win32 -DPREFIX"&lt;br /&gt;elif [ "$SYS" = MINGW ]; then&lt;br /&gt;ASFLAGS="$ASFLAGS -f win32 -DPREFIX"&lt;br /&gt;else&lt;br /&gt;@@ -368,6 +367,8 @@ fi&lt;br /&gt;if [ "$avis_input" = "auto" ] ; then&lt;br /&gt;if [ $SYS = MINGW ]; then&lt;br /&gt;avis_input="yes"&lt;br /&gt;+    elif [ "$SYS" = CYGWIN ]; then&lt;br /&gt;+        avis_input="yes"&lt;br /&gt;else&lt;br /&gt;avis_input="no";&lt;br /&gt;fi&lt;br /&gt;@@ -440,6 +441,10 @@ if [ "$shared" = "yes" ]; then&lt;br /&gt;echo "SONAME=libx264-$API.dll" &amp;gt;&amp;gt; config.mak&lt;br /&gt;echo 'IMPLIBNAME=libx264.dll.a' &amp;gt;&amp;gt; config.mak&lt;br /&gt;echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' &amp;gt;&amp;gt; config.mak&lt;br /&gt;+    elif [ "$SYS" = CYGWIN ]; then&lt;br /&gt;+        echo "SONAME=libx264-$API.dll" &amp;gt;&amp;gt; config.mak&lt;br /&gt;+        echo 'IMPLIBNAME=libx264.dll.a' &amp;gt;&amp;gt; config.mak&lt;br /&gt;+        echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' &amp;gt;&amp;gt; config.mak&lt;br /&gt;elif [ "$SYS" = "MACOSX" ]; then&lt;br /&gt;echo "SOSUFFIX=dylib" &amp;gt;&amp;gt; config.mak&lt;br /&gt;echo "SONAME=libx264.$API.dylib" &amp;gt;&amp;gt; config.mak&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esta es mi configuración:&lt;br /&gt;&lt;code&gt;CC=gcc-4 ./configure --disable-mp4-output --extra-cflags=-march=core2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Le damos caña y casca:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Found no assembler&lt;br /&gt;Minimum version is yasm-0.6.1&lt;br /&gt;If you really want to compile without asm, configure with --disable-asm.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Vaya, requiere &lt;a href="http://www.tortall.net/projects/yasm/"&gt;yasm&lt;/a&gt; y no lo tengo instalado en mi Cygwin 1.7. Bueno pero lo tengo para Cygwin 1.5, bajado de &lt;a href="http://sourceware.org/cygwinports/"&gt;Cygwin Ports&lt;/a&gt;, y se supone que hay compatibilidad hacia delante.&lt;br /&gt;&lt;br /&gt;En mi Cygwin 1.5, &lt;code&gt;cygcheck -l yasm&lt;/code&gt; me dice lo que tengo que copiar, y &lt;code&gt;cygcheck /usr/bin/yasm.exe&lt;/code&gt; me dice las dependencias (las DLLs que también habrá que copiar si no existen ya).&lt;br /&gt;&lt;br /&gt;Así que ejecuto en mi Cygwin 1.7:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd /bin &amp;amp;&amp;amp; cp -p /cygdrive/c/cygwin/bin/yasm.exe .&lt;br /&gt;cd /usr/include &amp;amp;&amp;amp; cp -pri /cygdrive/c/cygwin/usr/include/libyasm .&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Y ahora ya funciona:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ CC=gcc-4 ./configure --disable-mp4-output --extra-cflags=-march=core2&lt;br /&gt;./version.sh: line 2: git: command not found&lt;br /&gt;Platform:   X86&lt;br /&gt;System:     CYGWIN&lt;br /&gt;asm:        yes&lt;br /&gt;avis input: yes&lt;br /&gt;mp4 output: no&lt;br /&gt;pthread:    yes&lt;br /&gt;debug:      no&lt;br /&gt;gprof:      no&lt;br /&gt;PIC:        no&lt;br /&gt;shared:     no&lt;br /&gt;visualize:  no&lt;br /&gt;You can run 'make' or 'make fprofiled' now.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Bueno hay un errorcillo, pero &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; sólo se usa para poner la versión.&lt;br /&gt;&lt;br /&gt;Así que &lt;code&gt;make &amp;amp;&amp;amp; make install&lt;/code&gt; y ya tenemos &lt;code&gt;libx264&lt;/code&gt; disponible.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-8008027809711177677?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/8008027809711177677/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/x264-20090315.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8008027809711177677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/8008027809711177677'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/x264-20090315.html' title='x264-20090315'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-2618377769676339239</id><published>2009-03-16T22:32:00.000+01:00</published><updated>2009-04-27T20:36:49.456+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cygwin'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><title type='text'>ffmpeg-17998</title><content type='html'>Los chicos de &lt;a href="http://cygwin.com/"&gt;Cygwin&lt;/a&gt; han sacado la &lt;a href="http://cygwin.com/ml/cygwin/2009-03/msg00378.html"&gt;versión 4.3.2-2 de gcc&lt;/a&gt;. Vamos a probarla con el &lt;a href="http://ffmpeg.org/releases/ffmpeg-checkout-snapshot.tar.bz2"&gt;ffmpeg de hoy&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Aprovechando que  gcc 4.3.x permite optimizar para &lt;a href="http://es.wikipedia.org/wiki/Intel_Core_2"&gt;Core2&lt;/a&gt;, uso esta configuración:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;./configure --cc=gcc-4 --enable-shared --disable-static --cpu=core2 --enable-gpl --enable-avfilter --enable-avfilter-lavf --enable-pthreads --enable-avisynth --enable-bzlib --enable-zlib --build-suffix=-SVN&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Decimos &lt;code&gt;make&lt;/code&gt; y, vaya, hombre, salen errores:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;libavformat/rtsp.o: In function `__ntohl':&lt;br /&gt;/usr/include/asm/byteorder.h:40: multiple definition of `___ntohl'&lt;br /&gt;libavformat/os_support.o:/usr/include/asm/byteorder.h:40: first defined here&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¿De dónde viene esto? Pues hay tres motivos encadenados:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; FFmpeg le pasa -std=c99 al compilador&lt;/li&gt;&lt;li&gt;La versión 4.3.x de gcc cambia la &lt;a href="http://en.opensuse.org/GCC_4.3_Transition#C99_inline_semantics_changes"&gt;semántica del comando inline en modo C99&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Los "includes" de las funciones C de Cygwin no cumplen la norma C99.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;¿Qué soluciones hay?&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;La fácil, quitamos el trozo que casca, o sea &lt;code&gt;añadimos --disable-network&lt;/code&gt; a nuestra configuración.&lt;/li&gt;&lt;li&gt;La complicada, avisar en &lt;a href="http://cygwin.com/ml/cygwin/"&gt;la lista de correo de Cygwin&lt;/a&gt; que habría que soportar C99 en los "includes".&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Es lunes, así que vamos a usar la opción 1.&lt;br /&gt;&lt;br /&gt;Ahora funciona la cosa, pero otra tarea pendiente es enviar un parche a &lt;a href="http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/"&gt;ffmpeg-devel&lt;/a&gt; para no tener que hacer esta &lt;a href="http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-June/009200.html"&gt;chapucilla con las compilaciones que crean bibliotecas compartidas&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-2618377769676339239?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/2618377769676339239/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/ffmpeg-17998.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2618377769676339239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/2618377769676339239'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/ffmpeg-17998.html' title='ffmpeg-17998'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8898534484367942134.post-6991938639369661830</id><published>2009-03-04T22:19:00.000+01:00</published><updated>2009-04-27T20:36:49.479+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><title type='text'>El mejor conversor de multimedia</title><content type='html'>Claro, es &lt;a href="http://ffmpeg.org/" target="_blank"&gt;FFmpeg&lt;/a&gt;, y casi todo lo demás está basado en él.&lt;br /&gt;&lt;br /&gt;El resto no son tan versátiles, sino que se limitan a manejar un formato o dos como mucho:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mjpeg.sourceforge.net/" target="_blank"&gt;mjpegtools&lt;/a&gt; (MPEG, MJPEG, YUV4MPEG)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://libdv.sourceforge.net/" target="_blank"&gt;libdv&lt;/a&gt; (DV)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xvid.org/" target="_blank"&gt;xvid&lt;/a&gt; (MPEG4)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.videolan.org/developers/x264.html" target="_blank"&gt;x264&lt;/a&gt; (H.264)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8898534484367942134-6991938639369661830?l=lineadecomandos.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lineadecomandos.blogspot.com/feeds/6991938639369661830/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/el-mejor-conversor-de-multimedia.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6991938639369661830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8898534484367942134/posts/default/6991938639369661830'/><link rel='alternate' type='text/html' href='http://lineadecomandos.blogspot.com/2009/03/el-mejor-conversor-de-multimedia.html' title='El mejor conversor de multimedia'/><author><name>Víctor Paesa</name><uri>http://www.blogger.com/profile/04201622293194323204</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_y76DxN3V0g4/ScedLeCpzbI/AAAAAAAAAAM/DzUyRPTuE9A/S220/avatar.png'/></author><thr:total>0</thr:total></entry></feed>
