<?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-957467034762846168</id><updated>2012-02-15T19:27:35.374-03:00</updated><category term='flash'/><category term='red'/><category term='proxy'/><category term='postgresql'/><category term='south'/><category term='javascript'/><category term='pip'/><category term='icinga'/><category term='fonts'/><category term='glassfish'/><category term='vmplayer'/><category term='tomcat'/><category term='wine'/><category term='multiarch'/><category term='openoffice'/><category term='electronica'/><category term='gnome'/><category term='firefox'/><category term='virtualizacion'/><category term='aplicaciones web'/><category term='yum'/><category term='pyarduinoproxy'/><category term='fabric'/><category term='git'/><category term='responsabilidad social empresaria'/><category term='python'/><category term='extension'/><category term='gpath'/><category term='upstart'/><category term='findbugs'/><category term='debian'/><category term='openvpn'/><category term='aptitude'/><category term='eclipse'/><category term='image'/><category term='autenticacion'/><category term='jee'/><category term='kvm'/><category term='thunderbird'/><category term='virtualenv'/><category term='xen'/><category term='libvirt'/><category term='linux'/><category term='apache'/><category term='arduino'/><category term='xml'/><category term='hibernate'/><category term='centos'/><category term='ant'/><category term='jsf'/><category term='mysql'/><category term='java'/><category term='hoy_descubri'/><category term='ajax'/><category term='webdav'/><category term='nagios'/><category term='apt'/><category term='gtk'/><category term='xmlrpc'/><category term='monitoring'/><category term='hudson'/><category term='django'/><category term='mongodb'/><category term='kde'/><category term='squid'/><category term='permisos'/><category term='object storage'/><category term='android'/><category term='annotation'/><category term='appengine'/><category term='desktop'/><category term='wtp'/><category term='groovy'/><category term='sheepdog'/><category term='mac'/><category term='openwrt'/><category term='jboss'/><category term='equivs'/><category term='server'/><category term='samba'/><category term='qemu'/><category term='xpcom'/><category term='ubuntu'/><category term='testing'/><category term='j2ee'/><category term='iptables'/><category term='oneiric'/><category term='prototype'/><title type='text'>Blog de Horacio de Oro</title><subtitle type='html'>Hola! En este blog encontrarás mis experiencias del ámbito profesional. Hace años me dedico a servidores Linux y desarrollo Web con Java y Python. Te invito a que accedas a la solapa "Más información".</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default?start-index=101&amp;max-results=100'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>123</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7445761377686919919</id><published>2012-02-09T18:15:00.001-03:00</published><updated>2012-02-09T18:15:19.369-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hoy_descubri'/><title type='text'>Hoy descubrí: vipw y vigr</title><content type='html'>La idea es muy sencilla: permite editar &lt;b&gt;/etc/passwd&lt;/b&gt; y &lt;b&gt;/etc/group&lt;/b&gt; (o sus correspondientes 'shadows') luego de obtener un LOCK, y así evitar que varias personas los editen a la vez (aunque yo siempre prefiero usar comandos para alterar dichos archivos (usermod, chsh, etc) y no editarlos directamente).&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7445761377686919919?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7445761377686919919/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7445761377686919919' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7445761377686919919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7445761377686919919'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/hoy-descubri-vipw-y-vigr.html' title='Hoy descubrí: vipw y vigr'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-359369204995730390</id><published>2012-02-08T11:55:00.002-03:00</published><updated>2012-02-08T11:55:16.436-03:00</updated><title type='text'>Implementé encabezados de Fabric en colores</title><content type='html'>&lt;br /&gt;He realizado unos cambios en Fabric para que utilice colores en los mensajes que escribe. Esto facilita mucho la visualización al ejecutar tareas que generan mucha salida por consola.&lt;br /&gt;&lt;br /&gt;Así es la salida original de Fabric:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1i1ip1x16mQ/TzKMLcG1TxI/AAAAAAAAAds/BI7ukalH_EM/s1600/fabric-normal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-1i1ip1x16mQ/TzKMLcG1TxI/AAAAAAAAAds/BI7ukalH_EM/s640/fabric-normal.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Al colorear los mensajes de Fabric, el resultado es mucho más fácil de leer:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-nIvsKGTNzZ8/TzKLV6Tdp7I/AAAAAAAAAdk/a-5WUny8eAA/s1600/fabric-color.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-nIvsKGTNzZ8/TzKLV6Tdp7I/AAAAAAAAAdk/a-5WUny8eAA/s640/fabric-color.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esto se encuentra en mi fork de Fabric, en&amp;nbsp;&lt;a href="https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro"&gt;https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro&lt;/a&gt;&amp;nbsp;(para versión estable) o&amp;nbsp;&lt;a href="https://github.com/hgdeoro/fabric/tree/colorized_headers"&gt;https://github.com/hgdeoro/fabric/tree/colorized_headers&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-359369204995730390?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/359369204995730390/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=359369204995730390' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/359369204995730390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/359369204995730390'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/implemente-encabezados-de-fabric-en.html' title='Implementé encabezados de Fabric en colores'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-1i1ip1x16mQ/TzKMLcG1TxI/AAAAAAAAAds/BI7ukalH_EM/s72-c/fabric-normal.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-483548596987703814</id><published>2012-02-07T22:46:00.002-03:00</published><updated>2012-02-07T22:46:14.718-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Mejora a Logging por default en Django</title><content type='html'>La configuración por default de LOGGING de Django hace que no se muestren por consola los mensajes de logging generados, sólo muestra los requests, y hacer que se vean nuestros mensajes es bastante fácil, sólo hay que agregar a LOGGING (en settings.py) las líneas en negritas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;LOGGING = {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; 'version': 1,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; 'disable_existing_loggers': False,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; 'handlers': {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'mail_admins': {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'level': 'ERROR',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'class': 'django.utils.log.AdminEmailHandler'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'console': {&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'level': 'INFO',&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'class': 'logging.StreamHandler'&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; 'loggers': {&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; '': {&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'handlers': ['console'],&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'level': 'INFO',&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'propagate': True,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'django.request': {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'handlers': ['mail_admins'],&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'level': 'ERROR',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'propagate': True,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;(esto funcionará en Django &amp;gt;= 1.3)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-483548596987703814?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/483548596987703814/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=483548596987703814' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/483548596987703814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/483548596987703814'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/mejora-logging-por-default-en-django.html' title='Mejora a Logging por default en Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8398647516653760177</id><published>2012-02-05T17:38:00.000-03:00</published><updated>2012-02-05T17:38:19.672-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fabric'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Mejorando listado de task en Fabric</title><content type='html'>Cuando al usar Fabric listamos los comandos disponibles con --list, este listado está restringido a un ancho de 75 caracteres. Pero al usar una terminal de 160 caracteres de ancho, es mucho el espacio desperdiciado, y la documentación "ocultada".&lt;br /&gt;&lt;br /&gt;Hice unos cambios en Fabric para que, al listar los comandos, utilice todo el ancho disponible. Antes, con una columna de 160 caracteres, el listado se mostraba:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Available commands:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; FabricTest &amp;nbsp; &amp;nbsp;Nose-oriented test runner which wipes state.env and provid...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; TestParallel&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; eq_ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Shadow of the Nose builtin which presents easier to read m...&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; server &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Returns a decorator that runs an SSH server during functio...&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Available commands:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; FabricTest &amp;nbsp; &amp;nbsp;Nose-oriented test runner which wipes state.env and provides file helpers.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; TestParallel&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; eq_ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Shadow of the Nose builtin which presents easier to read multiline output.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; server &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Returns a decorator that runs an SSH server during function execution.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estos cambios están disponibles en &lt;a href="https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro" target="_blank"&gt;mi fork de Fabric&lt;/a&gt;&amp;nbsp;y puede ser instalado ejecutando "&lt;b&gt;pip install -e git+https://github.com/hgdeoro/fabric@1.3-hgdeoro#egg=fabric&lt;/b&gt;"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8398647516653760177?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8398647516653760177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8398647516653760177' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8398647516653760177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8398647516653760177'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/mejorando-listado-de-task-en-fabric.html' title='Mejorando listado de task en Fabric'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7258269896349463012</id><published>2012-02-05T00:46:00.002-03:00</published><updated>2012-02-05T00:47:43.175-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fabric'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Fabric: unsupported operand type(s) for &amp;: 'str' and 'int'</title><content type='html'>Me ocurrió que&amp;nbsp;upload_template() de Fabric fallaba con el siguiente mensaje de error:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Fatal error: put() encountered an exception while uploading '&amp;lt;StringIO.StringIO instance at 0x7fb4b6e0e368&amp;gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Underlying exception message:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; unsupported operand type(s) for &amp;amp;: 'str' and 'int'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Aborting.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Lo que estaba haciendo era bastante simple:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; upload_template(&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; os.path.join('deploy-files', 'nginx', 'nginx-template.conf'),&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nginx_config_file_to,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context=context,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; use_sudo=True, backup=False, mode='0644')&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pero claro, resulta que el modo debe ser un valor en OCTAL, y no un STRING! Cambiando el modo de string a octal solucionó el problema:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; upload_template(&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; os.path.join('deploy-files', 'nginx', 'nginx-template.conf'),&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nginx_config_file_to,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context=context,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; use_sudo=True, backup=False, &lt;b&gt;mode=0644&lt;/b&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Es algo simple, pero lo comparto porque no encontré mucha información al buscar dicho mensaje de error en internet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7258269896349463012?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7258269896349463012/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7258269896349463012' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7258269896349463012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7258269896349463012'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/fabric-unsupported-operand-types-for.html' title='Fabric: unsupported operand type(s) for &amp;: &apos;str&apos; and &apos;int&apos;'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6602557098825820428</id><published>2012-02-04T22:10:00.002-03:00</published><updated>2012-02-04T22:20:30.848-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Nuevo "list format" para Fabric</title><content type='html'>He implementado un nuevo "list format" para Fabric. Este nuevo formateador hace que se muestren las distintas "tasks" declaradas, junto a la documentacion completa de las mismas.&lt;br /&gt;&lt;br /&gt;Está disponibles en un branch de master (&lt;a href="https://github.com/hgdeoro/fabric/tree/new_list_format_fulldoc"&gt;https://github.com/hgdeoro/fabric/tree/new_list_format_fulldoc&lt;/a&gt;) en un un branch de 1.3 (&lt;a href="https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro"&gt;https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Por ejemplo, al ejecutar Fabric sobre "tests/test_parallel.py" con los argumentos "--list --list-format=fulldoc", se genera el siguiente listado:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-size: xxx-small;"&gt;&lt;pre style="font-size: xxx-small;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Available commands:&lt;br /&gt;&lt;br /&gt;    FabricTest&lt;br /&gt;    ----------&lt;br /&gt;        Nose-oriented test runner which wipes state.env and provides file helpers.&lt;br /&gt;&lt;br /&gt;    TestParallel&lt;br /&gt;    ------------&lt;br /&gt;&lt;br /&gt;    eq_&lt;br /&gt;    ---&lt;br /&gt;        Shadow of the Nose builtin which presents easier to read multiline output.&lt;br /&gt;&lt;br /&gt;    server&lt;br /&gt;    ------&lt;br /&gt;        Returns a decorator that runs an SSH server during function execution.&lt;br /&gt;        Direct passthrough to ``serve_responses``.&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para instalarlo via pip:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$ pip install -e git+https://github.com/hgdeoro/fabric@1.3-hgdeoro#egg=fabric&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6602557098825820428?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6602557098825820428/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6602557098825820428' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6602557098825820428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6602557098825820428'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/nuevo-list-format-para-fabric.html' title='Nuevo &quot;list format&quot; para Fabric'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8788608577216830325</id><published>2012-02-04T20:50:00.000-03:00</published><updated>2012-02-04T20:58:17.527-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Contribuyendo a proyectos OpenSource via GitHub</title><content type='html'>Hace tiempo uso GitHub para mis proyectos open source, pero hoy pude usarlo para compartir un pequeño FIX que hice a Fabric, y la verdad es que hace muy sencillo el trabajo.&lt;br /&gt;&lt;br /&gt;El fix es algo insignificante (en una clase hay 2 métodos con el mismo nombre). Lo que hice fue renombrarlo el método, y&amp;nbsp;después&amp;nbsp;investigar qué tan fácil sería compartirlo con los autores de Fabric... y resultó muy fácil. Teniendo en cuenta que yo ya había clonado el proyecto (en modo solo-lectura), los pasos que seguí fueron:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;busqué en la doc. de GitHub cómo hacerlo, y lo encontré inmediatamente:&amp;nbsp;&lt;a href="http://help.github.com/send-pull-requests/"&gt;http://help.github.com/send-pull-requests/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;creé un fork del proyecto original&lt;/li&gt;&lt;ul&gt;&lt;li&gt;esto se hace con 1 clic en la interfaz web de GitHub&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;cambié el "remote" a mi fork&lt;/li&gt;&lt;ul&gt;&lt;li&gt;git remote set-url origin git@github.com:hgdeoro/fabric.git&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;creé un branch&lt;/li&gt;&lt;ul&gt;&lt;li&gt;git branch fix_duplicated_test_method&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;realicé el commit con las modificaciones&lt;/li&gt;&lt;li&gt;hice el push&lt;/li&gt;&lt;ul&gt;&lt;li&gt;git push origin fix_duplicated_test_method:fix_duplicated_test_method&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;en la interfaz web de GitHub me cambié al branch&amp;nbsp;fix_duplicated_test_method&lt;/li&gt;&lt;li&gt;en la interfaz web de GitHub hice clic en "Pull Request"&amp;nbsp; y cargué el mensaje&lt;/li&gt;&lt;/ol&gt;El pull request puede verse aqui:&amp;nbsp;&lt;a href="https://github.com/fabric/fabric/pull/549/files"&gt;https://github.com/fabric/fabric/pull/549/files&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8788608577216830325?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8788608577216830325/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8788608577216830325' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8788608577216830325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8788608577216830325'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/contribuyendo-proyectos-opensource-via.html' title='Contribuyendo a proyectos OpenSource via GitHub'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1659494148368585534</id><published>2012-02-04T15:27:00.001-03:00</published><updated>2012-02-09T17:32:38.635-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='samba'/><title type='text'>Samba4 en CentOS 6.2</title><content type='html'>&lt;br /&gt;Siguiendo los pasos de&amp;nbsp;&lt;a href="https://wiki.samba.org/index.php/Samba4/HOWTO"&gt;https://wiki.samba.org/index.php/Samba4/HOWTO&lt;/a&gt;, con un CentOS 6.2 recién instalado, estos son los pasos que seguí para instalar Samba 4:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Preparacion del entorno&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;crear usuario para NO trabajar con root, configurar keys de ssh y sudo&lt;/i&gt;&lt;/li&gt;&lt;li&gt;instalar paquetes básicos&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# curl -o epel-release-6-5.noarch.rpm \&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# sudo rpm -i epel-release-6-5.noarch.rpm&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# sudo yum install -y man&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;sudo yum install -y gcc patch&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# sudo yum install -y autoconf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Compilado de Samba 4&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;instalamos git&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# sudo yum install -y git&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;instalamos paquetes recomendados&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$ yum install libacl-devel libblkid-devel gnutls-devel readline-devel python-devel gdb pkgconfig&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$ yum install gtkhtml setroubleshoot-server setroubleshoot-plugins policycoreutils-python libsemange-python setools-libs-python setools-libs popt-devel&amp;nbsp;libpcap-devel sqlite-devel libidn-devel libxml2-devel libacl-devel libsepol-devel libattr-devel keyutils-libs-devel zlib-devel cyrus-sasl-devel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al instalarlos con el comando anterior, me apareció:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;(...)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;No package &lt;b&gt;gtkhtml&lt;/b&gt; available.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;No package &lt;b&gt;libsemange-python&lt;/b&gt; available.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;(...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;pero me imagino que no son paquetes esenciales...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bajamos repositorio Git y compilamos&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;git clone git://git.samba.org/samba.git samba-master&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# cd samba-master&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora deberemos "parchear" unos scripts Python que tienen un bug (esto no hará falta cuando los arreglos a estos scripts estén en git). Para parchearlos hay que ejecutar (en una misma línea):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# curl -s https://raw.github.com/gist/1739239/a8a38ef99dae9c5a12bc6939d59161dcc1f2fa5a/use-named-argument-dir-instead-of-prefix.diff | patch -p1&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Este comando fallará si los scripts fueron arreglados en el repositorio de Git (al menos los parches ya fueron aceptados :-D &amp;nbsp;&lt;a href="https://lists.samba.org/archive/samba-technical/2012-February/081527.html"&gt;https://lists.samba.org/archive/samba-technical/2012-February/081527.html&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora continuamos con el proceso:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;./configure.developer --prefix=/opt/samba4-3bea5a147b&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Nota: '3bea5a147b' es el commit (abreviado) de Git, sirve para identificar exactamente que versión estamos instalado. Se obtiene ejecutando: `&lt;b&gt;git log --oneline | head -n 1 | cut -d " " -f 1&lt;/b&gt;`&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;make -j2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;sudo mkdir /opt/samba4-3bea5a147b&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;sudo chown USUARIO /opt/samba4-3bea5a147b&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El próximo paso sería generar los archivos básicos que necesita Samba para funcionar. Esto se hace con el script "provision", pero al parecer al algún problema con el último comando que ejecutamos ("make install"): éste modifica algunos archivos y hace que se produzca un error al intentar ejecutar "provision". Por lo tanto, antes de ejecutar "provision", debemos volve a ejecutar "make" (&lt;a href="https://lists.samba.org/archive/samba-technical/2012-February/081526.html"&gt;https://lists.samba.org/archive/samba-technical/2012-February/081526.html&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;make -j2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# sudo ./source4/setup/provision \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; --realm=samdom.example.com \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; --domain=SAMDOM \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;--adminpass=SOMEPASSWORD \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;--server-role='domain controller'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Listo! Ya tenemos Samba4 instalado en /opt. Ahora queda lanzar el proceso:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# sudo /opt/samba4-3bea5a147b/sbin/samba -i -M single&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Aunque Samba ya está andando, queda pendiente su configurar, configuración de DNS, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;EDITADO&lt;/u&gt;&lt;/b&gt;: &amp;nbsp;siguiendo el consejo del HOWTO, hace falta agregar el dominio en /etc/resolv.conf (una linea al estilo de "domain samdom.example.com")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;EDITADO&lt;/u&gt;&lt;/b&gt;: &amp;nbsp;el password seteado con "--adminpass" no debe ser simple, sino el proceso fallará con el error "check_password_restrictions: the password does not meet the complexity criteria!".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1659494148368585534?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1659494148368585534/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1659494148368585534' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1659494148368585534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1659494148368585534'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/samba4-en-centos-62.html' title='Samba4 en CentOS 6.2'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-67221169947802078</id><published>2012-02-04T13:25:00.000-03:00</published><updated>2012-02-04T13:25:24.747-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Corriendo tests con instancia de PostgreSql en ram</title><content type='html'>Otra manera de optimizar la ejecución de tests de Django, pero &lt;b&gt;SIN&lt;/b&gt; modificar la instalación de PostgreSql del sistema operativo es crear una &lt;b&gt;nueva instancia&lt;/b&gt;, corriendo totalmente en ram.&lt;br /&gt;&lt;br /&gt;Para crear una nueva instancia usamos &lt;b&gt;initdb&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$ /usr/lib/postgresql/9.1/bin/&lt;/span&gt;&lt;b style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;initdb&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt; \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; --pgdata=/dev/shm/pgtesting \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; -U horacio&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y para lanzar la instancia en segundo plano:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$ /usr/lib/postgresql/9.1/bin/&lt;b&gt;postgres&lt;/b&gt;&amp;nbsp;\&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; -F -i -p 5444 -S $((1024*64)) \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; -D /dev/shm/pgtesting \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; --unix_socket_directory=/dev/shm/pgtesting \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;-r /dev/shm/pgtesting/postgresql.log &amp;amp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Luego creamos el usuario y BD para la aplicación Django:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;psql -h 127.0.0.1 \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; -c "create user vindler with password 'x' superuser" postgres&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;psql -h 127.0.0.1 \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; -c "create database vindler owner vindler" postgres&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mejora en tiempos de ejecución de test: 28%&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La ejecución de los tests con PostgreSql en disco, con las optimizaciones de mi &lt;a href="http://blog.hgdeoro.com.ar/2012/02/acelerando-tests-de-django-con.html" target="_blank"&gt;artículo anterior&lt;/a&gt;&amp;nbsp;tardan alrededor de &lt;b&gt;&lt;u&gt;7 segundos&lt;/u&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 18 tests in &lt;b&gt;7.071s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;5.44user 0.58system &lt;b&gt;0:10.40elapsed&lt;/b&gt; 57%CPU (0avgtext+0avgdata 122880maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+1184outputs (0major+16964minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 18 tests in &lt;b&gt;6.843s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;5.28user 0.65system &lt;b&gt;0:10.27elapsed&lt;/b&gt; 57%CPU (0avgtext+0avgdata 122976maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+1176outputs (0major+16956minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 18 tests in &lt;b&gt;7.032s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;5.42user 0.64system &lt;b&gt;0:10.42elapsed&lt;/b&gt; 58%CPU (0avgtext+0avgdata 124304maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+1168outputs (0major+17122minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Los mismos tests ejecutandose en la nueva instancia de PostgreSql totalmente en ram, tardan alrededor de &lt;b&gt;&lt;u&gt;5 segundos&lt;/u&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 18 tests in &lt;b&gt;5.220s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.41user 0.65system &lt;b&gt;0:08.38elapsed&lt;/b&gt; 60%CPU (0avgtext+0avgdata 117904maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;8inputs+1176outputs (0major+16524minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 18 tests in &lt;b&gt;5.047s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.32user 0.53system &lt;b&gt;0:08.04elapsed&lt;/b&gt; 60%CPU (0avgtext+0avgdata 117888maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+1168outputs (0major+16504minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 18 tests in &lt;b&gt;4.665s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;3.95user 0.64system &lt;b&gt;0:07.79elapsed&lt;/b&gt; 58%CPU (0avgtext+0avgdata 117856maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+1176outputs (0major+16502minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Al ejecutar los tests de stress: 33%&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Con PostgreSql en disco:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 1 test in &lt;b&gt;24.601s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;15.21user 2.72system &lt;b&gt;0:27.98elapsed&lt;/b&gt; 64%CPU (0avgtext+0avgdata 130944maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+9616outputs (0major+18298minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 1 test in &lt;b&gt;24.458s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;15.16user 2.51system &lt;b&gt;0:27.57elapsed&lt;/b&gt; 64%CPU (0avgtext+0avgdata 131488maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;472inputs+9608outputs (0major+18457minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 1 test in &lt;b&gt;24.552s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;15.23user 2.63system &lt;b&gt;0:27.95elapsed&lt;/b&gt; 63%CPU (0avgtext+0avgdata 131088maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;232inputs+9616outputs (0major+18310minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Con PostgreSql en ram:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 1 test in &lt;b&gt;16.082s&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;11.30user 2.46system &lt;b&gt;0:19.22elapsed&lt;/b&gt; 71%CPU (0avgtext+0avgdata 126080maxresident)k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+9616outputs (0major+17675minor)pagefaults 0swaps&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 1 test in &lt;b&gt;15.736s&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;11.25user 2.20system &lt;b&gt;0:18.82elapsed&lt;/b&gt; 71%CPU (0avgtext+0avgdata 126192maxresident)k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+9608outputs (0major+17684minor)pagefaults 0swaps&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Ran 1 test in &lt;b&gt;15.408s&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;10.78user 2.27system &lt;b&gt;0:18.44elapsed&lt;/b&gt; 70%CPU (0avgtext+0avgdata 126384maxresident)k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0inputs+9608outputs (0major+17693minor)pagefaults 0swaps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-67221169947802078?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/67221169947802078/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=67221169947802078' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/67221169947802078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/67221169947802078'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/corriendo-tests-con-instancia-de.html' title='Corriendo tests con instancia de PostgreSql en ram'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8789685896774061097</id><published>2012-02-04T11:49:00.001-03:00</published><updated>2012-02-04T11:49:19.489-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Acelerando tests de Django con PostgreSql</title><content type='html'>La ejecucion inicial de los tests toma aproximadamente &lt;b&gt;15 segundos&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.54user 0.64system &lt;b&gt;0:15.25elapsed&lt;/b&gt; 34%CPU (0avgtext+0avgdata 123600maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.70user 0.54system &lt;b&gt;0:14.70elapsed&lt;/b&gt; 35%CPU (0avgtext+0avgdata 122992maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.46user 0.65system &lt;b&gt;0:14.85elapsed&lt;/b&gt; 34%CPU (0avgtext+0avgdata 122912maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego de ajustar los siguientes parametros:&lt;br /&gt;- fsync = off&lt;br /&gt;- synchronous_commit = off&lt;br /&gt;- wal_sync_method = fsync&lt;br /&gt;&lt;br /&gt;la ejecución toma aproximadamente &lt;b&gt;8.5 segundos&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.22user 0.56system &lt;b&gt;0:08.62elapsed&lt;/b&gt; 55%CPU (0avgtext+0avgdata 123024maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.32user 0.58system &lt;b&gt;0:08.97elapsed&lt;/b&gt; 54%CPU (0avgtext+0avgdata 123008maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4.29user 0.50system &lt;b&gt;0:08.74elapsed&lt;/b&gt; 54%CPU (0avgtext+0avgdata 123040maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El tiempo se redujo casi a la mitad! Aunque esta configuración no es para nada recomendable para un equipo de producción, creo que vale la pena para ejecutar tests.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8789685896774061097?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8789685896774061097/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8789685896774061097' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8789685896774061097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8789685896774061097'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/acelerando-tests-de-django-con.html' title='Acelerando tests de Django con PostgreSql'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1401669145688646095</id><published>2012-02-02T16:25:00.000-03:00</published><updated>2012-02-02T16:25:34.302-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='yum'/><title type='text'>Bajar paquetes y no instalarlos con yum</title><content type='html'>Suelo usar en Debian/Ubuntu el comando:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# aptitude -yd algun-paquete&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;que permite bajar el paquete pero NO instalarlo. Pero &lt;b&gt;yum&lt;/b&gt; no tiene ninguna opción parecida, aunque encontré que a través de un plugin se puede conseguir la misma de &lt;b&gt;aptitude&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Para instalar dicho plugin:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#&amp;nbsp;yum install yum-downloadonly&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# yum --help&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;(...)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; Plugin Options:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; --downloadonly &amp;nbsp; &amp;nbsp; &amp;nbsp;don't update, just download&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; --downloaddir=DLDIR&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; specifies an alternate directory to store packages&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y se puede usar, por ejemplo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;# yum install --downloadonly python-devel&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Las instrucciones las encontré en&amp;nbsp;&lt;a href="http://www.cyberciti.biz/faq/yum-downloadonly-plugin/"&gt;http://www.cyberciti.biz/faq/yum-downloadonly-plugin/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1401669145688646095?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1401669145688646095/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1401669145688646095' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1401669145688646095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1401669145688646095'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/02/bajar-paquetes-y-no-instalarlos-con-yum.html' title='Bajar paquetes y no instalarlos con yum'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7669250292104658439</id><published>2012-01-25T20:22:00.000-03:00</published><updated>2012-01-25T20:28:20.994-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualenv'/><category scheme='http://www.blogger.com/atom/ns#' term='pip'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Instalando django_openid_auth usando PIP</title><content type='html'>Hay algunos problemas con la version 0.4 de django_openid_auth (ej: no se puede instalar via pip). El proyecto es open source, por lo tanto es muy facil subirlo a GitHub y compartir estos arreglos :-)&lt;br /&gt;&lt;br /&gt;Básicamente bajé el proyecto original (revisión 88) y lo subi a GitHub. Para instalarlo usando PIP hay que ejecutar:&lt;br /&gt;&lt;br /&gt;./pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth#egg=django_openid_auth&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Actualización&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mucho mejor, instalamos usando PIP, pero un commit en particular (&lt;b&gt;ec68dfc046d1a75b50080ea98c56eda71956ed7a&lt;/b&gt;):&lt;br /&gt;&lt;br /&gt;pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@ec68dfc046d1a75b50080ea98c56eda71956ed7a#egg=django_openid_auth&lt;br /&gt;&lt;br /&gt;O&amp;nbsp;también un tag en particular (&lt;b&gt;bzr_revno_88&lt;/b&gt;):&lt;br /&gt;&lt;br /&gt;pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@bzr_revno_88#egg=django_openid_auth&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7669250292104658439?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7669250292104658439/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7669250292104658439' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7669250292104658439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7669250292104658439'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2012/01/instalando-djangoopenidauth-usando-pip.html' title='Instalando django_openid_auth usando PIP'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1109855605140245071</id><published>2011-12-21T17:07:00.000-03:00</published><updated>2011-12-21T17:07:34.095-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='openvpn'/><title type='text'>Cargando modulo 'tun' al iniciar Android</title><content type='html'>Al intentar usar el cliente de OpenVpn me encontré con que mi Android no carga automáticamente el modulo "tun", y por lo tanto la VPN nunca levanta.&lt;br /&gt;&lt;br /&gt;Para solucionarlo, agregué &lt;a href="https://gist.github.com/1507449"&gt;el siguiente archivo&lt;/a&gt; en "/system/etc/init.d/10modprobetun":&lt;br /&gt;&lt;script src="https://gist.github.com/1507449.js?file=10modprobetun"&gt;&lt;/script&gt;&lt;br /&gt;Luego de crear el archivo, hace falta agregarle permisos de ejecución, usando:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;chmod +x&amp;nbsp;/system/etc/init.d/10modprobetun&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para poder modificar los contenidos de /system, hay que remontarlo en modo escritura, usando:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mount -o remount,rw /system&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora, luego de reiniciar el celular, el modulo aparece cargado:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;localhost ~ # lsmod&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Module &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Size &amp;nbsp;Used by &amp;nbsp; &amp;nbsp;Not tainted&lt;br /&gt;wireless &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;189315 &amp;nbsp;0&lt;br /&gt;tun &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11765 &amp;nbsp;0&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1109855605140245071?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1109855605140245071/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1109855605140245071' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1109855605140245071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1109855605140245071'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/12/cargando-modulo-tun-al-iniciar-android.html' title='Cargando modulo &apos;tun&apos; al iniciar Android'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1893511026050756162</id><published>2011-12-08T13:06:00.001-03:00</published><updated>2011-12-08T13:13:29.777-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openwrt'/><title type='text'>Aprendiendo a usar uci en OpenWrt</title><content type='html'>Entre la extensa documentación de OpenWrt encontré que "uci show" puede ser de muchísima ayuda, ya que hace un "dump" de la configuración en un formato que después se puede usar con "uci get" y "uci set". Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;root@TL_MR3420:/etc/config# &lt;b&gt;uci show system&lt;/b&gt;&lt;br /&gt;system.@system[0]=system&lt;br /&gt;system.@system[0].timezone=UTC&lt;br /&gt;system.@system[0].hostname=TL_MR3420&lt;br /&gt;system.ntp=timeserver&lt;br /&gt;system.ntp.server=0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org&lt;br /&gt;system.led_usb=led&lt;br /&gt;system.led_usb.name=USB&lt;br /&gt;system.led_usb.sysfs=tp-link:green:3g&lt;br /&gt;system.led_usb.trigger=usbdev&lt;br /&gt;system.led_usb.dev=1-1&lt;br /&gt;system.led_usb.interval=50&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Luego, por ejemplo, para cambiar la zona horaria:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;root@TL_MR3420:/etc/config# &lt;b&gt;uci set system.@system[0].timezone=ART3&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;root@TL_MR3420:/etc/config# &lt;b&gt;uci commit system&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1893511026050756162?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1893511026050756162/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1893511026050756162' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1893511026050756162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1893511026050756162'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/12/aprendiendo-usar-uci-en-openwrt.html' title='Aprendiendo a usar uci en OpenWrt'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3528334960265587397</id><published>2011-11-05T11:56:00.000-03:00</published><updated>2011-11-05T11:56:24.116-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Apache en primer plano (o sea, foreground)</title><content type='html'>Necesitaba iniciar apache y que quede funcionando en "primer plano". Inicialmente intenté arrancarlo con la opción "-X" para activar el modo debug, pero esto hacía que las páginas sean servidas muy lentamente. Buscando un poco más encontré&amp;nbsp;&lt;a href="http://httpd.apache.org/docs/2.2/programs/httpd.html"&gt;http://httpd.apache.org/docs/2.2/programs/httpd.html&lt;/a&gt;&amp;nbsp;y ví que se puede usar "-D" para lograrlo.&lt;br /&gt;&lt;br /&gt;Finalmente, el comando que estoy usando es:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;apache2 -DNO_DETACH -DFOREGROUND -f apache-dev.conf&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3528334960265587397?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3528334960265587397/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3528334960265587397' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3528334960265587397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3528334960265587397'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/11/apache-en-primer-plano-o-sea-foreground.html' title='Apache en primer plano (o sea, foreground)'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3966491334398347398</id><published>2011-10-31T11:00:00.001-03:00</published><updated>2011-10-31T11:00:22.453-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>CyanogenMod 7.1 en mi LG Optimus One (P500)</title><content type='html'>Pude instalar exitosamente&amp;nbsp;&lt;b&gt;CyanogenMod 7.1 (Android 2.3 Gingerbread)&amp;nbsp;&lt;/b&gt;en mi &lt;b&gt;LG Optimus One (P500)&lt;/b&gt;, usando un &lt;b&gt;ROM no oficial&lt;/b&gt; (o sea un ROM que no es armado por el proyecto&amp;nbsp;CyanogenMod). Mi celular tenía originalmente Android 2.2 (Froyo). El link con todas las instrucciones, advertencias, consejos, etc. es:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=946354"&gt;http://forum.xda-developers.com/showthread.php?t=946354&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mi intención con este post es &lt;b&gt;compartir mi experiencia&lt;/b&gt;, nada más. Si vas a hacerlo, te recomiendo que sigas las instrucciones del link que puse más arriba.&lt;br /&gt;&lt;br /&gt;Yo use la version "&lt;b&gt;beta6.&lt;/b&gt;5.8", que era la&amp;nbsp;versión&amp;nbsp;&lt;b&gt;estable&lt;/b&gt; del ROM.&lt;br /&gt;&lt;br /&gt;Procedimiento que seguí:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Primero: investigar en internet los peligros de hacer esto! Lo peor que puede pasar es que &lt;b&gt;el celular deje de funcionar (o sea, ni siquiera se pueda prender)&lt;/b&gt;!&amp;nbsp;Además, los programas que vienen de fábrica puestos por LG no van a estar mas (NDrive, juegos, y la posibilidad de sincronizar los datos con la PC usando el soft de LG, etc, etc, etc). A mí esto no me afectaba porque no uso esos programas, y la sincronización la hago con Google.&lt;/li&gt;&lt;li&gt;Leer&amp;nbsp;&lt;a href="http://forum.xda-developers.com/showthread.php?t=946354"&gt;http://forum.xda-developers.com/showthread.php?t=946354&lt;/a&gt;&amp;nbsp;(allí están todas las instrucciones necesarias).&lt;/li&gt;&lt;li&gt;Backupear todos los datos importantes, sacar todas las fotos, downloads, etc.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Antes de la instación tuve que rootearlo (no entiendo por qué Google no obliga a que todos los celulares salgan rooteados "de fábrica", o con algún procedimiento documentado para hacerlo). Lo rooteé exitosamente con &lt;b&gt;GingerBreak-v1.20&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Luego instalé &lt;b&gt;ClockworkMod ROM Manager&lt;/b&gt; (&lt;a href="http://www.clockworkmod.com/rommanager"&gt;http://www.clockworkmod.com/rommanager&lt;/a&gt;): esto permite hacer un backup de la instalación original e instalar ROMs. Este programa de la opción de formatear la tarjeta SD para crear una partición ext2/ext3, swap, etc. Si se hace esto, se perderán los datos almacenados en la tarjeta SD.&lt;/li&gt;&lt;li&gt;Luego hice un backup del ROM original (Froyo), por las dudas... Y por las dudas lo bajé a la PC.&lt;/li&gt;&lt;li&gt;Luego bajé el ROM para hacer la actualización, en mi caso, la versión &lt;b&gt;estable&lt;/b&gt; más reciente era la&amp;nbsp;&lt;b&gt;beta6.5.8&lt;/b&gt;. El link actualizado a la última versión estable está en&amp;nbsp;&lt;a href="http://forum.xda-developers.com/showthread.php?t=946354"&gt;http://forum.xda-developers.com/showthread.php?t=946354&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Luego de bajar el archivo, hay que pasarlo a la tarjeta SD.&lt;/li&gt;&lt;li&gt;En el Android, abrir "&lt;b&gt;Rom Manager&lt;/b&gt;", elejir "&lt;b&gt;Intall ROM from SD Card&lt;/b&gt;", y elegir el archivo bajado en el punto anterior. Lo que recomiendan es "...&amp;nbsp;&lt;b&gt;Do not forget to wipe data/cache&lt;/b&gt;&amp;nbsp;...", así que yo elegí borrar todo (total no tenía datos importantes en el celular).&lt;/li&gt;&lt;li&gt;A esta altura, el celular se reiniciará, instalará la nueva versión y arrancará nuevamente.&lt;/li&gt;&lt;li&gt;Luego hace falta instalar un ROM que trae las aplicaciones de Google mínimas necesarias (por ejemplo, Market!). El link para bajar las apicaciones también está en&amp;nbsp;&lt;a href="http://forum.xda-developers.com/showthread.php?t=946354"&gt;http://forum.xda-developers.com/showthread.php?t=946354&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Ahora ya podemos abrir &lt;b&gt;Market&lt;/b&gt; y bajar las aplicaciones que necesites :-)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3966491334398347398?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3966491334398347398/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3966491334398347398' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3966491334398347398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3966491334398347398'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/10/cyanogenmod-71-en-mi-lg-optimus-one.html' title='CyanogenMod 7.1 en mi LG Optimus One (P500)'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7586613369475692770</id><published>2011-10-23T13:19:00.001-03:00</published><updated>2011-10-23T22:05:41.983-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oneiric'/><category scheme='http://www.blogger.com/atom/ns#' term='multiarch'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='aptitude'/><title type='text'>Aptitude no funciona con multiarch</title><content type='html'>Ubuntu Oneiric activa el soporte para &lt;a href="https://wiki.ubuntu.com/MultiarchSpec"&gt;multiarch&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Multiarchi&lt;/b&gt;: Integrate support for cross-architecture installation of binary packages (particularly i386 / amd64, but also other combinations) in dpkg and apt&lt;/blockquote&gt;Esto produce que aptitude sea bastante inusable debido a varios bugs (&lt;a href="https://bugs.launchpad.net/ubuntu/+source/aptitude/+bug/831768"&gt;831768&lt;/a&gt;,&amp;nbsp;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/aptitude/+bug/828807"&gt;828807&lt;/a&gt;,&amp;nbsp;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/aptitude/+bug/845183"&gt;845183&lt;/a&gt;) que, al dia de hoy parecen estar sin resolver. Probé desactivar multiarch y al menos aptitude ya me funciona como antes. Para desactivar multiarch, edité el archivo&amp;nbsp;&lt;b&gt;/etc/dpkg/dpkg.cfg.d/multiarch&lt;/b&gt; y comenté la única linea que tiene:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Antes&lt;/u&gt;:&lt;br /&gt;foreign-architecture i386&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Ahora&lt;/u&gt;:&lt;br /&gt;&lt;br /&gt;#foreign-architecture i386&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Al menos ya no me causa problemas al instalar nuevos paquetes, y ya no tengo conflictos imposibles de resolver (&lt;a href="https://bugs.launchpad.net/ubuntu/+source/aptitude/+bug/831768"&gt;831768&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;&lt;br /&gt;Luego de desactivar multiarch, no me funciona Wine, asi que simplemente no usaré aptitude, y estaré obligado a usar apt-get, o synaptic :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7586613369475692770?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7586613369475692770/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7586613369475692770' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7586613369475692770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7586613369475692770'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/10/aptitude-no-funciona-con-multiarch.html' title='Aptitude no funciona con multiarch'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5157269643849860371</id><published>2011-10-23T12:58:00.000-03:00</published><updated>2011-10-23T13:06:53.047-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='oneiric'/><category scheme='http://www.blogger.com/atom/ns#' term='kde'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Estilos de app. Gtk al usar KDE</title><content type='html'>Por alguna cuestion la integración del estilo de las aplicaciones GTK (por lo tanto las app. Gnome) no está funcionando al usar KDE en Ubuntu Oneiric.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Encontré una alternativa en&amp;nbsp;&lt;a href="https://bbs.archlinux.org/viewtopic.php?id=121803"&gt;https://bbs.archlinux.org/viewtopic.php?id=121803&lt;/a&gt;. Tampoco funcionó. Pero luego de revisar los estilos con soporte para GTK3, encontré que el estilo "oxygen-gtk" no existe en /usr/share/themes... Asi que probé con "Radiance" (que existe y es para GTK3) y funcionó! :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Luego de hacer unas modificaciones, este es el contenido que dejé en &lt;b&gt;/etc/gtk-3.0/settings.ini&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;[Settings]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;gtk-theme-name = Radiance&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;gtk-fallback-icon-theme = gnome&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;gtk-application-prefer-dark-theme = false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;gtk-font-name = Sans 9&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Y ahora queda pendiente arreglar las aplicaciones GTK2. Al parecer, las aplicaciones GTK2 buscan un archivo "&lt;b&gt;.gtkrc-2.0&lt;/b&gt;" en el home del usuario, pero KDE genera un archivo llamado "&lt;b&gt;.gtkrc-2.0-kde4&lt;/b&gt;". Esto puede solucionarse creando un symlink en el home del usuario con el siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ln -s .gtkrc-2.0-kde4 .gtkrc-2.0&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5157269643849860371?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5157269643849860371/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5157269643849860371' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5157269643849860371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5157269643849860371'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/10/estilos-de-app-gtk-al-usar-kde.html' title='Estilos de app. Gtk al usar KDE'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1305230853639859532</id><published>2011-10-22T21:25:00.003-03:00</published><updated>2011-10-22T21:25:33.171-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='oneiric'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Oneiric + Arduino 0.22 = problemas</title><content type='html'>Luego de actualizar Ubuntu ya no me compiló un proyecto de Arduino. Luego de chequear en internet encontré que hay unos bugs relacionados a este problema:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/binutils-avr/+bug/818188"&gt;https://bugs.launchpad.net/ubuntu/+source/binutils-avr/+bug/818188&lt;/a&gt;&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/avr-libc/+bug/791335"&gt;https://bugs.launchpad.net/ubuntu/+source/avr-libc/+bug/791335&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634341"&gt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634341&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=633659"&gt;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=633659&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y la forma rápida de solucionarlo fue seguir el consejo del último de los links, editando el archivo &lt;b&gt;hardware/arduino/cores/arduino/wiring.h&lt;/b&gt; (dentro del directorio donde tengo instalado Arduino 0.22) y comentando la linea 79:&lt;br /&gt;&lt;br /&gt;Inicialmente está así:&lt;br /&gt;&lt;br /&gt;#define round(x) ((x)&amp;gt;=0?(long)((x)+0.5):(long)((x)-0.5))&lt;br /&gt;&lt;br /&gt;y ahora:&lt;br /&gt;&lt;br /&gt;// #define round(x) ((x)&amp;gt;=0?(long)((x)+0.5):(long)((x)-0.5))&lt;br /&gt;&lt;br /&gt;No sé cuáles serán los "efectos colaterales" pero funcionó!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1305230853639859532?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1305230853639859532/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1305230853639859532' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1305230853639859532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1305230853639859532'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/10/ubuntu-oneiric-arduino-022-problemas.html' title='Ubuntu Oneiric + Arduino 0.22 = problemas'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5941424449107498114</id><published>2011-10-19T15:38:00.001-03:00</published><updated>2011-10-19T15:38:34.056-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='south'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Cómo resetear South</title><content type='html'>Podemos resetear South desinstalándolo y volviéndolo a instalar.&amp;nbsp;&lt;b&gt;Atención&lt;/b&gt;: esto hará que se pierdan todas las migraciones existentes, y los datos de las BD de las aplicaciones que se quieran resetear. Los pasos a seguir son:&lt;br /&gt;&lt;br /&gt;1) eliminar de la BD las tablas de South: &lt;b&gt;south_migrationhistory&lt;/b&gt;.&lt;br /&gt;2)&amp;nbsp;eliminar de la BD&amp;nbsp;las tablas de las aplicaciones administradas por &lt;b&gt;south&lt;/b&gt;.&lt;br /&gt;3) eliminar el paquete&amp;nbsp;&lt;b&gt;migrations&lt;/b&gt;&amp;nbsp;de las aplicaciones que usen South.&lt;br /&gt;4) ejecutar &lt;b&gt;syncdb&lt;/b&gt;.&lt;br /&gt;5) volver a marcar las aplicaciones que deben ser administradas usando South, ejecutando: "&lt;b&gt;manage.py convert_to_south APP&lt;/b&gt;"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5941424449107498114?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5941424449107498114/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5941424449107498114' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5941424449107498114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5941424449107498114'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/10/como-resetear-south.html' title='Cómo resetear South'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-401626474874111860</id><published>2011-09-26T12:51:00.000-03:00</published><updated>2011-09-26T12:51:08.699-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webdav'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>PHP ejecutados al ser accedidos con WebDav</title><content type='html'>Seguí las instrucciones para configurar WebDav en Apache2 (Ubuntu Server 10.04.3 LTS), pero las páginas de PHP eran "ejecutadas" al ser bajadas desde el editor HTML. La configuración (obviando la restricción por IP y usuario/password) era:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;pre&gt;    Alias /edit /var/www/www.example.com&lt;br /&gt;    &amp;lt;Location /webdav&amp;gt;&lt;br /&gt;        DAV On&lt;br /&gt;        ForceType text/plain&lt;br /&gt;    &amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Revisando la configuración de Apache ví que PHP era habilitado usando "SetHandler", así que lo solucioné usando "&lt;b&gt;SetHandler None&lt;/b&gt;":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Alias /edit /var/www/www.example.com&lt;br /&gt;    &amp;lt;Location /webdav&amp;gt;&lt;br /&gt;        DAV On&lt;br /&gt;        ForceType text/plain&lt;br /&gt;        SetHandler None&lt;br /&gt;    &amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-401626474874111860?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/401626474874111860/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=401626474874111860' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/401626474874111860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/401626474874111860'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/09/php-ejecutados-al-ser-accedidos-con.html' title='PHP ejecutados al ser accedidos con WebDav'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1637068881893441055</id><published>2011-09-01T11:18:00.000-03:00</published><updated>2011-09-01T11:18:14.223-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='upstart'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Desabilitando GDM al inicio</title><content type='html'>En Ubuntu 11.04 los servicios los arranca Upstart, así que para deshabilitar GDM no se puede borrar el link de /etc/rc2.d/gdm. La forma de hacerlo es editar /etc/init/gdm.conf y agregar "&lt;b&gt;and runlevel RUNLEVEL=5&lt;/b&gt;" a la opción "&lt;b&gt;start on&lt;/b&gt;".&amp;nbsp;El diff es:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;--- a/init/gdm.conf&lt;/b&gt;&lt;br /&gt;&lt;b&gt;+++ b/init/gdm.conf&lt;/b&gt;&lt;br /&gt;&lt;b&gt;@@ -7,6 +7,7 @@ description &amp;nbsp; &amp;nbsp; "GNOME Display Manager"&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;author &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "William Jon McCann &lt;mccann@jhu.edu&gt;"&lt;/mccann@jhu.edu&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;start on (filesystem&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and runlevel RUNLEVEL=5&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and started dbus&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;and (drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; or stopped udev-fallback-graphics))&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1637068881893441055?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1637068881893441055/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1637068881893441055' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1637068881893441055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1637068881893441055'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/09/desabilitando-gdm-al-inicio.html' title='Desabilitando GDM al inicio'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5846313719455561354</id><published>2011-08-20T13:12:00.000-03:00</published><updated>2011-08-20T13:12:15.093-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Benchmarks de port forwarding con Python+Eventlet</title><content type='html'>Les comparto algunos benchmarks que hice para verificar la velocidad del "tcp port forwarder" implementado usando Python+Eventlet:&amp;nbsp;&lt;a href="http://blog.eventlet.net/2010/02/28/beautiful-er-eventlet/"&gt;http://blog.eventlet.net/2010/02/28/beautiful-er-eventlet/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No pude hacer los tests usando 'ab', ya que parece haber algun problema por el cual la aplicación no funciona correctamente.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Copia de ISO usando &lt;u&gt;scp&lt;/u&gt;, puerto 22: &lt;span class="Apple-style-span" style="color: #38761d;"&gt;OK&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ubuntu.iso 100% &amp;nbsp;698MB &amp;nbsp;63.4MB/s &amp;nbsp; 00:11&lt;/li&gt;&lt;li&gt;ubuntu.iso 100% &amp;nbsp;698MB &amp;nbsp;69.8MB/s &amp;nbsp; 00:10&lt;/li&gt;&lt;li&gt;ubuntu.iso 100% &amp;nbsp;698MB &amp;nbsp;69.8MB/s &amp;nbsp; 00:10&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Copia de ISO usando &lt;u&gt;scp&lt;/u&gt;, puerto 7000 (eventlet):&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;OK&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;ubuntu.iso 100% &amp;nbsp;698MB &amp;nbsp;41.0MB/s &amp;nbsp; 00:17&lt;/li&gt;&lt;li&gt;ubuntu.iso 100% &amp;nbsp;698MB &amp;nbsp;41.0MB/s &amp;nbsp; 00:17&lt;/li&gt;&lt;li&gt;ubuntu.iso 100% &amp;nbsp;698MB &amp;nbsp;43.6MB/s &amp;nbsp; 00:16&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Copia de ISO, usando &lt;u&gt;wget&lt;/u&gt;, bajada directamente de Apache, puerto 80:&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;OK&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;731,453,440 &amp;nbsp;524M/s &amp;nbsp; in 1.3s &amp;nbsp; &amp;nbsp;&lt;/li&gt;&lt;li&gt;731,453,440 &amp;nbsp;539M/s &amp;nbsp; in 1.3s &amp;nbsp; &amp;nbsp;&lt;/li&gt;&lt;li&gt;731,453,440 &amp;nbsp;523M/s &amp;nbsp; in 1.3s &amp;nbsp; &amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Copia de ISO, usando &lt;u&gt;wget&lt;/u&gt;, bajada directamente de Apache, puerto 7080 (eventlet):&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;OK&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;731,453,440 &amp;nbsp;319M/s &amp;nbsp; in 2.2s&lt;/li&gt;&lt;li&gt;731,453,440 &amp;nbsp;318M/s &amp;nbsp; in 2.2s&lt;/li&gt;&lt;li&gt;731,453,440 &amp;nbsp;323M/s &amp;nbsp; in 2.2s&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Usando&amp;nbsp;ApacheBench, al puerto 80:&lt;/b&gt;&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;OK&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ab -n 400 -c 5 http://localhost:80/index.html&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Finished 400 requests&lt;/li&gt;&lt;li&gt;Concurrency Level: &amp;nbsp; &amp;nbsp; &amp;nbsp;5&lt;/li&gt;&lt;li&gt;Time taken for tests: &amp;nbsp; 0.083 seconds&lt;/li&gt;&lt;li&gt;Complete requests: &amp;nbsp; &amp;nbsp; &amp;nbsp;400&lt;/li&gt;&lt;li&gt;Failed requests: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Usando&amp;nbsp;ApacheBench, al puerto 7080 (eventlet):&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ERROR!!!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ab -n 400 -c 5 http://localhost:7080/index.html&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;apr_poll: The timeout specified has expired (70007)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ab -n 40 -c 5 http://localhost:7080/index.html&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;apr_poll: The timeout specified has expired (70007)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;ab -n 5 -c 1 http://localhost:7080/index.html&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;apr_poll: The timeout specified has expired (70007)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5846313719455561354?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5846313719455561354/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5846313719455561354' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5846313719455561354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5846313719455561354'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/08/benchmarks-de-port-forwarding-con.html' title='Benchmarks de port forwarding con Python+Eventlet'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7601305583997126153</id><published>2011-08-20T02:32:00.000-03:00</published><updated>2011-08-20T02:32:39.538-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><title type='text'>ssh en CentOS 6</title><content type='html'>Estoy aprendiendo a trabajar con CentOS, luego de instalar un servidor de aplicaciones python en CentOS 5.6, estoy arrancando desde cero con un CentOS 6. El tema es que se me complicó la configuracion de ssh.&lt;br /&gt;&lt;br /&gt;Por alguna cuestión, no podia ingresar como root a mi máquina virtual con CentOS 6, y resultó ser un problema relacionado con&amp;nbsp;&lt;a href="https://www.centos.org/modules/newbb/viewtopic.php?viewmode=flat&amp;amp;topic_id=32251&amp;amp;forum=55#forumpost137946"&gt;SELinux&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En definitiva, la configuración del servidor SSH, los permisos, todo estaba OK, y lo solucioné ejecutando:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;/sbin/restorecon -r /root/.ssh&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Para los servidores "reales" nunca permito el login de root, pero para aprender, en una máquina virtual en mi PC, es muy cómodo poder acceder directamente como root :-D&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7601305583997126153?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7601305583997126153/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7601305583997126153' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7601305583997126153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7601305583997126153'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/08/ssh-en-centos-6.html' title='ssh en CentOS 6'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-284217491638122053</id><published>2011-08-19T13:40:00.000-03:00</published><updated>2011-08-19T13:40:26.969-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Listar BD y tablas con sus respectivos tamaños</title><content type='html'>Para listar las &lt;b&gt;bases de datos&lt;/b&gt; con el tamaño ocupado en disco de cada una:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database ORDER BY pg_database_size(pg_database.datname);&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Para listar las &lt;b&gt;tablas&lt;/b&gt; con el tamaño ocupado en disco de cada una, pero solo del schema 'public' (probado en PostgreSql 8.1):&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename)) FROM pg_tables WHERE schemaname = 'public' &amp;nbsp;ORDER BY pg_total_relation_size(tablename);&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Para que la última consulta funcione en Postgre 8:4, hay que utilizar casting:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename::TEXT)) FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(tablename::TEXT);&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Esto lo probé en 8.1 y 8.4 (únicas versiones que tengo a mano).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-284217491638122053?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/284217491638122053/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=284217491638122053' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/284217491638122053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/284217491638122053'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/08/listar-bd-y-tablas-con-sus-respectivos.html' title='Listar BD y tablas con sus respectivos tamaños'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3791688094067259013</id><published>2011-08-10T10:37:00.000-03:00</published><updated>2011-08-10T10:37:02.414-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>psycopg2 (2.4.2) + Django (1.3) = problemas!</title><content type='html'>&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Si usas psycopg2 versión 2.4.2 con Django 1.3 surge el siguiente problema:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;$ ./virtualenv27/bin/python src/dynamicware/manage.py test myprojects&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;Creating test database for alias 'default'...&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;(...)&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;b&gt;psycopg2.ProgrammingError: autocommit cannot be used inside a transaction&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Una solución temporal es instalar la versión anterior de&amp;nbsp;psycopg2:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;$ ./virtualenv27/bin/pip install psycopg2==2.4.1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La solución definitiva ya existe:&amp;nbsp;&lt;a href="https://code.djangoproject.com/ticket/16250"&gt;https://code.djangoproject.com/ticket/16250&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3791688094067259013?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3791688094067259013/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3791688094067259013' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3791688094067259013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3791688094067259013'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/08/psycopg2-242-django-13-problemas.html' title='psycopg2 (2.4.2) + Django (1.3) = problemas!'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3812713464569129278</id><published>2011-08-10T10:01:00.000-03:00</published><updated>2011-08-10T10:01:46.050-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualenv'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>PIL / pillow + virtualenv</title><content type='html'>Instalé &lt;a href="http://www.pythonware.com/products/pil/"&gt;PIL&lt;/a&gt; usando virtualenv, y así termina la instalción:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; PIL 1.1.7 SETUP SUMMARY&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; version &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.1.7&lt;br /&gt;&amp;nbsp; &amp;nbsp; platform &amp;nbsp; &amp;nbsp; &amp;nbsp;linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [GCC 4.5.2]&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; *** TKINTER support not available (Tcl/Tk 8.5 libraries needed)&lt;br /&gt;&amp;nbsp; &amp;nbsp; *** &lt;b&gt;JPEG support not available&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; *** &lt;b&gt;ZLIB (PNG/ZIP) support not available&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; *** &lt;b&gt;FREETYPE2 support not available&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --- LITTLECMS support available&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;PIL se instaló correctamente, pero sin soporte para JPEG y PNG. Este es el funcionamiento "esperado" al instalar PIL con virtualenv.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;La solución&lt;/b&gt;: usar &lt;a href="http://pypi.python.org/pypi/Pillow"&gt;pillow&lt;/a&gt; (fork PIL, amigable con virtualenv)&lt;br /&gt;&lt;br /&gt;Luego de ejecutar "./virtualenv27/bin/pip install pillow":&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; Pillow 1.7.4 ( PIL fork based on PIL 1.1.7 ) SETUP SUMMARY&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; platform &amp;nbsp;linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; [GCC 4.5.2]&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&amp;nbsp; &amp;nbsp; *** TKINTER support not available (Tcl/Tk 8.5 libraries needed)&lt;br /&gt;&amp;nbsp; &amp;nbsp; --- &lt;b&gt;JPEG support available&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --- &lt;b&gt;ZLIB (PNG/ZIP) support available&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --- &lt;b&gt;FREETYPE2 support available&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; --- LITTLECMS support available&lt;br /&gt;&amp;nbsp; &amp;nbsp; --------------------------------------------------------------------&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3812713464569129278?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3812713464569129278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3812713464569129278' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3812713464569129278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3812713464569129278'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/08/pil-pillow-virtualenv.html' title='PIL / pillow + virtualenv'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8707089906543131223</id><published>2011-07-17T20:57:00.001-03:00</published><updated>2011-07-17T20:58:01.190-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualizacion'/><category scheme='http://www.blogger.com/atom/ns#' term='qemu'/><category scheme='http://www.blogger.com/atom/ns#' term='sheepdog'/><title type='text'>Storage distribuido con SheepDog</title><content type='html'>Instalé SheepDog siguiendo las &lt;a href="http://sourceforge.net/apps/trac/sheepdog/wiki/Getting%20Started"&gt;instrucciones&lt;/a&gt; del sitio sobre un Debian Sid, todo funcionó excelente!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Todo el esquema de pruebas lo armé en mi notebook:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Host: &lt;b&gt;acer&lt;/b&gt; (Ubuntu Desktop 11.04)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Guest:&amp;nbsp;&lt;b&gt;debian-virt-server-01&lt;/b&gt; (Debian Sid / libvirt+KVM)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ejecutando SheepDog&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Guest:&amp;nbsp;&lt;b&gt;debian-virt-server-02&lt;/b&gt; (Debian Sid /&amp;nbsp;libvirt+KVM)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ejecutando SheepDog&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Guest:&amp;nbsp;&lt;b&gt;debian-virt-server-03&lt;/b&gt; (Debian Sid /&amp;nbsp;libvirt+KVM)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ejecutando SheepDog&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Guest:&amp;nbsp;&lt;b&gt;linux-over-sheepdog&lt;/b&gt; (Ubuntu 10.04 Server / QEMU)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;usando "linux-over-sheepdog" como disco (esta imagen es creada usando &lt;b&gt;qemu-img&lt;/b&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Luego configuré &lt;b&gt;coresync&lt;/b&gt; y arranqué &lt;b&gt;sheepdog&lt;/b&gt; en&amp;nbsp;&lt;b&gt;debian-virt-server-01&lt;/b&gt;,&amp;nbsp;&lt;b&gt;debian-virt-server-02&lt;/b&gt;&amp;nbsp;y&amp;nbsp;&lt;b&gt;debian-virt-server-03.&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ahora, a crear la imagen de disco!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;root@debian-virt-server-01:~#&lt;/b&gt; collie cluster format --copies=2&lt;br /&gt;&lt;br /&gt;Este comando sólo se debe ejecutar en 1 nodo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;root@debian-virt-server-01:~#&lt;/b&gt; collie node list&lt;br /&gt;&amp;nbsp;Idx - Host:Port Number of vnodes&lt;br /&gt;------------------------------------------------&lt;br /&gt;* 0 - 192.168.122.101:7000 64&lt;br /&gt;&amp;nbsp;1 - 192.168.122.102:7000 64&lt;br /&gt;&amp;nbsp;2 - 192.168.122.103:7000 64&lt;/div&gt;&lt;div&gt;El cluster fue "formateado" para que mantenga 2 copias de la información. Los 3 nodos se están viendo, ya que aparecen al ejecutar "collie node list".&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Creamos imagen para ser usado como disco&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;acer| ~$&lt;/b&gt; qemu-img create sheepdog:192.168.122.101:7000:linux-over-sheepdog 4G&lt;br /&gt;Formatting 'sheepdog:192.168.122.101:7000:linux-over-sheepdog', fmt=raw size=4294967296&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Booteamos QEMU&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;acer| ~$&lt;/b&gt; qemu-system-x86_64 -enable-kvm -m 512 -cdrom ubuntu-10.04-server-amd64-LTS.iso sheepdog:192.168.122.101:7000:linux-over-sheepdog&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y listo! La instalación de Ubuntu Server se inició correctamente sobre un "disco virtual" hosteado usando SheepDog.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8707089906543131223?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8707089906543131223/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8707089906543131223' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8707089906543131223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8707089906543131223'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/07/storage-distribuido-con-sheepdog.html' title='Storage distribuido con SheepDog'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4985658434514562041</id><published>2011-07-13T09:19:00.000-03:00</published><updated>2011-07-13T09:19:24.527-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Procesamiento de anotaciones en Java</title><content type='html'>Hay un bug en la JVM de &lt;strike&gt;Sun&lt;/strike&gt; Oracle que hace fallar el procesamiento de anotaciones. Me pasó que compilando el proyecto funcionaba OK, pero al agregar "-processor ....", aparecía el siguiente problema:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[javac] /...../ValidationCheck.java:25: incompatible types&lt;/b&gt;&lt;br /&gt;&lt;b&gt;[javac] found &amp;nbsp; : ......annotations.Type&lt;/b&gt;&lt;br /&gt;&lt;b&gt;[javac] required: ......Type&lt;/b&gt;&lt;br /&gt;&lt;b&gt;[javac] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Type type() default Type.WORKER;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El problema es el Enum "&lt;b&gt;Type&lt;/b&gt;". Este Enum existe y está en el classpath, pero &lt;b&gt;javac&lt;/b&gt; "no la ve". Está definido de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Type type() default Type.WORKER;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1425088/incompatible-types-found-required-default-enums-in-annotations/6152573#6152573"&gt;La solución para zafar de este bug&lt;/a&gt; es introducir el paquete en el nombre del Enum, de manera que quede:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Type type() default &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;my.package.annotations.&lt;/span&gt;Type.WORKER;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y con eso compila!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;BUG&lt;/u&gt;&lt;/b&gt;:&amp;nbsp;&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=6512707"&gt;http://bugs.sun.com/view_bug.do?bug_id=6512707&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4985658434514562041?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4985658434514562041/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4985658434514562041' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4985658434514562041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4985658434514562041'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/07/procesamiento-de-anotaciones-en-java.html' title='Procesamiento de anotaciones en Java'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7080067211225868990</id><published>2011-07-01T13:18:00.018-03:00</published><updated>2011-07-01T13:27:23.865-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libvirt'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kvm'/><title type='text'>Cómo usar dispositivos USB desde KVM</title><content type='html'>Quiero usar mi pendrive desde un guest KVM (gestionado por libvirt). El dispositivo USB es el marcado con negrita:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;acer| ~$ lsusb&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;Bus 002 Device 004: ID 0930:6545 Toshiba Corp. Kingston DataTraveler 102 flash drive&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Primera opción: usando vendor id + product id&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Editamos el XML usando "virsh edit", y agregamos lo siguiente en el elemento devices:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1058873.js?file=libvirt_xml_vendor_product.xml"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Esta opción asocia un "tipo de dispositivo" (en este caso, el pendrive Kingston) al guest KVM, sin importar en qué puerto se conecte.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Segunda opcióni: usando bus + device&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Editamos el XML usando "virsh edit", y agregamos lo siguiente en el elemento devices:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1058868.js?file=libvirt_xml_bus_device.xml"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Esta opción asocia un puerto USB al guest, sin importar qué tipo de dispositivo se conecte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7080067211225868990?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7080067211225868990/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7080067211225868990' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7080067211225868990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7080067211225868990'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/07/como-usar-dispositivos-usb-desde-kvm.html' title='Cómo usar dispositivos USB desde KVM'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5911720073089452687</id><published>2011-06-18T03:35:00.000-03:00</published><updated>2011-06-18T03:35:47.911-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>AppEngine: cómo evitar subir contenidos de un directorio</title><content type='html'>Al trabajar con &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, podemos crear un directorio en la base del proyecto, y luego configurar&amp;nbsp;&lt;b&gt;app.yaml&lt;/b&gt; para que ignore estos archivos. Por ejemlpo, si el directorio se llama &lt;b&gt;local&lt;/b&gt;, hay que agregar a las siguientes líneas al archivo&amp;nbsp;&lt;b&gt;app.yaml&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;skip_files:&lt;br /&gt;- ^(.*/)?app\.yaml&lt;br /&gt;- ^(.*/)?app\.yml&lt;br /&gt;- ^(.*/)?index\.yaml&lt;br /&gt;- ^(.*/)?index\.yml&lt;br /&gt;- ^(.*/)?#.*#&lt;br /&gt;- ^(.*/)?.*~&lt;br /&gt;- ^(.*/)?.*\.py[co]&lt;br /&gt;- ^(.*/)?.*/RCS/.*&lt;br /&gt;- ^(.*/)?\..*&lt;br /&gt;- ^local/.*&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Todas las líneas excepto la última, corresponden a la configuración por default de &lt;b&gt;skip_files&lt;/b&gt;. La última línea hace que el directorio &lt;b&gt;local&lt;/b&gt; en la raiz del proyecto sea ignorado al ejecutar &lt;b&gt;&lt;a href="http://code.google.com/appengine/docs/python/tools/uploadinganapp.html"&gt;appcfg.py&lt;/a&gt;&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5911720073089452687?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5911720073089452687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5911720073089452687' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5911720073089452687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5911720073089452687'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/06/appengine-como-evitar-subir-contenidos.html' title='AppEngine: cómo evitar subir contenidos de un directorio'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8840694218619289055</id><published>2011-06-15T15:35:00.000-03:00</published><updated>2011-06-15T15:35:33.906-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualizacion'/><category scheme='http://www.blogger.com/atom/ns#' term='qemu'/><category scheme='http://www.blogger.com/atom/ns#' term='kvm'/><title type='text'>Compactar particiones con zerofree</title><content type='html'>Para realizar backups de imágenes de discos usadas en QEmu/KVM se puede optimizar usar&amp;nbsp;&lt;b&gt;zerofree&lt;/b&gt;. Este programa &amp;nbsp;escribe 0 (ceros) en los lugares de la&amp;nbsp;imagen&amp;nbsp;que NO está siendo usada por archivos, y que han sido usadas pero actualmente están libres (por ejemplo, en el lugar donde se haya creado un archivo que luego haya sido borrado).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Zerofree&lt;/b&gt; funciona para ext2/ext3/ext4, en particiones que no están montadas, o montadas solo-lectura.&amp;nbsp;&lt;b&gt;Esta utilidad es "inteligente" en el sentido que no hace "crecer" a los archivos sparse.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Los pasos a seguir son:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cargar &lt;b&gt;nbd&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;~$ sudo modprobe nbd max_part=16&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;asociar imagen de disco&amp;nbsp;&lt;b&gt;disk01.qcow2&lt;/b&gt; a&amp;nbsp;&lt;b&gt;nbd1&lt;/b&gt;&amp;nbsp;y crear dispositivos asociados a particiones&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ sudo qemu-nbd -c /dev/nbd1 -v disk01.qcow2&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ sudo partprobe /dev/nbd1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ejecutar &lt;b&gt;zerofree&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ sudo zerofree -v /dev/nbd1p5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Listo! El archivo "&lt;b&gt;disk01.qcow2&lt;/b&gt;" ocupa&amp;nbsp;teóricamente&amp;nbsp;&lt;b&gt;11G&lt;/b&gt;, pero como es un archivo &lt;b&gt;sparse&lt;/b&gt;, en realidad está ocupado en disco sólo &lt;b&gt;1.9G&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ ls -lh disk01.qcow2&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-rw-r--r-- 1 root root &lt;b&gt;11G&lt;/b&gt; 2011-06-15 14:51 &lt;b&gt;disk01.qcow2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ du -h disk01.qcow2&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;1.9G&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;disk01.qcow2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El .tar ocupa sólo &lt;b&gt;918M&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ tar --sparse -cf disk01.qcow2.tar disk01.qcow2&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ ls -lh disk01.qcow2.tar&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-rw-r--r-- 1 horacio horacio &lt;b&gt;918M&lt;/b&gt; 2011-06-15 15:10 &lt;b&gt;disk01.qcow2.tar&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y al comprimirlo solo nos queda &lt;b&gt;305M&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ gzip -1 disk01.qcow2.tar&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ ls -lh disk01.qcow2.tar.gz&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-rw-r--r-- 1 horacio horacio &lt;b&gt;305M&lt;/b&gt; 2011-06-15 15:10 &lt;b&gt;disk01.qcow2.tar.gz&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;~$ du -h *&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;1.9G&lt;/b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;b&gt;disk01.qcow2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;305M&lt;/b&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;b&gt;disk01.qcow2.tar.gz&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En este caso, un archivo que ocupa inicialmente &lt;b&gt;1.9G&lt;/b&gt; lo llevamos a ocupar &lt;b&gt;918M&lt;/b&gt; (&lt;b&gt;305M&lt;/b&gt; comprimido).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8840694218619289055?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8840694218619289055/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8840694218619289055' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8840694218619289055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8840694218619289055'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/06/compactar-particiones-con-zerofree.html' title='Compactar particiones con zerofree'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-237985609505338859</id><published>2011-06-09T15:31:00.001-03:00</published><updated>2011-06-09T15:32:40.902-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualizacion'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Cómo compilar cliente spice</title><content type='html'>Seguiendo los pasos para instalar &lt;a href="http://spice-space.org/"&gt;Spice&lt;/a&gt; (un nuevo protocolo para comunicarse con guests KVM/QEMU/etc.) me surgieron unos errores, no muy complicados de resolver.&lt;br /&gt;&lt;br /&gt;En general, segui las instrucciones de &lt;a href="http://spice-space.org/page/Building_Instructions"&gt;http://spice-space.org/page/Building_Instructions&lt;/a&gt;.&lt;br /&gt;La instalación la hice en &lt;b&gt;/usr/local/slice&lt;/b&gt;, asi que reemplace "&lt;b&gt;INST_ROOT&lt;/b&gt;" por "&lt;b&gt;/usr/local/slice&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Para compilar e instalar el cliente, en un momento hay que ejecutar:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;~$ cd $SRC_ROOT/spice&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;~$&amp;nbsp;./autogen.sh --prefix=$INST_ROOT&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero este ultimo comando me generó un error:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;----------------------------------------&lt;br /&gt;(...)&lt;br /&gt;checking for PROTOCOL... no&lt;br /&gt;configure: error: Package requirements (spice-protocol &amp;gt;= 0.6.0) were not met:&lt;br /&gt;No package 'spice-protocol' found&lt;br /&gt;Consider adjusting the PKG_CONFIG_PATH environment variable if you&lt;br /&gt;installed software in a non-standard prefix.&lt;br /&gt;Alternatively, you may set the environment variables PROTOCOL_CFLAGS&lt;br /&gt;and PROTOCOL_LIBS to avoid the need to call pkg-config.&lt;br /&gt;See the pkg-config man page for more details.&lt;br /&gt;----------------------------------------&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esto se solucione usando:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;~$ export PKG_CONFIG_PATH="/usr/local/spice/share/pkgconfig:/usr/local/spice/lib/pkgconfig"&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;~$&amp;nbsp;./autogen.sh --prefix=/usr/local/spice&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;~$ cd client&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;~$&amp;nbsp;&lt;/b&gt;&lt;/span&gt;make install&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y... no funcionó...&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;----------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;make[1]: *** No rule to make target `../common/libspice-common.la', needed by `spicec'.  Stop.&lt;br /&gt;make[1]: Leaving directory `/mnt/sin_encriptar/src/spice-client-src/spice/client'&lt;br /&gt;make: *** [install] Error 2&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;----------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero, compilando manualmente lo del directorio "&lt;b&gt;common&lt;/b&gt;", luego lo de "&lt;b&gt;cliente&lt;/b&gt;" funciona:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;~$ cd ..&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;~$ cd common&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;~$&amp;nbsp;&lt;/b&gt;&lt;/span&gt;make install&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font-weight: normal;"&gt;&lt;b&gt;~$ cd ..&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal;"&gt;&lt;b&gt;~$ cd client&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;~$&amp;nbsp;&lt;/b&gt;&lt;/span&gt;make install&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Y ahora sí!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-237985609505338859?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/237985609505338859/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=237985609505338859' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/237985609505338859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/237985609505338859'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/06/como-compilar-cliente-spice.html' title='Cómo compilar cliente spice'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-9185391378978331689</id><published>2011-06-03T13:09:00.000-03:00</published><updated>2011-06-03T13:09:59.040-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Eliminando *.pyc del repositorio Git</title><content type='html'>Por un error subí archivos &lt;b&gt;pyc&lt;/b&gt; al repositorio Git. Ya que no me hace falta mantener esos archivos en el repositorio, decidí intentar eliminarlos del historial, usando "&lt;b&gt;git filter-branch&lt;/b&gt;". Resultó ser bastante&amp;nbsp;fácil!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ git filter-branch --tag-name-filter cat \&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--index-filter 'git rm -r --cached --ignore-unmatch *.pyc' HEAD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esto no es peligroso para repositorios "personales", pero SI para repositorios compartidos, ya que este comando reescribe todo el historial. También hay que tener cuidado si se están utilizando varios branches, ya que este comando solo trabaja en 1 branch a la vez.&lt;br /&gt;&lt;br /&gt;La documentación del comando puede verse &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-9185391378978331689?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/9185391378978331689/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=9185391378978331689' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9185391378978331689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9185391378978331689'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/06/eliminando-pyc-del-repositorio-git.html' title='Eliminando *.pyc del repositorio Git'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2010739821590780706</id><published>2011-06-03T02:46:00.000-03:00</published><updated>2011-06-03T02:46:02.932-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='pyarduinoproxy'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Probando LM335 con PyArduinoProxy</title><content type='html'>Subi unos screenshots, mostrando cómo usé la interfaz web de PyArduinoProxy para testear unos LM335.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/hgdeoro/py-arduino-proxy/wiki/Example%3A-Testing-LM335"&gt;https://github.com/hgdeoro/py-arduino-proxy/wiki/Example%3A-Testing-LM335&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://github.com/hgdeoro/py-arduino-proxy/wiki/Example%3A-Testing-LM335"&gt;&lt;img border="0" height="218" src="https://github.com/hgdeoro/py-arduino-proxy/wiki/example-lm335-5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2010739821590780706?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2010739821590780706/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2010739821590780706' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2010739821590780706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2010739821590780706'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/06/probando-lm335-con-pyarduinoproxy.html' title='Probando LM335 con PyArduinoProxy'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6168888094855352987</id><published>2011-05-25T15:32:00.000-03:00</published><updated>2011-05-25T15:32:51.114-03:00</updated><title type='text'>Chau Skype!</title><content type='html'>La&amp;nbsp;compañía&amp;nbsp;Skype fue comprada, asi que ya es hora de buscar alternativas!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Jitsi -&amp;nbsp;&lt;a href="http://www.jitsi.org/"&gt;http://www.jitsi.org&lt;/a&gt;&amp;nbsp;(audio/video)&lt;/li&gt;&lt;li&gt;Blink -&amp;nbsp;&lt;a href="http://icanblink.com/"&gt;http://icanblink.com&lt;/a&gt; (Linux/Max/Win, audio,&amp;nbsp;envío&amp;nbsp;de archivos, compartir escritorios, conferencia múltiple)&lt;/li&gt;&lt;li&gt;Ekiga - &lt;a href="http://www.ekiga.org/"&gt;http://www.ekiga.org&lt;/a&gt;&amp;nbsp;(Linux/Win, audio/video)&lt;/li&gt;&lt;li&gt;GoogleTalk -&amp;nbsp;&lt;a href="http://www.google.com/talk/"&gt;http://www.google.com/talk/&lt;/a&gt; (Linux/Mac/Win/Web) permite hacer llamadas a numero fijos!&lt;/li&gt;&lt;li&gt;Empathy -&amp;nbsp;&lt;a href="http://live.gnome.org/Empathy"&gt;http://live.gnome.org/Empathy&lt;/a&gt; (audio/video)&lt;/li&gt;&lt;li&gt;LinPhone -&amp;nbsp;&lt;a href="http://www.linphone.org/"&gt;http://www.linphone.org/&lt;/a&gt; (Linux/Win/Mobile)&lt;/li&gt;&lt;li&gt;QuteCom -&amp;nbsp;&lt;a href="http://trac.qutecom.org/"&gt;http://trac.qutecom.org/&lt;/a&gt; (Linux/Win)&lt;/li&gt;&lt;li&gt;Twinkle&amp;nbsp;-&amp;nbsp;&lt;a href="http://www.twinklephone.com/"&gt;http://www.twinklephone.com/&lt;/a&gt; (Linux)&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/957467034762846168-6168888094855352987?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6168888094855352987/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6168888094855352987' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6168888094855352987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6168888094855352987'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/05/chau-skype.html' title='Chau Skype!'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4437329615674138313</id><published>2011-05-14T17:49:00.000-03:00</published><updated>2011-05-14T17:49:52.806-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='electronica'/><title type='text'>Flyback diode</title><content type='html'>Son diodos utilizados para eliminar repentinos picos de voltaje. Estos picos se producen en circuitos altamente inductivos, cuando el voltaje en dicho circuito baja o es eliminado.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La teoría de circuitos demuestra que cuando la corriente que pasa por un inductor se detiene, aparece una tensión a tavés de dicho inductor, en sentido contrario de la corriente que se detuvo. Esta corriente es llamada "flayback". Esa corriente no "aparece de la nada": es originada en la energía almacenada en el campo magnético del inductor, o sea, el campo magnético creado por la corriente inicial, libera su energía como electricidad (pero en sentido opuesto a la corriente inicial).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&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;span class="Apple-style-span" style="margin-left: auto; margin-right: auto;"&gt;&lt;a href="http://www.blogger.com/goog_464369451"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-a4cw0epqTSc/Tc7mFu_3PSI/AAAAAAAAAVI/OOLuZkc9XUs/s1600/300px-Flyback_Diode.svg.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://en.wikipedia.org/wiki/File:Flyback_Diode.svg"&gt;Tomada de WikiPedia:&amp;nbsp;http://en.wikipedia.org/wiki/File:Flyback_Diode.svg&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esto lo traducí (con ayuda de Google) de&amp;nbsp;&lt;a href="http://digital.ni.com/public.nsf/allkb/336D3653F6B6387386256F36005BE09F"&gt;http://digital.ni.com/public.nsf/allkb/336D3653F6B6387386256F36005BE09F&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hay más información (en inglés) en:&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Flyback_diode"&gt;http://en.wikipedia.org/wiki/Flyback_diode&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4437329615674138313?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4437329615674138313/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4437329615674138313' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4437329615674138313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4437329615674138313'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/05/flyback-diode.html' title='Flyback diode'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-a4cw0epqTSc/Tc7mFu_3PSI/AAAAAAAAAVI/OOLuZkc9XUs/s72-c/300px-Flyback_Diode.svg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6835845712001449959</id><published>2011-05-14T16:13:00.000-03:00</published><updated>2011-05-14T16:13:59.888-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='electronica'/><title type='text'>Capacitores para suprimir ruido eléctrico</title><content type='html'>Encontré que es aconsejable utilizar capacitores en los circuitos, para suprimir cualquier "ruido" que pueda generarse, sobre todo si se usan motores (me imagino que también debe ser importante si se usan reles, por ejemplo).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.seattlerobotics.org/encoder/jun97/basics.html"&gt;http://www.seattlerobotics.org/encoder/jun97/basics.html&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&lt;u&gt;En inglés&lt;/u&gt;&lt;/b&gt;: Bypass capacitors help &lt;b&gt;filter&lt;/b&gt; the electrical &lt;b&gt;noise&lt;/b&gt; out of your circuits. They do this by removing the alternating currents caused by ripple voltage. Most digital circuits have at least a couple of bypass capacitors. A good rule of thumb is to &lt;b&gt;add one bypass capacitor for every integrated circuit on your board&lt;/b&gt;. A good default value for a bypass cap is 0.1uF. Higher frequencies require lower valued capacitors.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.seattlerobotics.org/encoder/jun97/basics4.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.seattlerobotics.org/encoder/jun97/basics4.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&lt;u&gt;Traducido por Google&lt;/u&gt;&lt;/b&gt;: Los condensadores de desacoplo ayudan a filtrar el ruido eléctrico de los circuitos. Lo hacen mediante la eliminación de las corrientes alternas causada por variaciones de la tensión. La mayoría de los circuitos digitales tienen por lo menos un par de condensadores de desacoplo. Una buena regla es agregar un condensador de desacoplo por cada circuito integrado en la placa. Un buen valor por defecto es 0.1uF. Las frecuencias más altas requieren capacitores de menor valor .&lt;/blockquote&gt;&amp;nbsp;Otras páginas interesantes que encontré sobre el tema:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://forum.allaboutcircuits.com/showthread.php?t=24095#2"&gt;http://forum.allaboutcircuits.com/showthread.php?t=24095#2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ami.ac.uk/courses/topics/0191_elp/index.html"&gt;http://www.ami.ac.uk/courses/topics/0191_elp/index.html&lt;/a&gt;&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/957467034762846168-6835845712001449959?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6835845712001449959/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6835845712001449959' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6835845712001449959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6835845712001449959'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/05/capacitores-para-suprimir-ruido.html' title='Capacitores para suprimir ruido eléctrico'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7376437699652518959</id><published>2011-05-06T13:25:00.001-03:00</published><updated>2011-05-30T23:11:32.600-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='pyarduinoproxy'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Py-Arduino-Proxy + LCD</title><content type='html'>Ya estoy buscando la forma de utilizar LCDs desde &lt;a href="https://github.com/hgdeoro/py-arduino-proxy"&gt;Py-Arduino-Proxy&lt;/a&gt; :-D&amp;nbsp;En este caso, muestro la temperatura (con un LM35)&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-08vHzp58MhU/TcQgc4tKF8I/AAAAAAAAAUw/BMFQa93Vrec/s1600/P1020803.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-08vHzp58MhU/TcQgc4tKF8I/AAAAAAAAAUw/BMFQa93Vrec/s1600/P1020803.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7376437699652518959?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7376437699652518959/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7376437699652518959' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7376437699652518959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7376437699652518959'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/05/py-arduino-proxy-lcd.html' title='Py-Arduino-Proxy + LCD'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-08vHzp58MhU/TcQgc4tKF8I/AAAAAAAAAUw/BMFQa93Vrec/s72-c/P1020803.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3109703048194072490</id><published>2011-04-30T02:31:00.006-03:00</published><updated>2011-04-30T11:39:52.999-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Como tomar screenshots automáticamente y convertirlos en video</title><content type='html'>&lt;u&gt;Primer paso&lt;/u&gt;: crear la secuencia de screenshots, usando la utilidad "&lt;b&gt;scrot&lt;/b&gt;":&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;s=1; while /bin/true ; do scrot -q 80 "${s}.png" -e "convert -crop 800x600+0+24 ${s}.png ${s}.jpg" ; let s=s+1 ; sleep 1 ; done&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Atención! Este comando sobrescribirá cualquier archivo preexistente! Para continuar una secuencia pre-existente, se puede cambiar el valor inicial de "s". Por ejemplo, si ya tenemos desde el archivo 1.png hasta el 71.png, podemos usar s=72:&lt;/div&gt;&lt;div&gt;&lt;ul style="font-family: serif;"&gt;&lt;li&gt;&lt;b&gt;s=72&lt;/b&gt;; while /bin/true ; do scrot -q 80 "${s}.png" -e "convert -crop 800x600+0+24 ${s}.png ${s}.jpg" ; let s=s+1 ; sleep 1 ; done&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;Segundo paso&lt;/u&gt;: generar un video con dicha secuencia de archivos, usando "&lt;b&gt;ffmpeg&lt;/b&gt;":&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ffmpeg -r 4 -b 512k -i %d.jpg OUTPUT.avi&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;u&gt;Actualización&lt;/u&gt;: para que ffmpeg funcione, los nombres de los archivos deben ser secuenciales, y sin ningún archivo faltante. Por lo tanto, si antes de generar el video queremos borrar algunos archivos, vamos a tener problemas. Pero hay una forma muy fácil de crear una secuencia de archivos, arreglando los 'faltantes':&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;max&lt;/b&gt;=1000 ; ren=1 ; &amp;nbsp;for f in `seq 1 $max` ; do [ -e $f.jpg ] &amp;amp;&amp;amp; { [ $f -ne $ren ] &amp;amp;&amp;amp; { &lt;b&gt;echo&lt;/b&gt; &lt;b&gt;mv&lt;/b&gt; -i $f.jpg $ren.jpg ; } ; let ren=ren+1 ; } ; done&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Ese pequeño script generará por pantalla todos los '&lt;b&gt;mv&lt;/b&gt;' que hace falta ejecutar para arreglar la secuencia. Si quitamos el '&lt;b&gt;echo&lt;/b&gt;', el script ejecutará directamente el comando '&lt;b&gt;mv&lt;/b&gt;'. Ajustar '&lt;b&gt;max&lt;/b&gt;' al número más grande dentro de la secuencia.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3109703048194072490?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3109703048194072490/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3109703048194072490' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3109703048194072490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3109703048194072490'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/04/como-tomar-screenshot-automaticamente-y.html' title='Como tomar screenshots automáticamente y convertirlos en video'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7562404323983292655</id><published>2011-04-26T14:55:00.000-03:00</published><updated>2011-04-26T14:55:48.226-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>os.path.normpath() de Python y las //</title><content type='html'>No es la primera vez que me sucede! Otra vez caí en el extraño funcionamiento &amp;nbsp;de&amp;nbsp;os.path.normpath()!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;os.path.normpath('/esto') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;os.path.normpath('/esto/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red; font-family: 'Courier New', Courier, monospace;"&gt;os.path.normpath('//esto') = '//esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red; font-family: 'Courier New', Courier, monospace;"&gt;os.path.normpath('//esto/') = '//esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;os.path.normpath('///esto') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;os.path.normpath('///esto/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quizá las 2 barras se mantienen al suponer que es un path referenciando algún recurso como se hace en las redes Windows, al estilo //equipo/recurso_compartido.&lt;br /&gt;&lt;br /&gt;Solución: usar &lt;b&gt;strip('/')&lt;/b&gt; y concatenar un &lt;b&gt;'/'&lt;/b&gt; al inicio (suponiendo que siempre trabajamos con path absolutos).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'/' + os.path.normpath('/esto').strip('/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'/' + os.path.normpath('/esto/').strip('/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'/' + os.path.normpath('//esto').strip('/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'/' + os.path.normpath('//esto/').strip('/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'/' + os.path.normpath('///esto').strip('/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'/' + os.path.normpath('///esto/').strip('/') = '/esto'&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7562404323983292655?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7562404323983292655/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7562404323983292655' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7562404323983292655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7562404323983292655'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/04/ospathnormpath-de-python-y-las.html' title='os.path.normpath() de Python y las //'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5267269764543505873</id><published>2011-04-25T00:24:00.002-03:00</published><updated>2011-06-07T02:24:30.959-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='pyarduinoproxy'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Para acceder Arduino desde Python y scripts shell</title><content type='html'>He creado una aplicación para acceder a Arduino desde Python. También incluyo unos ejempos para poder accederlos desde el shell. El proyecto está en&amp;nbsp;&lt;a href="https://github.com/hgdeoro/py-arduino-proxy"&gt;https://github.com/hgdeoro/py-arduino-proxy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Utilizando un LM35 para medir la temperatura. Necesita 3 cables, 5V, masa, y la "señal".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zEMBbascjXk/TbTmJ2AAPiI/AAAAAAAAATk/Oz9rBpnVzZk/s1600/P1020749.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-zEMBbascjXk/TbTmJ2AAPiI/AAAAAAAAATk/Oz9rBpnVzZk/s320/P1020749.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;En el Arduino, conecto los respectivos cables, y el de señal al puerto analógico 0.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-SSyx8OdcHkE/TbTmNNqhXbI/AAAAAAAAATo/FxjrPAnUvkw/s1600/P1020752.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-SSyx8OdcHkE/TbTmNNqhXbI/AAAAAAAAATo/FxjrPAnUvkw/s320/P1020752.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El sensor lo dejo afuera, a pleno rayo de sol, y por ahora bajo la protección de un simple fondo de botella.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6je9qxC6kPw/TbTmOe3izsI/AAAAAAAAATw/wbi3Ibsn16A/s1600/P1020758.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-6je9qxC6kPw/TbTmOe3izsI/AAAAAAAAATw/wbi3Ibsn16A/s320/P1020758.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Agregar plugin de Munin&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Sólo hacer un link del script al directorio de plugins:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;root@eeepc:~# cd /etc/munin/plugins/&lt;br /&gt;root@eeepc:/etc/munin/plugins# ln -s \&lt;br /&gt;/usr/local/py-arduino-proxy/src/arduino_proxy/tests/analog_read_lm35_munin.py \&lt;br /&gt;analog_read_lm35_munin_&lt;br /&gt;root@eeepc:/etc/munin/plugins# mcedit ../plugin-conf.d/munin-node&lt;br /&gt;## AGREGAR ESTO AL FINAL DEL ARCHIVO&lt;br /&gt;[analog_read_lm35_munin]&lt;br /&gt;user root&lt;br /&gt;env.TTY_DEVICE /dev/ttyACM0&lt;br /&gt;env.ANALOG_PORT 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y ahora sólo resta reiniciar munin-node.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;root@eeepc:/etc/munin/plugins# service munin-node restart&lt;br /&gt;munin-node start/running, process 22555&lt;br /&gt;root@eeepc:/etc/munin/plugins# &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y testear que todo haya quedado funcionando correctamente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;root@eeepc:/etc/munin/plugins# munin-run analog_read_lm35_munin&lt;br /&gt;temp.value 10.11&lt;/pre&gt;&lt;br /&gt;Luego de dos días:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-m5k7L6ALgMo/TbTozUhYa6I/AAAAAAAAAT0/oa2mF70ME58/s1600/munin-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-m5k7L6ALgMo/TbTozUhYa6I/AAAAAAAAAT0/oa2mF70ME58/s1600/munin-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EP3Ah4CLW6c/TbTo0IUhSQI/AAAAAAAAAT4/NQ0XdALi3k4/s1600/munin-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-EP3Ah4CLW6c/TbTo0IUhSQI/AAAAAAAAAT4/NQ0XdALi3k4/s1600/munin-2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-drYOYhRBQ-k/TbTo0jOMMjI/AAAAAAAAAT8/zPVpSTKmakc/s1600/munin-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-drYOYhRBQ-k/TbTo0jOMMjI/AAAAAAAAAT8/zPVpSTKmakc/s1600/munin-3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zDJcSnfjG7Y/TbTo1IhxMCI/AAAAAAAAAUA/-WZOHBCKuVs/s1600/munin-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-zDJcSnfjG7Y/TbTo1IhxMCI/AAAAAAAAAUA/-WZOHBCKuVs/s1600/munin-4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-C-DeHr3NOnA/TbTo1SQdyaI/AAAAAAAAAUE/CcD1XNlrFWA/s1600/munin-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-C-DeHr3NOnA/TbTo1SQdyaI/AAAAAAAAAUE/CcD1XNlrFWA/s1600/munin-5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El circuito al que se conecta el LM35 sería así:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-c-44waTXqwI/TbTpKWIWzEI/AAAAAAAAAUI/PbHXyWzocp4/s1600/lm35_bb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/-c-44waTXqwI/TbTpKWIWzEI/AAAAAAAAAUI/PbHXyWzocp4/s400/lm35_bb.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5267269764543505873?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5267269764543505873/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5267269764543505873' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5267269764543505873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5267269764543505873'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/04/para-acceder-arduino-desde-python-y.html' title='Para acceder Arduino desde Python y scripts shell'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-zEMBbascjXk/TbTmJ2AAPiI/AAAAAAAAATk/Oz9rBpnVzZk/s72-c/P1020749.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7887918671343525154</id><published>2011-04-15T18:59:00.022-03:00</published><updated>2011-04-22T02:16:45.377-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><title type='text'>Para zafar del problema con Arduino + Ubuntu</title><content type='html'>He armado un sketch para "zafar" de los problemas que hay con los Arduinos cuando queremos accederlos desde Ubuntu. Sucede que por un bug, tendremos problemas al intententar subir sketchs desde Ubuntu, si en ese momento el Arduino envía información por puerto serial (por ejemlpo usando usando &lt;b&gt;Serial.println()&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;La solución definitiva es actualizar el firmware. Otra (la que implementé) es "pausar" la ejecución del programa, hasta que se detecta un "LOW" en el pin 12.&lt;br /&gt;&lt;br /&gt;El programa es:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/922501.js?file=serial_problem_with_ubuntu_hack.pde"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y la forma de generar le "LOW" en el pin 12 sería:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://github.com/hgdeoro/py-arduino-proxy/raw/master/examples/ubuntu-workaround_bb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="https://github.com/hgdeoro/py-arduino-proxy/raw/master/examples/ubuntu-workaround_bb.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Lo que hago es dejar la resistencia conectada, así el Arduino funciona con normalidad. Cuando necesito subir un programa nuevo, le saco la resistencia y lo reinicio, y puedo comunicarme sin problemas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7887918671343525154?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7887918671343525154/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7887918671343525154' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7887918671343525154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7887918671343525154'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/04/blog-post.html' title='Para zafar del problema con Arduino + Ubuntu'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4935388253227459409</id><published>2011-03-19T17:25:00.002-03:00</published><updated>2011-03-19T17:25:57.073-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='object storage'/><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>(Injusta) comparación de OpenStack Object Storage y MongoDB</title><content type='html'>&lt;div style="font-family: serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;Aclaración: antes que nada, quiero aclarar que no es justo para MongoDB compararlo con Object Storage. Mi intención es sólo comentar mi experiencia.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: serif; font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="font-family: serif;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: serif; font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Ante la necesidad de guardar una gran cantidad de archivos en una aplicación web (más de 80GB), realicé pruebas con&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: serif; font-style: normal;"&gt;&lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: serif; font-style: normal;"&gt;&amp;nbsp;(versiones 1.6.5 y 1.7.3), ya que entre las bases de datos NoSql, es la única que encontré que provee el API necesario para guardar y obtener &amp;nbsp;archivos almacenados (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: serif; font-style: normal;"&gt;&lt;a href="http://www.mongodb.org/display/DOCS/GridFS"&gt;GridFS&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: serif; font-style: normal;"&gt;) (además permite ser configurado muy fácilmente para que los datos almacenados se repliquen entre distintas instancias de MongoDB). Pero me encontré con 2 problemas:&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Poca eficiencia en la utilización del espacio en disco&lt;/b&gt;: en las pruebas realizadas, al insertar archivos por un total de 12GB, en disco se utilizó 21GB.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Dificultad para recuperar el espacio ocupado de archivos borrados&lt;/b&gt;: el borrado de los archivos es un "borrado lógico", y para recuperar el espacio que utilizan, hace falta ejecutar "repairdb()", que básicamente, hace una copia de la BD, de todos los datos no-borrados... esto es un problema si la base de datos es más grande que el espacio libre de la partición.&lt;/li&gt;&lt;/ol&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Este tipo de problemas los pude superar usando&amp;nbsp;&lt;a href="http://openstack.org/projects/storage/"&gt;OpenStack Object Storage&lt;/a&gt;&amp;nbsp;(versión 1.2.0):&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Utilización de espacio en disco&lt;/b&gt;: al insertar archivos por 4202MB, en disco se utilizó&amp;nbsp;4281MB.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Recuperación de espacio en disco&lt;/b&gt;: el espacio es liberado al borrar los archivos.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;En cuanto a las&amp;nbsp;&lt;b&gt;pruebas de stress&lt;/b&gt;:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;MongoDB&lt;/b&gt;&amp;nbsp;en ningún caso dió error&lt;/li&gt;&lt;li&gt;al realizar pruebas con&amp;nbsp;&lt;b&gt;Object Storage&lt;/b&gt;, he obtenido algunos "Read timed out" al momento de subir los archivos.&lt;/li&gt;&lt;/ul&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Cabe aclarar que&amp;nbsp;&lt;b&gt;MongoDB&lt;/b&gt;&amp;nbsp;lo corria directamente en mi computadora, en cambio,&amp;nbsp;&lt;b&gt;Object Storage&lt;/b&gt;&amp;nbsp;estaba instalado en una guest KVM.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;En cuanto a la instalación:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;la instalación de&amp;nbsp;&lt;b&gt;MongoDB&lt;/b&gt;&amp;nbsp;me llevó muy poco tiempo y es muy fácil&lt;/li&gt;&lt;li&gt;la de&amp;nbsp;&lt;b&gt;Object Storage&lt;/b&gt;&amp;nbsp;me costó más, sobre todo la utilización desde Java, ya que el cliente de Java necesita validar correctamente los certificados SSL con los que se configuró el servidor (algo que no pasa con el cliente Python).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4935388253227459409?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4935388253227459409/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4935388253227459409' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4935388253227459409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4935388253227459409'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/03/injusta-comparacion-de-openstack-object.html' title='(Injusta) comparación de OpenStack Object Storage y MongoDB'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-9217522043970360503</id><published>2011-03-17T11:42:00.000-03:00</published><updated>2011-03-17T11:42:23.291-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Funciones privadas para unittest.assertRaises()</title><content type='html'>Para facilitar el uso de unittest.assertRaises() podemos usar funciones privadas. Esto al menos con python &amp;lt; 2.7 (ya que en python 2.7 assertRaises() permite ser usado como "context manager").&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/874429.js?file=unittest_snippet.py"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-9217522043970360503?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/9217522043970360503/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=9217522043970360503' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9217522043970360503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9217522043970360503'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/03/funciones-privadas-para.html' title='Funciones privadas para unittest.assertRaises()'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-997521076951437312</id><published>2011-03-12T21:22:00.001-03:00</published><updated>2011-03-13T02:04:40.415-03:00</updated><title type='text'>OpenStack Object Storage - Ejemplo con Python</title><content type='html'>Adjunto un pequeño ejemplo en Python.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----- Inicio del ejemplo -----&lt;br /&gt;&lt;script src="https://gist.github.com/867735.js?file=openstack_object_storage_test.py"&gt;&lt;/script&gt;&lt;br /&gt;----- Fin del ejemplo -----&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-997521076951437312?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/997521076951437312/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=997521076951437312' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/997521076951437312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/997521076951437312'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/03/openstack-object-storage-ejemplo-con.html' title='OpenStack Object Storage - Ejemplo con Python'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2880166983129708151</id><published>2011-03-11T01:47:00.001-03:00</published><updated>2011-03-11T01:49:59.178-03:00</updated><title type='text'>Probando OpenStack Object Storage</title><content type='html'>Luego de unas horas, pude tener andando mi instancia de &lt;a href="http://www.openstack.org/projects/storage/"&gt;OpenStack Object Storage&lt;/a&gt;. El servidor lo instalé en un Ubuntu 10.04.2 LTS (Lucid), siguiendo las instrucciones de &lt;a href="http://docs.openstack.org/openstack-object-storage/admin/content/ch03s02.html"&gt;Installing OpenStack Object Storage on Ubuntu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Algunas cuestiones a tener en cuenta:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En la página de "&lt;a href="http://docs.openstack.org/openstack-object-storage/admin/content/ch03s03.html"&gt;Configuring OpenStack Object Storage&lt;/a&gt;", al crear los "self-signed certs" utilizando el comando "&lt;b&gt;openssl req -new -x509 -nodes -out cert.crt -keyout cert.key&lt;/b&gt;", en un momento solicita "&lt;b&gt;Common Name (eg, YOUR name) []:&lt;/b&gt;"; aquí hay que ingresar el nombre del host que se utilizará para conectarse, o el IP con el que se accederá al Object Storage&amp;nbsp;desde la red. Por ejemplo, en mi caso, utilicé "&lt;b&gt;192.168.122.233&lt;/b&gt;". Al conectarnos desde &lt;b&gt;Python&lt;/b&gt;, no parece influir el "Comon Name" elegido, pero sí influye al conectarnos desde &lt;b&gt;Java&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;En vez de usar "&lt;b&gt;swift-ring-builder account.builder create 18 &lt;u&gt;3&lt;/u&gt; 1&lt;/b&gt;", utilicé "&lt;b&gt;swift-ring-builder account.builder create 18 &lt;u&gt;1&lt;/u&gt; 1&lt;/b&gt;", ya que sólo hay 1 servidor. Quizá se pueda usar 3, y de esa manera, al agregar servidores, los datos se distribuyan automáticamente...&lt;/li&gt;&lt;li&gt;Al ejecutar los comandos "&lt;b&gt;swift-ring-builder account.builder add ....&lt;/b&gt;" hay que especificar "&lt;b&gt;DEVICE&lt;/b&gt;"... Bueno, aunque el parámetro se llama "device", esto NO se refiere a la partición! Sino al nombre del directorio donde está montada la partición donde se guardarán los datos. El servicio supone que las particiones donde se guardarán los datos están montadas en "/srv/node/DEVICE". Por ejemplo, si los datos los vamos a guardar en la partición /dev/sdb1, y montamos esa partición en "&lt;span class="Apple-style-span" style="font-family: serif;"&gt;/srv/node/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: serif;"&gt;sdb1&lt;/span&gt;", entonces DEVICE =&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: serif;"&gt;sdb1. NO hay que tomar a DEVICE como /dev/sdb1, esto es un error. Por ejemplo, en mi caso, utilice "sdb1" como DEVICE (para seguir la nomenclatura de la documentación), pero en realidad utilizo la partición "&lt;b&gt;/dev/vdb1&lt;/b&gt;", ya que es un instancia de KVM y utilizo virtio para mapear los discos. Por lo tanto, en el fstab tengo: "&lt;b&gt;/dev/vdb1 /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0&lt;/b&gt;".&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Los fuentes del servidor (Swift) pueden bajarse de&amp;nbsp;&lt;a href="http://www.openstack.org/projects/storage/"&gt;http://www.openstack.org/projects/storage/&lt;/a&gt;. El cliente para Python, puede bajarse de&amp;nbsp;&lt;a href="https://github.com/rackspace/python-cloudfiles"&gt;https://github.com/rackspace/python-cloudfiles&lt;/a&gt;. El de Java, desde&amp;nbsp;&lt;a href="https://github.com/rackspace/java-cloudfiles"&gt;https://github.com/rackspace/java-cloudfiles&lt;/a&gt;. Desarrollar un pequeño test en Python fue sencillo. En Java fue bastante más complicado, porque &amp;nbsp;al utilizar certificados firmados por mí mismo (al instalar el servidor genere los certificados con openssl, y por lo tanto no fueron firmados por una entidad de confianza), y por lo tanto Java generaba errores al intentar crear la conexión https a un servidor con certificados no confiables... Más información de esto en un próximo post :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2880166983129708151?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2880166983129708151/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2880166983129708151' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2880166983129708151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2880166983129708151'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2011/03/probando-openstack-object-storage.html' title='Probando OpenStack Object Storage'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8593719488704826180</id><published>2010-10-01T11:51:00.000-03:00</published><updated>2010-10-01T11:51:14.155-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='icinga'/><category scheme='http://www.blogger.com/atom/ns#' term='iptables'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Monitoreo de servicios "filtrados" con Icinga e iptables</title><content type='html'>Con iptables se pueden permitir conexiones a un puerto TCP (como para ser monitoreado con Icinga o Nagios) y a la vez evitar que se utilice el puerto para acceder al servicio.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# Icinga&lt;br /&gt;iptables -A INPUT -s $IP_ICINGA -p tcp --dport 139 --syn -j ACCEPT&lt;br /&gt;iptables -A INPUT -s $IP_ICINGA -p tcp --dport 139 -j DROP&lt;br /&gt;&lt;br /&gt;# Mantenerlo al utlimo, para q' funque filtrado de conexiones de Icinga&lt;br /&gt;iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Con el ejemplo anterior, monitoreo el servicio de Samba, pero no permito que se reciba nada más que los paquetes TCP que crean la conexion. Los paquetes siguientes son eliminados.&lt;br /&gt;&lt;br /&gt;Es importante que "ESTABLISHED,RELATED", si se utiliza, se haga al último.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8593719488704826180?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8593719488704826180/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8593719488704826180' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8593719488704826180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8593719488704826180'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2010/10/monitoreo-de-servicios-filtrados-con.html' title='Monitoreo de servicios &quot;filtrados&quot; con Icinga e iptables'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4068720772266756923</id><published>2010-07-28T22:41:00.001-03:00</published><updated>2010-07-28T22:46:25.792-03:00</updated><title type='text'>Ejecutar programa en tty</title><content type='html'>Luego de investigar bastante, encontré la forma! Necesitaba ejecutar en la consola de texto un programa que monitorea el estado del servidor, pero necesitaba que esto esté funcionando desde que arranca el servidor, y sin necesidad que nadie se loguee. Esto lo logré con la ayuda de&amp;nbsp;&lt;b&gt;rungetty&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Por ejemplo, para que se ejecute en &lt;b&gt;tty6&lt;/b&gt;, modifiqué "&lt;b&gt;/etc/init/tty6.conf&lt;/b&gt;" en un Ubuntu 10.04, reemplazando la última línea:&lt;br /&gt;&lt;b&gt;exec /sbin/getty -8 38400 tty6&lt;/b&gt;&lt;br /&gt;por:&lt;br /&gt;&lt;b&gt;exec rungetty tty6 -u root -- /usr/bin/env python /path/a/script/python.py&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_v4Ed4lj60hQ/TFDb_L9GKAI/AAAAAAAAAPg/krVaSrVT85U/s1600/console-screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://1.bp.blogspot.com/_v4Ed4lj60hQ/TFDb_L9GKAI/AAAAAAAAAPg/krVaSrVT85U/s320/console-screenshot.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Para realizar pruebas, la ejecución directa de&amp;nbsp;&lt;b&gt;rungetty&lt;/b&gt; me ha dado problemas (básicamente al ejecutar&amp;nbsp;&lt;b&gt;rungetty&lt;/b&gt;&amp;nbsp;no pasaba nada, ni mostraba ningún mensaje de error, aunque el exit status era 1). Esto se soluciona ejecutando &lt;b&gt;rungetty&lt;/b&gt; con&amp;nbsp;&lt;b&gt;setsid&lt;/b&gt;:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;setsid rungetty tty8 -u root -- /path/a/programa&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Luego de esto, con Ctrl+Alt+F8 podremos cambiarnos a tty8 y utilizar el programa...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4068720772266756923?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4068720772266756923/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4068720772266756923' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4068720772266756923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4068720772266756923'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2010/07/ejecutar-programa-en-tty.html' title='Ejecutar programa en tty'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_v4Ed4lj60hQ/TFDb_L9GKAI/AAAAAAAAAPg/krVaSrVT85U/s72-c/console-screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-309266374697198170</id><published>2010-07-04T14:04:00.001-03:00</published><updated>2010-07-04T14:05:46.237-03:00</updated><title type='text'>Deshabilitación de pad en Acer Aspire 5542</title><content type='html'>Para que funcione este botón, hace falta bootear linux con un parámetro adicional. Esto se logra modificando la configuración de grub.&lt;br /&gt;&lt;br /&gt;1) abrir "/etc/default/grub" para editar:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;acer| ~$&lt;/b&gt; sudo mcedit /etc/default/grub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2) agregar "i8042.nomux" en la linea que dice "GRUB_CMDLINE_LINUX_DEFAULT", por ejemplo, en mi caso queda así:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;GRUB_CMDLINE_LINUX_DEFAULT="i8042.nomux"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3) luego hay que ejecutar la herramienta de actualización de grub:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;acer| ~$&lt;/b&gt; sudo update-grub2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Luego de reiniciar, el botón debería funcionar...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_v4Ed4lj60hQ/TDC9jKbd3vI/AAAAAAAAAPY/wN9-b-4uQUQ/s1600/deshabilitar-pad.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_v4Ed4lj60hQ/TDC9jKbd3vI/AAAAAAAAAPY/wN9-b-4uQUQ/s320/deshabilitar-pad.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-309266374697198170?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/309266374697198170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=309266374697198170' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/309266374697198170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/309266374697198170'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2010/07/deshabilitacion-de-pad-en-acer-aspire.html' title='Deshabilitación de pad en Acer Aspire 5542'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_v4Ed4lj60hQ/TDC9jKbd3vI/AAAAAAAAAPY/wN9-b-4uQUQ/s72-c/deshabilitar-pad.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8446317354801412101</id><published>2010-07-03T03:56:00.001-03:00</published><updated>2010-07-03T04:05:52.673-03:00</updated><title type='text'>Microfono en Acer Aspire 5542-5241</title><content type='html'>Luego de renegar bastante, parece que encontré la solución para hacer funcionar el microfono de la Acer Aspire 5542-5241 en Ubuntu Lucid.&lt;br /&gt;&lt;br /&gt;Para esto, hay que agregar la siguiente línea en el archivo "/etc/modprobe.d/alsa-base.conf":&lt;br /&gt;&lt;br /&gt;&lt;b&gt;options snd-hda-intel position_fix=1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lo encontré en &lt;a href="https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/523953"&gt;https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/523953&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8446317354801412101?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8446317354801412101/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8446317354801412101' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8446317354801412101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8446317354801412101'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2010/07/microfono-en-acer-aspire-5542-5241.html' title='Microfono en Acer Aspire 5542-5241'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4707624141184752173</id><published>2009-08-26T20:16:00.004-03:00</published><updated>2009-08-26T20:22:20.126-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openoffice'/><title type='text'>OpenOffice: como embeber imagenes linkeadas</title><content type='html'>Me sucedió varias veces que luego de copiar y pegar contenidos en un documento OpenOffice recuerdo que las imágenes quedan "linkeadas" y no embebidas.&lt;br /&gt;&lt;br /&gt;Para embeber estas imágenes linkeadas no encontré ningún macro ni forma automatizada, pero es posible hacerlo con un procedimiento bastante sencillo, seleccionando la opción "&lt;span style="font-weight: bold;"&gt;Links&lt;/span&gt;" en el menú "&lt;span style="font-weight: bold;"&gt;Edit&lt;/span&gt;". Aparecerá una ventana con todas las imágenes linkeadas, y para embeber las imágenes listadas hay que seleccionarlas y presionar el boton "&lt;span style="font-weight: bold;"&gt;Break Link&lt;/span&gt;" (una por una).&lt;br /&gt;&lt;br /&gt;Encontré esta información en &lt;a href="http://www.taming-openoffice-org.com/newsite/?page_id=10"&gt;www.taming-openoffice-org.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4707624141184752173?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4707624141184752173/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4707624141184752173' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4707624141184752173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4707624141184752173'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/08/openoffice-como-embeber-imagenes.html' title='OpenOffice: como embeber imagenes linkeadas'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5178340988132771437</id><published>2009-08-26T13:28:00.003-03:00</published><updated>2009-08-26T14:45:37.081-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Diff de docs. OpenOffice en GIT</title><content type='html'>1) Instalar &lt;a href="http://stosberg.net/odt2txt/"&gt;odt2txt&lt;/a&gt; (convierte docs. OpenOffice a texto plano)&lt;br /&gt;&lt;pre&gt;aptitude install odt2txt&lt;/pre&gt;&lt;br /&gt;2) Configurar GIT&lt;br /&gt;2.a) Agregar a .gitconfig:&lt;br /&gt;&lt;pre&gt;[diff "odf"]&lt;br /&gt;   textconv=odt2txt&lt;/pre&gt;2.b) Agregar a .gitattributes&lt;br /&gt;&lt;pre&gt;*.ods diff=odf&lt;br /&gt;*.odt diff=odf&lt;br /&gt;*.odp diff=odf&lt;/pre&gt;&lt;br /&gt;Con estos 2 pasos realizados, git ya puede mostrar diferencias entre documentos OpenOffice (por ejemplo, al realizar modificaciones locales).&lt;br /&gt;&lt;br /&gt;Artículo completo en &lt;a href="http://www-verimag.imag.fr/%7Emoy/opendocument/"&gt;http://www-verimag.imag.fr/~moy/opendocument/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5178340988132771437?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5178340988132771437/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5178340988132771437' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5178340988132771437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5178340988132771437'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/08/diff-de-docs-openoffice-en-git.html' title='Diff de docs. OpenOffice en GIT'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2770876870057341683</id><published>2009-08-25T15:05:00.002-03:00</published><updated>2009-08-25T15:09:34.505-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Pro GIT</title><content type='html'>Hace tiempo está disponible el libro &lt;a href="http://progit.org/"&gt;Pro GIT&lt;/a&gt; para ser bajado (clonando el repositorio git) o navegado.&lt;br /&gt;Ya se está trabajando en la traducción al español: accedan a:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/progit/progit/tree/master"&gt;http://github.com/progit/progit/tree/master&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;y vean el directorio "es-ni" (por ahora es la única traducción al español, en el futuro puede haber otras).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2770876870057341683?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2770876870057341683/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2770876870057341683' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2770876870057341683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2770876870057341683'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/08/pro-git.html' title='Pro GIT'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5810011770013780628</id><published>2009-07-22T08:56:00.004-03:00</published><updated>2009-07-22T09:03:53.823-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='red'/><title type='text'>"ip addr" en vez de alias</title><content type='html'>Luego de renegar un poco con Ubuntu 9.04 al configurar un alias de la eth0 (me usaba el IP del alias para realizar las conexiones salientes!), encontré que hay otras maneras de armar los alias, usando el comando ip.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ip addr add 192.168.5.101/24 brd + dev eth0 label "eth0:2"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y para que se configure automáticamente, se puede agregar en /etc/network/interfaces:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;post-up /sbin/ip addr add 192.168.5.101/24 brd + dev eth0 label "eth0:2" || true&lt;/pre&gt;&lt;br /&gt;Más información &lt;a href="http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.policy_routing.html"&gt;aquí&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5810011770013780628?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5810011770013780628/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5810011770013780628' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5810011770013780628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5810011770013780628'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/07/ip-addr-en-vez-de-alias.html' title='&quot;ip addr&quot; en vez de alias'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8908187565897433513</id><published>2009-06-24T22:25:00.008-03:00</published><updated>2009-06-24T22:32:34.264-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Alternativa a lomount</title><content type='html'>Parece que lomount no está en Ubuntu (al menos Ubuntu 9.04 p/AMD64), pero existe un truco para montar particiones "internas" de una imagen de un disco.&lt;br /&gt;&lt;br /&gt;Yo necesité montar la 1er partición de la imagen de un disco de un dominio virtualizado. Aunque el disco (para el dominio virtualizado) en realidad estaba provisto por un volumen lógico (LVM) todo funcionó perfectamente.&lt;br /&gt;&lt;br /&gt;Pasos a seguir (en ingles): &lt;a href="http://community.livejournal.com/debian/340887.html"&gt;http://community.livejournal.com/debian/340887.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8908187565897433513?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8908187565897433513/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8908187565897433513' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8908187565897433513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8908187565897433513'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/alternativa-lomount.html' title='Alternativa a lomount'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8469450566748598438</id><published>2009-06-24T13:55:00.005-03:00</published><updated>2009-06-24T22:25:01.414-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Migrar repositorio "privado" de git a repositorio público</title><content type='html'>Necesité crear repositorios "públicos" (donde se puedan hacer pull/push desde distintas PCs) tomando los datos de repositorios locales/privados (donde realizo el desarrollo diario) y resultó ser bastante fácil:&lt;br /&gt;&lt;br /&gt;1. Crear repositorio "publico"&lt;br /&gt;a) crear un directorio - &lt;span style="font-weight: bold;"&gt;mkdir /var/git/proyecto.git&lt;/span&gt;&lt;br /&gt;b) posicionarse en ese directorio - &lt;span style="font-weight: bold;"&gt;cd /var/git/proyecto.git&lt;/span&gt;&lt;br /&gt;c) inicializar el directorio - &lt;span style="font-weight: bold;"&gt;git init --bare&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. Hacer push de repositorio local/privado a público&lt;br /&gt;a) nos posicionamos en directorio - &lt;span style="font-weight: bold;"&gt;cd /path/a/repo/privado&lt;/span&gt;&lt;br /&gt;b) creamos "remote" - &lt;span style="font-weight: bold;"&gt;git remote  add origin ssh://pc/var/git/proyecto.git&lt;/span&gt;&lt;br /&gt;c) configuramos repositorio - &lt;span style="font-weight: bold;"&gt;git config --bool remote.origin.mirror true&lt;/span&gt;&lt;br /&gt;d) hacemos push - &lt;span style="font-weight: bold;"&gt;git push origin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El paso 2.c es opcional, pero a mí me resultó muy útil. Al ajustar la variable "&lt;span style="font-weight: bold;"&gt;remote.origin.mirror&lt;/span&gt;" a &lt;span style="font-weight: bold;"&gt;true&lt;/span&gt;, git subirá todos los branches y tags automáticamente cuando ejecutemos el push. Si no se realiza esta configuración, el en paso 2.d hará falta especificar los branches a subir.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8469450566748598438?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8469450566748598438/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8469450566748598438' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8469450566748598438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8469450566748598438'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/migrar-repositorio-privado-de-git.html' title='Migrar repositorio &quot;privado&quot; de git a repositorio público'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-300594257727337342</id><published>2009-06-20T17:42:00.003-03:00</published><updated>2009-06-20T17:46:35.682-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Tig: text-mode interface for git</title><content type='html'>Estaba disponible al menos desde Ubuntu 8.10 pero recién lo descubro! Es una interface en modo texto para git, con varias funciones. &lt;a href="http://jonas.nitro.dk/tig/"&gt;Home&lt;/a&gt;. &lt;a href="http://jonas.nitro.dk/tig/screenshots/"&gt;Screenshots&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;#~ sudo aptitude install tig&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-300594257727337342?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/300594257727337342/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=300594257727337342' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/300594257727337342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/300594257727337342'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/tig-text-mode-interface-for-git.html' title='Tig: text-mode interface for git'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3352217924144560394</id><published>2009-06-13T11:06:00.010-03:00</published><updated>2009-06-20T17:42:44.976-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libvirt'/><category scheme='http://www.blogger.com/atom/ns#' term='kvm'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 9.04 como dominio virtual usando virt-install + kvm</title><content type='html'>Se puede instalar Ubuntu 9.04 usando virt-install con un comando como el siguiente:&lt;br /&gt;&lt;pre&gt;virt-install -d --connect qemu:///system \&lt;br /&gt;-n ubuntu904virtual -r 1024 --vcpus=4  \&lt;br /&gt;-f /dev/vg_virt/root \&lt;br /&gt;-f /dev/vg_virt/tmp \&lt;br /&gt;-f /dev/vg_virt/pv0 \&lt;br /&gt;-c /tmp/ubuntu-9.04-server-amd64.iso \&lt;br /&gt;--accelerate --vnc -v \&lt;br /&gt;--os-type=linux --os-variant=generic26&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-d&lt;/span&gt; para que muestre por consola información adicional mientras se crea la maquina virtual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-n&lt;/span&gt; es el nombre del dominio virtual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-f&lt;/span&gt; es para especificar discos, en este caso el dominio virtual vera 3 discos, el 1ro lo usaré  para /, el segudo para /tmp y el 3ro como un "volumen fisico" para configurar LVM.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-c&lt;/span&gt; para especificar el path al iso&lt;br /&gt;&lt;br /&gt;En el caso de usar LVM hay que tener cuidado porque en el servidor host se verán todos los "volume groups" y los "logical volumes" del dominio virtual. Para evitar esto se puede configurar LVM para que IGNORE totalmente ciertos "physical volumes" editando el archivo /etc/lvm/lvm.conf, y agregando:&lt;br /&gt;&lt;br /&gt;filter = [ "r|^/dev/vg_virt/pv.*|" ]&lt;br /&gt;&lt;br /&gt;Esto le dice a LVM que ignore cualquier "physical volume" que esté referenciado por algún dispositivo cuyo nombre comience con "/dev/vg_virt/pv". Para chequear que esto haya funcionado correctamente, ejecutamos:&lt;br /&gt;&lt;br /&gt;pvscan -v&lt;br /&gt;&lt;br /&gt;Los siguientes pasos a seguir podrían ser:&lt;br /&gt;- instalar git y crear repo en /etc para tener historial de modificaciones&lt;br /&gt;- &lt;a href="http://hgdeoro.blogspot.com/2009/06/configurando-approx-para-cachear.html"&gt;configurar approx&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://help.ubuntu.com/community/SerialConsoleHowto"&gt;configurar serial console&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://wiki.libvirt.org/page/Virtio"&gt;configurar virtio para discos/red&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://wiki.libvirt.org/page/Networking"&gt;configurar red usando bridge&lt;/a&gt;&lt;br /&gt;- configurar autostart de dominios&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3352217924144560394?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3352217924144560394/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3352217924144560394' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3352217924144560394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3352217924144560394'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/ubuntu-904-como-dominio-virtual-usando.html' title='Ubuntu 9.04 como dominio virtual usando virt-install + kvm'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5384121768202158366</id><published>2009-06-11T12:07:00.004-03:00</published><updated>2009-06-11T12:12:54.944-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apt'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Configurando approx para cachear paquetes</title><content type='html'>En &lt;span style="font-weight: bold;"&gt;/etc/approx/approx.conf&lt;/span&gt; definir 2 servidores:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ubuntu-jaunty            http://ar.archive.ubuntu.com/ubuntu/&lt;br /&gt;ubuntu-jaunty-security   http://security.ubuntu.com/ubuntu&lt;/pre&gt;&lt;br /&gt;Y luego, hay que cambiar &lt;span style="font-weight: bold;"&gt;/etc/apt/sources.list&lt;/span&gt; de manera que quede:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;deb http://localhost:9999/ubuntu-jaunty jaunty main restricted&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty jaunty-updates main restricted&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty jaunty universe&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty jaunty-updates universe&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty jaunty multiverse&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty jaunty-updates multiverse&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty-security jaunty-security main restricted&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty-security jaunty-security universe&lt;br /&gt;deb http://localhost:9999/ubuntu-jaunty-security jaunty-security multiverse&lt;/pre&gt;&lt;br /&gt;Esta configuración es la que usé para un servidor Ubuntu 9.04&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5384121768202158366?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5384121768202158366/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5384121768202158366' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5384121768202158366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5384121768202158366'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/configurando-approx-para-cachear.html' title='Configurando approx para cachear paquetes'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-9103076577032026466</id><published>2009-06-03T16:11:00.007-03:00</published><updated>2009-06-05T17:35:49.668-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualizacion'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kvm'/><title type='text'>Virtualización con KVM</title><content type='html'>Investigando para implementar &lt;a href="http://www.linux-kvm.org/page/HOWTO"&gt;KVM&lt;/a&gt; encontré varios artículos interesantes:&lt;br /&gt;&lt;br /&gt;Guías&lt;br /&gt;- &lt;a href="http://www.howtoforge.com/virtualization-with-kvm-on-ubuntu-9.04"&gt;Virtualization With KVM On Ubuntu 9.04&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.howtoforge.com/virtualization-with-kvm-on-ubuntu-8.10"&gt;Virtualization With KVM On Ubuntu 8.10&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://howtoforge.org/installing-kvm-guests-with-virt-install-on-ubuntu-8.10-server"&gt;Installing KVM Guests With virt-install On Ubuntu 8.10 Server&lt;/a&gt; (agregado el 5 de jun)&lt;br /&gt;&lt;br /&gt;En sitio de KVM&lt;br /&gt;- &lt;a href="http://www.linux-kvm.org/page/Networking"&gt;Setting guest network &lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.linux-kvm.org/page/AnthonyLiguori/Networking"&gt;Setting up NAT with KVM in Ubuntu &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En sitio de Ubuntu (administrada a través de libvirt)&lt;br /&gt;- &lt;a href="https://help.ubuntu.com/community/KVM/Installation"&gt;Installation&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://help.ubuntu.com/community/KVM/Networking"&gt;Networking&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://help.ubuntu.com/community/KVM/CreateGuests"&gt;CreateGuests&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://help.ubuntu.com/community/KVM/Managing"&gt;Managing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y para gestionar el tráfico de red, además del clásico iptables, es interesante tener en cuenta &lt;a href="http://ebtables.sourceforge.net/"&gt;ebtables&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-9103076577032026466?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/9103076577032026466/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=9103076577032026466' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9103076577032026466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9103076577032026466'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/virtualizacion-con-kvm.html' title='Virtualización con KVM'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1911247387901915080</id><published>2009-06-03T15:58:00.003-03:00</published><updated>2009-06-03T16:09:02.822-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='equivs'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>equivs</title><content type='html'>Con &lt;a href="http://packages.debian.org/search?keywords=equivs"&gt;equivs&lt;/a&gt; se pueden crear muy facilmente paquetes "vacíos" para Debian/Ubuntu/etc. Estos paquetes aunque no contengan ningún programa pueden ser de gran utilidad, al menos en 2 casos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;para crear un paquete que dependa en otros paquetes: esto me es de gran ayuda para crear un paquete que dependa de todos los paquetes que generalmente instalo en los servidores Linux que administro (por ejemlpo, tcpdump, hdparm, smartctl, etc.)&lt;/li&gt;&lt;li&gt;para crear un paquete que "provea" software que hemos instalado manualmente. Por ejemplo, si instalamos manualmente Java, pero queremos instalar Tomcat usando los paquetes que de nuestra distribución en uso, como Tomcat depende de Java, se intentará instalar un JRE o JDK de Java. Con &lt;span style="font-weight: bold;"&gt;equiv&lt;/span&gt; podemos crear un paquete que diga que provee Java, y así podremos instalar Tomcat sin instalar nuevamente otro JDK/JRE.&lt;/li&gt;&lt;/ul&gt;Links:&lt;br /&gt;- &lt;a href="http://www.debian.org/doc/manuals/apt-howto/ch-helpers.en.html"&gt;How to install locally compiled packages: equivs&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://ubuntuforums.org/showthread.php?t=726317"&gt;Howto: create "configuration packages" with equivs &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1911247387901915080?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1911247387901915080/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1911247387901915080' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1911247387901915080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1911247387901915080'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/06/equivs.html' title='equivs'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6703273647513696323</id><published>2009-05-03T12:54:00.002-03:00</published><updated>2009-05-03T12:55:46.491-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Cosas a hacer despues de instalar Ubuntu 9.04 Jaunty Jackalope</title><content type='html'>Excelente artículo! Tiene muchos consejos y referencias sobre cómo instalar algunas cosas que no vienen con Ubuntu.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ubuntulife.wordpress.com/2009/05/02/cosas-a-hacer-despues-de-instalar-ubuntu-904-jaunty-jackalope/"&gt;http://ubuntulife.wordpress.com/2009/05/02/cosas-a-hacer-despues-de-instalar-ubuntu-904-jaunty-jackalope/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6703273647513696323?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6703273647513696323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6703273647513696323' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6703273647513696323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6703273647513696323'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/05/cosas-hacer-despues-de-instalar-ubuntu.html' title='Cosas a hacer despues de instalar Ubuntu 9.04 Jaunty Jackalope'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7115697686701092596</id><published>2009-03-08T14:12:00.009-02:00</published><updated>2009-03-08T17:29:00.007-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Parches para mejorar Django</title><content type='html'>Encontré algunos parches que estoy usando a diario para desarrollo y tests en Django, y me pareció interesante compartirlos. Además la idea es que sirvan de ejemplo de las cosas que se pueden encontrar en el sistema de "&lt;a href="http://code.djangoproject.com/query"&gt;tickets&lt;/a&gt;" de Django, donde hay muchos parches para agregar funcionalidad, por ejemplo:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://code.djangoproject.com/ticket/3357"&gt;Make Django's server optionally multithreaded&lt;/a&gt;&lt;br /&gt;  (específicamente: &lt;a href="http://code.djangoproject.com/attachment/ticket/3357/devserver_multithread_trunk_r9532.patch"&gt;devserver_multithread_trunk_r9532.patch&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Esto permite que el servidor de desarrollo funcione con multiple threads. Sirve, por ejemplo, si queremos realizar un request al mismo servidor (por ejemplo, usando urllib2) desde una vista.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://code.djangoproject.com/ticket/2879"&gt;Add live test server support to test framework&lt;/a&gt;&lt;br /&gt;  (específicamente: &lt;a href="http://code.djangoproject.com/attachment/ticket/2879/django_live_server_r8458.diff"&gt;django_live_server_r8458.diff&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Permite iniciar un servidor http desde un testcase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7115697686701092596?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7115697686701092596/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7115697686701092596' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7115697686701092596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7115697686701092596'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/03/parches-para-mejorar-django.html' title='Parches para mejorar Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1520094810871616924</id><published>2009-02-28T13:11:00.002-02:00</published><updated>2009-02-28T13:15:37.028-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='vmplayer'/><title type='text'>Problemas de teclado con Ubuntu 8.10 + VMPlayer</title><content type='html'>&lt;p&gt;Por alguna cuestión VMPlayer no reconoce algunas teclas en Ubuntu (o sea, las teclas en Ubuntu funcionan bien, pero no "llegan" al sistema operativo ejecutando en VMPlayer). La solución es sencilla: hay que agregar la siguiente línea al archivo de configuración ubicado en ~/.vmware/config&lt;/p&gt;&lt;p&gt;&lt;wbr&gt;nokeycodeMap = true&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1520094810871616924?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1520094810871616924/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1520094810871616924' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1520094810871616924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1520094810871616924'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/02/problemas-de-teclado-con-ubuntu-810.html' title='Problemas de teclado con Ubuntu 8.10 + VMPlayer'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2645285374733235182</id><published>2009-02-19T12:58:00.007-02:00</published><updated>2009-02-19T13:12:08.593-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>pg_dump y "canceling statement due to statement timeout"</title><content type='html'>Al realizar backups de tablas grandes, pueden producirse "statement timeout":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;pg_dump: SQL command failed&lt;br /&gt;pg_dump: Error message from server: ERROR:  canceling statement due to statement timeout&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si esto sucede porque tenemos configurado "statement_timeout" a nivel general, esta configuración también está afectando las sentencias ejecutadas por pg_dump (esto sucede al menos con PostgreSql 8.1). Este se soluciona seteando la siguiente variable de entorno:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;~# export PGOPTIONS="-c statement_timeout=0"&lt;br /&gt;~# pg_dump test_db&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;También podemos hacerlo en 1 línea&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;~# PGOPTIONS="-c statement_timeout=0" pg_dump test_db&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;o también:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;~# env PGOPTIONS="-c statement_timeout=0" pg_dump test_db&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tomado de: &lt;a href="http://www.mail-archive.com/pgsql-general@postgresql.org/msg79518.html"&gt;http://www.mail-archive.com/pgsql-general@postgresql.org/msg79518.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2645285374733235182?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2645285374733235182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2645285374733235182' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2645285374733235182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2645285374733235182'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/02/pgdump-y-canceling-statement-due-to.html' title='pg_dump y &quot;canceling statement due to statement timeout&quot;'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6335088139034762507</id><published>2009-02-17T19:07:00.002-02:00</published><updated>2009-02-17T19:10:43.446-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Formateo de excepciones en Python</title><content type='html'>Muy simple:&lt;br /&gt;&lt;pre&gt;formatted_lines = traceback.format_exc().splitlines() # hacerlo en el exception handler&lt;br /&gt;exc = "\n".join(formatted_lines)&lt;br /&gt;print exc&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6335088139034762507?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6335088139034762507/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6335088139034762507' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6335088139034762507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6335088139034762507'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/02/formateo-de-excepciones-en-python.html' title='Formateo de excepciones en Python'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-36751479947350693</id><published>2009-02-05T18:27:00.005-02:00</published><updated>2009-02-05T18:42:45.973-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Imports de Python como en Java</title><content type='html'>En Java, si tenemos 2 directorios con fuentes, y en cada directorio una misma estructura de paquetes, la JVM se encarga automáticamente de buscar cada clase/paquete en los distintos directorios. Por ejemplo, podemos tener src1 y src2 en el classpath, cada directorio con los mismos paquetes:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;src1/ar/com/ejemplo/Uno.java&lt;br /&gt;src2/ar/com/ejemplo/Dos.java&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Desde una clase podemos hacer referencias a Uno y Dos sin mayores problemas, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import ar.com.ejemplo.Uno;&lt;br /&gt;import ar.com.ejemplo.Dos;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pero con Python esto se complica y no funciona automáticamente. Si tenemos  src1 y src2 en el PYTHONPATH, cada directorio con estructura similar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;src1/__init__.py&lt;br /&gt;src1/ejemplo/__init__.py&lt;br /&gt;src1/ejemplo/uno.py&lt;br /&gt;&lt;br /&gt;src2/__init__.py&lt;br /&gt;src2/ejemplo/__init__.py&lt;br /&gt;src2/ejemplo/dos.py&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Con PYTHONPATH=src1:src2&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from ejemplo import uno -&gt; importa OK&lt;br /&gt;from ejemplo import dos -&gt; ImportError&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  Con PYTHONPATH=src2:src1&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from ejemplo import uno -&gt; ImportError&lt;br /&gt;from ejemplo import dos -&gt; importa OK&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esto se puede solucionar utilizando &lt;a href="http://docs.python.org/library/pkgutil.html"&gt;pkgutil&lt;/a&gt;, modificando src1/ejemplo/__init__.py y src2/ejemplo/__init__.py de forma que incluya:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from pkgutil import extend_path&lt;br /&gt;__path__ = extend_path(__path__, __name__)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De esta manera, usando "extend_path" logramos lo que buscábamos, independientemente del  orden en que están src1 y src2 en el PYTHONPATH.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from ejemplo import uno -&gt; importa OK&lt;br /&gt;from ejemplo import dos -&gt; importa OK&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-36751479947350693?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/36751479947350693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=36751479947350693' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/36751479947350693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/36751479947350693'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/02/imports-de-python-como-en-java.html' title='Imports de Python como en Java'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4620617605312919165</id><published>2009-02-02T12:25:00.010-02:00</published><updated>2009-02-02T12:59:49.149-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Referencia rápida MySql 5.0</title><content type='html'>Diariamente trabajo y administro bases de datos PostgreSql, pero cada tanto uso MySql y siempre olvido los comandos para crear BD y usuarios, así que ahí va una referencia rápida sobre cómo hacerlo sobre MySql 5.0 (versión incluida en Debian Etch):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para crear BD&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;$~ mysqladmin create nombre_base_de_datos&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para crear un usuario y asignar permisos&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;$~ mysql nombre_base_de_datos&lt;br /&gt;[mysql] create user nombre_usuario identified by '**********';&lt;br /&gt;[mysql] grant all on nombre_base_de_datos.* TO 'nombre_usuario'@'localhost';&lt;br /&gt;[mysql] set password for 'nombre_usuario'@'localhost' = PASSWORD('********');&lt;br /&gt;[mysql] flush privileges;&lt;/pre&gt;&lt;br /&gt;Links:&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.0/en/server-administration.html"&gt;http://dev.mysql.com/doc/refman/5.0/en/server-administration.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.0/en/adding-users.html"&gt;http://dev.mysql.com/doc/refman/5.0/en/adding-users.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.0/en/passwords.html"&gt;http://dev.mysql.com/doc/refman/5.0/en/passwords.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4620617605312919165?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4620617605312919165/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4620617605312919165' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4620617605312919165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4620617605312919165'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/02/referencia-rapida-mysql-50.html' title='Referencia rápida MySql 5.0'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5707874558721404344</id><published>2009-02-01T02:48:00.007-02:00</published><updated>2009-02-01T14:36:17.184-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>SocketProcessId.getpid could not get unique port</title><content type='html'>Intentando ejecutar JBoss 5 (la versión para Java 6) en Ubuntu me apareció el siguiente error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;2009-02-01 02:49:32,115 INFO  [com.arjuna.ats.jbossatx.jta.TransactionManagerService] (main) Setting up property manager MBean and JMX layer&lt;br /&gt;2009-02-01 02:49:32,788 DEBUG [com.arjuna.ats.arjuna.logging.arjLoggerI18N] (main) [com.arjuna.ats.arjuna.recovery.TransactionStatusManager_1] - Starting service com.arjuna.ats.arjuna.recovery.ActionStatusService on port 4713&lt;br /&gt;2009-02-01 02:49:32,812 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Create: name=TransactionManager state=Configured com.arjuna.ats.arjuna.exceptions.FatalError: [com.arjuna.ats.internal.arjuna.utils.SocketProcessId_2] - SocketProcessId.getpid could not get unique port.&lt;br /&gt; at com.arjuna.ats.internal.arjuna.utils.SocketProcessId.getpid(SocketProcessId.java:105)&lt;br /&gt; at com.arjuna.ats.arjuna.utils.Utility.getpid(Utility.java:277)&lt;br /&gt; at com.arjuna.ats.arjuna.common.Uid.(Uid.java:105)&lt;br /&gt; at com.arjuna.ats.arjuna.utils.Utility.getProcessUid(Utility.java:289)&lt;br /&gt; at com.arjuna.ats.internal.arjuna.recovery.TransactionStatusManagerItem.(TransactionStatusManagerItem.java:366)&lt;br /&gt; at com.arjuna.ats.internal.arjuna.recovery.TransactionStatusManagerItem.createAndSave(TransactionStatusManagerItem.java:84)&lt;br /&gt; at com.arjuna.ats.arjuna.recovery.TransactionStatusManager.start(TransactionStatusManager.java:145)&lt;br /&gt; at com.arjuna.ats.arjuna.recovery.TransactionStatusManager.(TransactionStatusManager.java:72)&lt;br /&gt; at com.arjuna.ats.arjuna.coordinator.TxControl.(TxControl.java:355)&lt;br /&gt; at com.arjuna.ats.jbossatx.jta.TransactionManagerService.create(TransactionManagerService.java:178)&lt;br /&gt;&lt;br /&gt;(y continúa...)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;No sé exactamente cuál era el problema, pero lo pude solucionar mapeando al IP correcto el nombre de host que devuelven los comandos "hostname" y "hostname -f".&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;#~ hostname -f&lt;br /&gt;unhost.example.com&lt;br /&gt;&lt;br /&gt;Antes de solucionar el problema, "unhost.example.com" tenía asociado un IP incorrecto (o sea, un IP que no correspondía a ningun IP del sistema). Para solucionar el problema asocié a "unhost.example.com" el IP de la placa de red.&lt;br /&gt;&lt;br /&gt;Esta cuestión también impide que Glassfish 2.1 arranque correctamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5707874558721404344?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5707874558721404344/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5707874558721404344' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5707874558721404344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5707874558721404344'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/02/socketprocessidgetpid-could-not-get.html' title='SocketProcessId.getpid could not get unique port'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-889215204836751836</id><published>2009-01-29T14:49:00.002-02:00</published><updated>2009-01-29T14:53:31.549-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Django + tsearch2</title><content type='html'>Encontré 2 artículos explicando cómo usar &lt;a href="http://www.postgresql.org/docs/current/static/tsearch2.html"&gt;tsearch2&lt;/a&gt; de PostgreSql desde Django, para realizar búsquedas de texto de forma eficaz.&lt;br /&gt;- &lt;a href="http://www.rossp.org/blog/2009/jan/28/django-postgresql-fulltext/"&gt;http://www.rossp.org/blog/2009/jan/28/django-postgresql-fulltext/&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://barryp.org/blog/entries/postgresql-full-text-search-django/"&gt;http://barryp.org/blog/entries/postgresql-full-text-search-django/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-889215204836751836?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/889215204836751836/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=889215204836751836' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/889215204836751836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/889215204836751836'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/01/django-tsearch2.html' title='Django + tsearch2'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6347477498975287758</id><published>2009-01-29T13:14:00.003-02:00</published><updated>2009-01-29T13:23:55.263-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><title type='text'>Fuentes (fonts)</title><content type='html'>Encontré en &lt;a href="http://lwn.net/"&gt;lwn.net&lt;/a&gt; un artículo sobre &lt;a href="http://lwn.net/Articles/315066/"&gt;fuentes con licencias libres&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;em&gt;&lt;a href="http://openfontlibrary.org/media/view/media/fonts?offset=10"&gt;Open Font Library:&lt;/a&gt;&lt;/em&gt; A sister-site to the Creative Commons' Open Clip Art Library, the Open Font Library is the largest single repository of free fonts, with over 100 selections — a small number compared to proprietary fonts, but a much larger number than even a few years ago. The site includes users' reviews, tags, and ratings, as well as remixes of various fonts.  &lt;/li&gt;&lt;li&gt; &lt;em&gt;&lt;a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;amp;cat_id=FontDownloads"&gt;SIL Font Downloads&lt;/a&gt;:&lt;/em&gt; This is the main site for free fonts for language support, especially for minority languages, but also for the full range of western and eastern European languages, Cyrillic, Greek, and Hebrew. Some of these typefaces are so obscure that only specialists will use them regularly, but they include a number of general purpose fonts for English and other western European Languages, such as Gentium, Charis SIL and Doulos SIL.  &lt;/li&gt;&lt;li&gt; &lt;em&gt;&lt;a href="http://www.levien.com/type/myfonts/"&gt;Raph Levien's fonts&lt;/a&gt;:&lt;/em&gt;A maintainer for GhostScript, Raph Levien also designs some of the best free fonts for everyday use. Be warned, though, that these are works in progress, and some are not be completely ready for use.  &lt;/li&gt;&lt;li&gt; &lt;em&gt;&lt;a href="http://linuxlibertine.sourceforge.net/Libertine-EN.html"&gt;Linux Libertine&lt;/a&gt;:&lt;/em&gt; Linux Libertine is designed as a free replacement for the ubiquitous Times Roman. Its letters are designed to have the same proportions as those of Time Roman, so that, when a recipient's machine replaces Linux Libertine in a document with Times Roman, your document's design does not suffer.   &lt;/li&gt;&lt;li&gt; &lt;em&gt;&lt;a href="https://www.redhat.com/promo/fonts/"&gt;Liberation fonts&lt;/a&gt;:&lt;/em&gt; A set of three fonts designed as free replacements for Times Roman, Arial/Helvetica, and Courier — respectively the most commonly used &lt;a href="http://en.wikipedia.org/wiki/Serif"&gt;serif&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Sans_serif"&gt;sans serif&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Monospaced_font"&gt;monospace&lt;/a&gt; fonts used on Windows.  &lt;/li&gt;&lt;li&gt; &lt;em&gt;&lt;a href="http://dejavu-fonts.org/wiki/index.php?title=Main_Page"&gt;DejaVu&lt;/a&gt;:&lt;/em&gt; DejaVu is a version of the &lt;a href="http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html"&gt;Bitstream Vera&lt;/a&gt; family, one of the first free fonts. The main difference is that it includes support for a greater number of international characters.  &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Una página que he usado alguna vez es &lt;a href="http://www.dafont.com"&gt;http://www.dafont.com&lt;/a&gt;, tiene muchas fuentes, aunque no todas con licencias libres.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6347477498975287758?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6347477498975287758/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6347477498975287758' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6347477498975287758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6347477498975287758'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/01/fuentes-fonts.html' title='Fuentes (fonts)'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8205306343263812452</id><published>2009-01-23T15:27:00.002-02:00</published><updated>2009-01-23T15:30:30.490-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='wine'/><title type='text'>Instalación fácil de librerias en Wine</title><content type='html'>Encontré un script para instalar de manera fácil las librerias más comunes necesarias para ejecutar con Wine los programas para Windows: "&lt;span style="font-style: italic;"&gt;winetricks is a quick and dirty script to download and install various redistributable runtime libraries sometimes needed to run programs in Wine&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.winehq.org/winetricks"&gt;http://wiki.winehq.org/winetricks&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8205306343263812452?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8205306343263812452/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8205306343263812452' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8205306343263812452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8205306343263812452'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2009/01/instalacin-fcil-de-librerias-en-wine.html' title='Instalación fácil de librerias en Wine'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-4304441889777409540</id><published>2008-11-29T00:27:00.006-02:00</published><updated>2008-11-29T00:36:32.215-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Generando formularios de modelos en Django</title><content type='html'>Es muy fácil generar formularios basándonos en los datos definidos en un modelo (esto está ampliamente documentado en el sitio de Django, excepto:&lt;br /&gt;1) cómo setear los ítems que debe contener el SELECT correspondiente a un campo ForeignKey&lt;br /&gt;2) cómo cambiar el nombre del campo que debe aparecer en el formulario autogenerado&lt;br /&gt;&lt;br /&gt;(marqué en rojo la manera que encontré para resolver estas 2 cuestiones).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Modelo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from django.db import models&lt;br /&gt;from django.contrib.auth.models import User&lt;br /&gt;&lt;br /&gt;class Proyecto(models.Model):&lt;br /&gt;  name = models.CharField(max_length=256, &lt;span style="color: rgb(255, 0, 0);"&gt;verbose_name="Nombre"&lt;/span&gt;)&lt;br /&gt;  customer = models.ForeignKey(to=User, &lt;span style="color: rgb(255, 0, 0);"&gt;verbose_name="Cliente"&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Formulario:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;from django import forms&lt;br /&gt;&lt;br /&gt;class ProyectoForm(forms.ModelForm):&lt;br /&gt;&lt;br /&gt;  class Meta:&lt;br /&gt;      model = Proyecto&lt;br /&gt;      fields = ('name', 'customer')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Vista:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    if request.POST:&lt;br /&gt;      form = ProyectoForm(request.POST)&lt;br /&gt;  else:&lt;br /&gt;      form = ProyectoForm()&lt;br /&gt;   &lt;br /&gt;  &lt;span style="color: rgb(255, 0, 0);"&gt;form.fields['customer'].queryset = User.objects.all().reverse()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-4304441889777409540?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/4304441889777409540/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=4304441889777409540' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4304441889777409540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/4304441889777409540'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/generando-formularios-de-modelos-en.html' title='Generando formularios de modelos en Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1090251670381211724</id><published>2008-11-21T21:27:00.002-02:00</published><updated>2008-11-23T12:54:16.833-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Autocompletar con Ajax para ForeignKey de Django</title><content type='html'>Encontré un componente que hace eso:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jannisleidel.com/2008/11/autocomplete-form-widget-foreignkey-model-fields/"&gt;An autocomplete form widget for ForeignKey model fields&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1090251670381211724?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1090251670381211724/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1090251670381211724' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1090251670381211724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1090251670381211724'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/autocompletar-con-axax-para-foreignkey.html' title='Autocompletar con Ajax para ForeignKey de Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8326919870709583963</id><published>2008-11-20T12:58:00.000-02:00</published><updated>2008-11-20T12:59:02.482-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Cómo embeber Flash</title><content type='html'>Una buena alternativa parece ser &lt;a href="http://code.google.com/p/swfobject/"&gt;swfobject&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8326919870709583963?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8326919870709583963/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8326919870709583963' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8326919870709583963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8326919870709583963'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/cmo-embeber-flash.html' title='Cómo embeber Flash'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3111656219253398671</id><published>2008-11-18T02:00:00.002-02:00</published><updated>2008-11-18T02:03:48.575-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Como backupear usuarios y grupos de PostgreSql</title><content type='html'>Respuesta:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pg_dumpall --globals-only&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(también backupea tablespaces)&lt;br /&gt;&lt;br /&gt;Artículo original y respuestas más largas: &lt;a href="http://www.postgresonline.com/journal/index.php?/archives/81-Backing-up-Login-Roles-aka-Users-and-Group-Roles.html"&gt;Backing up Login Roles aka Users and Group Roles&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3111656219253398671?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3111656219253398671/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3111656219253398671' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3111656219253398671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3111656219253398671'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/como-backupear-usuarios-y-grupos-de.html' title='Como backupear usuarios y grupos de PostgreSql'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6593727181839185100</id><published>2008-11-15T11:41:00.004-02:00</published><updated>2008-11-15T11:59:21.977-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Ejemplo de mod_deflate</title><content type='html'>Comprimir contenidos con mod_deflate es mucho más fácil que con mod_gzip:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;ifmodule mod_deflate.c&amp;gt;&lt;br /&gt; SetOutputFilter DEFLATE&lt;br /&gt; AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript application/x-javascript text/css&lt;br /&gt; DeflateFilterNote Input instream&lt;br /&gt; DeflateFilterNote Output outstream&lt;br /&gt; DeflateFilterNote Ratio ratio&lt;br /&gt; LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' common_deflate_log&lt;br /&gt; CustomLog logs/xyz.dynamicware.com.ar-mod_deflate.log common_deflate_log&lt;br /&gt;&amp;lt;/ifmodule&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Con las 2 primeras líneas ya alcanza. Las demás líneas son para loguear en un archivo información estadística sobre la compresión. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"GET /resources/virtualdisk-default.css HTTP/1.1" 1077/4041 (26%)&lt;br /&gt;"GET /resources/static/back-body.gif HTTP/1.1" 44/52 (84%)&lt;br /&gt;"GET /resources/static/back01.jpg HTTP/1.1" 138938/139402 (99%)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6593727181839185100?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6593727181839185100/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6593727181839185100' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6593727181839185100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6593727181839185100'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/ejemplo-de-moddeflate.html' title='Ejemplo de mod_deflate'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-7513090347001213870</id><published>2008-11-15T01:53:00.003-02:00</published><updated>2008-11-15T02:16:12.679-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Optimización de sitios</title><content type='html'>Puede optimizarse considerablemente un sistema web que estoy utilizando a través de la configuración del tiempo de expiración de los archivos servidos. Esto lo hice organizando todos los archivos que no cambian nunca (javascripts de prototype y jquery, algunos logos, etc). Los ubique en el directorio /resources/static, y luego configure en Apache:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;directory /xxxxxxx/templates/resources/&amp;gt;&lt;br /&gt;   ExpiresActive On&lt;br /&gt;   ExpiresDefault "now plus 2 month"&lt;br /&gt;&amp;lt;/directory&amp;gt;&lt;/pre&gt;&lt;br /&gt;Esto hace que el servidor Apache le envíe al navegador información para que guarde en su caché estos archivos por más de 2 meses. Los demás recursos que pueden cambiar (como los estilos desarrollados por mi y algunos javascripts) los ubiqué en /resources, así evito que sean cacheados por tanto tiempo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Antes:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_v4Ed4lj60hQ/SR5If9WCn0I/AAAAAAAAAKg/ujro3enAqfg/s1600-h/antes.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 372px;" src="http://2.bp.blogspot.com/_v4Ed4lj60hQ/SR5If9WCn0I/AAAAAAAAAKg/ujro3enAqfg/s400/antes.png" alt="" id="BLOGGER_PHOTO_ID_5268728327950212930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Después:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_v4Ed4lj60hQ/SR5Ifxh85vI/AAAAAAAAAKo/f7NEXArbkxM/s1600-h/despues.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 394px;" src="http://4.bp.blogspot.com/_v4Ed4lj60hQ/SR5Ifxh85vI/AAAAAAAAAKo/f7NEXArbkxM/s400/despues.png" alt="" id="BLOGGER_PHOTO_ID_5268728324778944242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para estas tareas de optimización, &lt;a href="http://www.spreadfirefox.com/"&gt;Firefox&lt;/a&gt; e &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt; son grandes aliados. Por ejemplo, en el último gráfico, a la izquierda, vemos que del total de bytes bajados, la mitad corresponden a "CSS images", lo que nos da información valiosa para saber por dónde empezar para optimizar más aún nuestro sitio (en este caso se debe a una imagen muy grande usada como background).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-7513090347001213870?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/7513090347001213870/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=7513090347001213870' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7513090347001213870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/7513090347001213870'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/optimizacin-de-sitios.html' title='Optimización de sitios'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_v4Ed4lj60hQ/SR5If9WCn0I/AAAAAAAAAKg/ujro3enAqfg/s72-c/antes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5962675689521528111</id><published>2008-11-14T22:01:00.005-02:00</published><updated>2008-11-15T00:16:10.309-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>Ejemplo de mod_gzip de Apache + JBoss</title><content type='html'>Un ejemplo de configuración de mod_gzip. Dos problemas con los que me topé mientras lo configuraba:&lt;br /&gt;&lt;br /&gt;- Hacerlo funcionar con contenido tomado de un servidor JBoss vía AJP: para esto debemos utilizar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; mod_gzip_item_include   handler ^jakarta-servlet&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Algunos contenidos no se comprimian, aunque parecía estar todo bien configurado: esto es debido a que la expresión regular configurada era:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;^text/html$&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y debía ser:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;^text/html&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;porque los encabezados suelen incluir información de encoding, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;text/plain; charset=us-ascii&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Ejemplo completo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;ifmodule mod_gzip.c&amp;gt;&lt;br /&gt;    mod_gzip_on                     Yes&lt;br /&gt;    mod_gzip_can_negotiate          No&lt;br /&gt;    mod_gzip_dechunk                Yes&lt;br /&gt;    mod_gzip_handle_methods         GET POST&lt;br /&gt;&lt;br /&gt;    # 512k&lt;br /&gt;    mod_gzip_maximum_file_size      524288&lt;br /&gt;&lt;br /&gt;    # 200k&lt;br /&gt;    mod_gzip_maximum_inmem_size     204800&lt;br /&gt;&lt;br /&gt;    mod_gzip_item_include   handler ^jakarta-servlet&lt;br /&gt;    mod_gzip_item_include   file    \.html$&lt;br /&gt;&lt;br /&gt;    # Si usamos ^text/html$ (con $ al final) entonces estaremos excluyendo&lt;br /&gt;    # los mime que incluyen el encoding (utf8, etc) junto a text/html&lt;br /&gt;    mod_gzip_item_include   mime    ^text/html&lt;br /&gt;    mod_gzip_item_include   mime    ^text/plain&lt;br /&gt;    mod_gzip_item_include   mime    ^text/javascript&lt;br /&gt;    mod_gzip_item_include   mime    ^text/css&lt;br /&gt;    mod_gzip_item_include   uri     ^/intranet/app&lt;br /&gt;    mod_gzip_item_exclude   mime    ^image/&lt;br /&gt;&amp;lt;/ifmodule&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5962675689521528111?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5962675689521528111/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5962675689521528111' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5962675689521528111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5962675689521528111'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/ejemplo-de-modgzip-de-apache-jboss.html' title='Ejemplo de mod_gzip de Apache + JBoss'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3745280260150479295</id><published>2008-11-14T20:09:00.002-02:00</published><updated>2008-11-14T20:27:09.557-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Minimización de JS</title><content type='html'>Buscando algún servicio online para minimizar JS, encontré una librería, creada por el proyecto Dojo que se puede bajar. Está hecho en Java y son sólo 2 jars.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dojotoolkit.org/docs/shrinksafe"&gt;http://dojotoolkit.org/docs/shrinksafe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hay que bjajar &lt;a href="http://svn.dojotoolkit.org/src/util/trunk/shrinksafe/js.jar"&gt;js.jar&lt;/a&gt; y &lt;a href="http://svn.dojotoolkit.org/src/util/trunk/shrinksafe/shrinksafe.jar"&gt;shrinksafe.jar&lt;/a&gt; y ejecutar:&lt;br /&gt;&lt;br /&gt;java -cp js.jar -jar shrinksafe.jar archivo.js &gt; archivo-minimizado.js&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3745280260150479295?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3745280260150479295/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3745280260150479295' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3745280260150479295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3745280260150479295'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/minimizacin-de-js.html' title='Minimización de JS'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-255997892462175564</id><published>2008-11-13T22:59:00.001-02:00</published><updated>2008-11-13T23:03:04.874-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Generando PDFs con Django</title><content type='html'>Encontré un artículo explicando cómo hacerlo. Internamente usan &lt;a href="http://pypi.python.org/pypi/pisa/"&gt;pisa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://uswaretech.com/blog/2008/10/generating-pdfs-with-django/"&gt;http://uswaretech.com/blog/2008/10/generating-pdfs-with-django/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-255997892462175564?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/255997892462175564/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=255997892462175564' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/255997892462175564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/255997892462175564'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/generando-pdfs-con-django.html' title='Generando PDFs con Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6022097608225233839</id><published>2008-11-07T20:05:00.015-02:00</published><updated>2008-11-07T20:48:19.008-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Arranque de proyecto Django</title><content type='html'>Un par de cositas que me han ayudado como "buenas prácticas" en proyectos Django:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Estructura de directorio&lt;/span&gt;&lt;br /&gt;Crear una estructura de directorios que contenga Django, los fuentes y templates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/src&lt;/li&gt;&lt;li&gt;/templates&lt;/li&gt;&lt;li&gt;/Django-1.0&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Path a instalación de Django&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configurar &lt;span style="font-weight: bold;"&gt;manage.py&lt;/span&gt; para que se agregue al path la instalación de Django:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import sys, os&lt;br /&gt;&lt;br /&gt;sys.path.append(os.path.abspath(&lt;br /&gt;os.path.join(&lt;br /&gt;    os.path.dirname(__file__), '..', '..', 'Django-1.0')))&lt;br /&gt;&lt;br /&gt;sys.path.append(os.path.abspath(&lt;br /&gt;os.path.join(&lt;br /&gt;    os.path.dirname(__file__), '..')))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Logging&lt;/span&gt;&lt;br /&gt;Setear logging por consola en nivel debug, cuando DEBUG está activado, agregando las siguientes líneas en &lt;span style="font-weight: bold;"&gt;settings.py&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;if DEBUG:&lt;br /&gt;import logging&lt;br /&gt;logging.basicConfig(&lt;br /&gt;    level = logging.DEBUG,&lt;br /&gt;    format = '%(asctime)s %(levelname)s %(message)s',&lt;br /&gt;)&lt;/pre&gt;También sería prudente configurarlo en nivel warning cuando DEBUG no está seteado:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;else:&lt;br /&gt;  import logging&lt;br /&gt;  logging.basicConfig(&lt;br /&gt;      level = logging.WARN,&lt;br /&gt;      format = '%(asctime)s %(levelname)s %(message)s',&lt;br /&gt;  )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Path a templates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se puede agregar automaticamente a 'TEMPLATE_DIRS' nuestro directorio de templtates modificando &lt;span style="font-weight: bold;"&gt;settings.py&lt;/span&gt; de manera que quede:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;tmp_template_dir = [&lt;br /&gt;# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".&lt;br /&gt;# Always use forward slashes, even on Windows.&lt;br /&gt;# Don't forget to use absolute paths, not relative paths.&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt; import os&lt;br /&gt; auto_dir = os.environ['AUTO_TEMPLATE_DIR']&lt;br /&gt; tmp_template_dir.append(auto_dir)&lt;br /&gt;except KeyError:&lt;br /&gt;pass&lt;br /&gt;&lt;br /&gt;TEMPLATE_DIRS = tuple(tmp_template_dir)&lt;/pre&gt;&lt;br /&gt;Y en &lt;span style="font-weight: bold;"&gt;manage.py&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;os.environ['AUTO_TEMPLATE_DIR']=&lt;br /&gt;os.path.abspath(os.path.join(&lt;br /&gt;   os.path.dirname(__file__), '../../templates'))&lt;/pre&gt;&lt;br /&gt;OJO que los pedazos de código Python que copié y pegué quedaron mal indentados... aún cuando le agregué los &amp;lt;pre&amp;gt; necesarios en el HTML...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6022097608225233839?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6022097608225233839/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6022097608225233839' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6022097608225233839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6022097608225233839'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/arranque-de-proyecto-django.html' title='Arranque de proyecto Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5908125515408900516</id><published>2008-11-05T22:16:00.001-02:00</published><updated>2008-11-05T22:17:39.812-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Eric Holscher: testing Django apps (2 y 3er artículo)</title><content type='html'>Y la serie sigue...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ericholscher.com/blog/2008/nov/4/introduction-pythondjango-testing-basic-unit-tests/"&gt;http://ericholscher.com/blog/2008/nov/4/introduction-pythondjango-testing-basic-unit-tests/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ericholscher.com/blog/2008/nov/5/introduction-pythondjango-testing-fixtures/"&gt;http://ericholscher.com/blog/2008/nov/5/introduction-pythondjango-testing-fixtures/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5908125515408900516?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5908125515408900516/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5908125515408900516' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5908125515408900516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5908125515408900516'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/eric-holscher-testing-django-apps-2-y.html' title='Eric Holscher: testing Django apps (2 y 3er artículo)'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6696989017376675384</id><published>2008-11-03T13:44:00.002-02:00</published><updated>2008-11-03T13:46:12.282-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>2 CMS basados en Django</title><content type='html'>Navegando encontré 2 CMS basados en Django:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://django-cms.org/"&gt;http://django-cms.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/django-page-cms/"&gt;http://code.google.com/p/django-page-cms/&lt;/a&gt;&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/957467034762846168-6696989017376675384?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6696989017376675384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6696989017376675384' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6696989017376675384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6696989017376675384'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/2-cms-basados-en-django.html' title='2 CMS basados en Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-9200799460858126462</id><published>2008-11-02T22:44:00.001-02:00</published><updated>2008-11-02T22:47:00.837-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='aplicaciones web'/><title type='text'>Java theory and practice: Are all stateful Web applications broken?</title><content type='html'>&lt;span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Java theory and practice: Are all stateful Web applications broken?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;HttpSession and friends are trickier than they look &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The session state management mechanism provided by the     Servlets framework, HttpSession, makes it easy to     create stateful applications, but it is also quite easy to     misuse. Many Web applications that use HttpSession     for mutable data (such as JavaBeans classes) do so with     insufficient coordination, exposing themselves to a host of     potential concurrency hazards.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-jtp09238.html?ca=drs-"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-9200799460858126462?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/9200799460858126462/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=9200799460858126462' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9200799460858126462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/9200799460858126462'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/java-theory-and-practice-are-all.html' title='Java theory and practice: Are all stateful Web applications broken?'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1744863849922609599</id><published>2008-11-02T22:25:00.002-02:00</published><updated>2008-11-02T22:28:10.372-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Templates de Django desde la BD</title><content type='html'>Encontré un proyecto que parece implementar la funcionalidad necesaria para que Django pueda tomar los templates desde una base de datos. Aunque no lo probé parece estable...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/django-dbtemplates/"&gt;http://code.google.com/p/django-dbtemplates/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1744863849922609599?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1744863849922609599/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1744863849922609599' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1744863849922609599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1744863849922609599'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/templates-de-django-desde-la-bd.html' title='Templates de Django desde la BD'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-8410683554753155524</id><published>2008-11-02T22:19:00.003-02:00</published><updated>2008-11-02T22:22:31.599-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Introduction to Python/Django testing: Doctests</title><content type='html'>Nota: copié todo el artículo porque el link al post original no me funcionó... (&lt;a href="http://ericholscher.com/blog/2008/nov/2/introduction-pythondjango-testing-doctests/"&gt;este es el link original&lt;/a&gt;)&lt;br /&gt;&lt;h1 class="bl_title"&gt;&lt;a href="http://ericholscher.com/blog/2008/nov/2/introduction-pythondjango-testing-doctests/" id="open_article.51634826.2057" target="_blank"&gt;&lt;/a&gt;&lt;/h1&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Eric Holscher: Introduction to Python/Django testing: Doctests&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;This is the first in a series of blog posts and screencasts that will walk you through how to test your Django application. These posts will focus more on how to get things done in Django, but note that a lot of the content is applicable to pure python as well. A lot of best practices are codified into Django's testing framework, so that we don't have to worry about them! I will try to point them out as we are using them through, because they are good things to know. &lt;/p&gt;&lt;p&gt;The currently planned structure for this series is below. Please comment if there is something that you think is missing, or something that I shouldn't do. This is subject to change, a lot, as well, so your feedback will help direct it. Also note that most or all of this content is available in the Django and Python documentation, and I will try and point there and not re-invent the wheel. I hope that these posts will take a more practical look, and try to point out some pit falls and other things that are useful. &lt;/p&gt;&lt;h4&gt;Outline&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;      Basic Doc tests  &lt;/li&gt;&lt;li&gt;      Basic Unit tests  &lt;/li&gt;&lt;li&gt;      Comparison of Unit tests vs. Doc test  &lt;/li&gt;&lt;li&gt;      Fixtures  &lt;/li&gt;&lt;li&gt;      Using Mock objects  &lt;/li&gt;&lt;li&gt;      Third party testing tools  &lt;/li&gt;&lt;li&gt;      Writing your own test runner  &lt;/li&gt;&lt;li&gt;      Getting code coverage for your tests  &lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Where to start&lt;/h3&gt;&lt;p&gt;I'm assuming that you already have a project that you're working on that you would like to test. There are two different ways of putting tests inside of your django project. You can add a tests.py file and put your tests inside of there. You can also define a tests/ directory and put your tests in files inside of that. For these tutorials it is assumed that the second is the way things are done. It makes it a lot easier when you can break your tests out into logical files. &lt;/p&gt;&lt;h3&gt;Doctests&lt;/h3&gt;&lt;p&gt;These can go in two places inside your django project. You can put them in your models.py file, in the Docstring for your modules. This is a good way to show usage of your models, and to provide basic testing. The &lt;a href="http://docs.djangoproject.com/en/dev/topics/testing/#writing-doctests" target="_blank"&gt;official docs&lt;/a&gt; have some great examples of this. &lt;/p&gt;&lt;p&gt;The other place your Doctests can go is inside your tests directory. A doctests file is usually pretty simple. A doctest is just a large string, so there isn't much else to put besides a string. Usually you want to use the triple quote, multi-line string delimiter to define them. That way your " and 's inside of your doctests don't break anything. &lt;/p&gt;&lt;pre&gt;&lt;code&gt;"""&lt;br /&gt;This is my worthless test.&lt;br /&gt;&gt;&gt;&gt; print "wee"&lt;br /&gt;wee&lt;br /&gt;&gt;&gt;&gt; print False&lt;br /&gt;False&lt;br /&gt;"""&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can go ahead and put that in a file in your &lt;code&gt;tests/&lt;/code&gt; directory, I named it &lt;code&gt;doctst&lt;/code&gt;. My application that I'm writing tests for is &lt;code&gt;mine&lt;/code&gt;, because it's the code for my website. Make sure that directory has an &lt;code&gt;__init__.py&lt;/code&gt; as well, to signify that it is a python module. &lt;/p&gt;&lt;p&gt;Now here is the tricky part; go ahead and try and run your test suite. In your project directory run &lt;code&gt;./manage.py test APPNAME&lt;/code&gt;. It will show you that you have passed 0 tests. 0 tests? We just defined one. &lt;/p&gt;&lt;p&gt;You need to go into your &lt;strong&gt;init&lt;/strong&gt;.py file and put some stuff in there.  &lt;/p&gt;&lt;pre&gt;&lt;code&gt;import doctst&lt;br /&gt;__test__ = {&lt;br /&gt;   'Doctest': doctst&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You are importing the doc test module and then adding it to the &lt;code&gt;__test__&lt;/code&gt; dictionary. You have to do this because of the way that python handles looking for doc tests. It looks for a &lt;code&gt;__test__&lt;/code&gt; dictionary inside of your module, and if that exists it looks through it, executing all docstrings as doctests. For more information look at the &lt;a href="http://www.python.org/doc/2.5.2/lib/doctest-which-docstrings.html" target="_blank"&gt;Python docs&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Now you should be able to go ahead and run the tests and see the magical &lt;code&gt;Ran 1 test in 0.003s  OK&lt;/code&gt; that all testers live for. This is little bit of overhead really threw me off when I was trying to break my tests.py out into the tests/ directory. &lt;/p&gt;&lt;p&gt;So now we have a test suite that is worthless, but you know how to use doc tests. If you didn't notice, the doctest format is simply the output of your default python shell, so when you are testing your code on the command line and it works, you can simple copy and paste it into your tests. This makes writing doc tests almost trivial. Note however, that they are somewhat fragile, and shouldn't be used for everything. In the next segment, we will talk about unit tests. Then we will compare the two and see when you should use each. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-8410683554753155524?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/8410683554753155524/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=8410683554753155524' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8410683554753155524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/8410683554753155524'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/11/introduction-to-pythondjango-testing.html' title='Introduction to Python/Django testing: Doctests'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6806976117272814026</id><published>2008-10-16T12:24:00.003-03:00</published><updated>2008-10-16T13:31:40.555-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Como cambiar lista de opciones en un ModelForm</title><content type='html'>&lt;pre&gt;# Model&lt;br /&gt;class &lt;span style="font-weight: bold;"&gt;Branch&lt;/span&gt;(models.Model):&lt;br /&gt; nombre = models.CharField(max_length=32)&lt;br /&gt; archivado = models.BooleanField()&lt;br /&gt;&lt;br /&gt;# Model&lt;br /&gt;class &lt;span style="font-weight: bold;"&gt;SolicitudPP&lt;/span&gt;(models.Model):&lt;br /&gt; branch = models.ForeignKey(&lt;span style="font-weight: bold;"&gt;Branch&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;# ModelForm&lt;br /&gt;class &lt;span style="font-weight: bold;"&gt;SolicitudPPForm&lt;/span&gt;(ModelForm):&lt;br /&gt; class Meta:&lt;br /&gt;     model = &lt;span style="font-weight: bold;"&gt;SolicitudPP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# Como cambiar lista de "branches" a mostrar:&lt;br /&gt;f = &lt;span style="font-weight: bold;"&gt;SolicitudPPForm&lt;/span&gt;()&lt;br /&gt;f.fields['branch'].queryset = Branch.objects.filter(archivado=False)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Artículo original: &lt;a href="http://oebfare.com/blog/2008/feb/23/changing-modelchoicefield-queryset/"&gt;http://oebfare.com/blog/2008/feb/23/changing-modelchoicefield-queryset/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6806976117272814026?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6806976117272814026/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6806976117272814026' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6806976117272814026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6806976117272814026'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/10/como-cambiar-lista-de-opciones-en-un.html' title='Como cambiar lista de opciones en un ModelForm'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2684600089197796825</id><published>2008-08-30T12:23:00.007-03:00</published><updated>2008-08-30T12:53:02.612-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='findbugs'/><category scheme='http://www.blogger.com/atom/ns#' term='gpath'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>FindBugs, Hudson, Groovy y errores de alta prioridad</title><content type='html'>Usando Groovy encontré una manera fácil de forzar el fallo de un "build" cuando FindBugs haya encontrado problemas con prioridad alta. Este script Groovy puede agregarse en un scritp Ant o como un ultimo paso dentro de un proyecto Hudson. Esto es necesario porque el plugin de Findbugs para Hudson (en la versión estable) no se puede configurar para que marque el build como inestable dependiendo de la cantidad de warnings de ALTA prioridad (aunque esto ya está en desarrollo, e implementado en HEAD).&lt;br /&gt;&lt;br /&gt;Usando Groovy + XPath:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import javax.xml.parsers.DocumentBuilderFactory&lt;br /&gt;import javax.xml.xpath.*&lt;br /&gt;&lt;br /&gt;content = new File("ant_build/findbugs/findbugs-report.xml").getText("UTF-8")&lt;br /&gt;&lt;br /&gt;builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()&lt;br /&gt;doc     = builder.parse(new ByteArrayInputStream(content.bytes))&lt;br /&gt;xpath = '/BugCollection/BugInstance[@priority="1"]'&lt;br /&gt;expr    = XPathFactory.newInstance().newXPath().compile(xpath)&lt;br /&gt;nodes   = expr.evaluate(doc, XPathConstants.NODESET)&lt;br /&gt;if(nodes.length&gt;0) {&lt;br /&gt;    throw new RuntimeException("FindBugs reporto ${nodes.length} warning(s) de prioridad ALTA")&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Usando GPath es mucho más fácil:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def bugCollection = new XmlParser().parseText(content)&lt;br /&gt;highPriorityBugs = bugCollection.BugInstance.findAll { it['@priority'] == '1' }&lt;br /&gt;if(highPriorityBugs.size()&gt;0) {&lt;br /&gt;    throw new RuntimeException("FindBugs reporto ${highPriorityBugs.size()} warning(s) de prioridad ALTA")&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El 'target' de Ant puede definirse así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;target name="groovy"&amp;gt;&lt;br /&gt; &amp;lt;taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"&amp;gt;&lt;br /&gt;  &amp;lt;classpath&amp;gt;&lt;br /&gt;   &amp;lt;fileset dir="lib/groovy"&amp;gt;&lt;br /&gt;    &amp;lt;include name="*.jar"&amp;gt;&amp;lt;/include&amp;gt;&lt;br /&gt;   &amp;lt;/fileset&amp;gt;&lt;br /&gt;  &amp;lt;/classpath&amp;gt;&lt;br /&gt;  &amp;lt;groovy&amp;gt;&lt;br /&gt;   &amp;lt;!--[CDATA[    // SCRIPT GROOVY AQUI    ]]--&amp;gt;&lt;br /&gt;  &amp;lt;/groovy&amp;gt;&lt;br /&gt; &amp;lt;/taskdef&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2684600089197796825?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2684600089197796825/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2684600089197796825' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2684600089197796825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2684600089197796825'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/08/findbugs-hudson-groovy-y-errores-de.html' title='FindBugs, Hudson, Groovy y errores de alta prioridad'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6745688448847097367</id><published>2008-08-18T00:55:00.002-03:00</published><updated>2008-08-18T00:56:11.935-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Tuning Your PostgreSQL Server</title><content type='html'>Encontré un artículo con buenas referencias, con información para afinar la configuración de PostgreSql.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server"&gt;http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6745688448847097367?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6745688448847097367/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6745688448847097367' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6745688448847097367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6745688448847097367'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/08/tuning-your-postgresql-server.html' title='Tuning Your PostgreSQL Server'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3372653674084129484</id><published>2008-05-03T23:13:00.003-03:00</published><updated>2008-05-03T23:16:09.646-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Relaciones (1:1, 1:n: m:n) con AppEngine</title><content type='html'>Encontré un link donde se explican las distintas formas de relacionar entidades. Está muy simple y describe los pro y contras de cada opción.&lt;br /&gt;&lt;a href="http://daily.profeth.de/2008/04/er-modeling-with-google-app-engine.html"&gt;http://daily.profeth.de/2008/04/er-modeling-with-google-app-engine.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3372653674084129484?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3372653674084129484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3372653674084129484' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3372653674084129484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3372653674084129484'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/05/relaciones-11-1n-mn-con-appengine.html' title='Relaciones (1:1, 1:n: m:n) con AppEngine'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3299416037573373881</id><published>2008-03-06T21:58:00.002-02:00</published><updated>2008-03-06T22:47:16.399-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openoffice'/><title type='text'>Salto de páginas con OpenOffice</title><content type='html'>En la página de OpenOffice están las instrucciones para incorporar una carátula a un documento, pero de forma tal que NO afecte a la numeración de nuestras páginas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.services.openoffice.org/wiki/Documentation/OOoAuthors_User_Manual/Writer_Guide/Numbering_pages"&gt;http://wiki.services.openoffice.org/wiki/Documentation/OOoAuthors_User_Manual/Writer_Guide/Numbering_pages&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3299416037573373881?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3299416037573373881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3299416037573373881' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3299416037573373881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3299416037573373881'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/03/salto-de-pginas-con-openoffice.html' title='Salto de páginas con OpenOffice'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2381834109298826587</id><published>2008-02-11T11:53:00.000-02:00</published><updated>2008-02-11T12:13:56.269-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Limpieza de paquetes de Ubuntu / Debian</title><content type='html'>Buscando algunos consejos para limpiar mi instalación de Ubuntu 7.10 (luego de hacer el upgrade desde 7.04) encontré &lt;a href="http://www.tuxapuntes.com/tux/content/view/416/122/"&gt;http://www.tuxapuntes.com/tux/content/view/416/122/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En resumen, el comando más útil para esta tarea es &lt;span style="font-weight: bold;"&gt;deborphan&lt;/span&gt;. Por ejemplo, para limpiar los archivos de configuración de paquetes eliminados podemos usar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;deborphan --find-config | xargs -r aptitude -y purge&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para ver la información de los paquetes que purgaríamos con el comando anterior, podemos usar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;deborphan --find-config | xargs -r dpkg -l&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El comando &lt;code&gt;deborphan&lt;/code&gt; posee varias opciones más de "busqueda" de paquetes ('deborphan --help' las lista)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2381834109298826587?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2381834109298826587/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2381834109298826587' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2381834109298826587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2381834109298826587'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/02/limpieza-de-paquetes-de-ubuntu-debian.html' title='Limpieza de paquetes de Ubuntu / Debian'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-3165717063118267617</id><published>2008-02-07T01:30:00.001-02:00</published><updated>2008-02-07T01:32:11.005-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Herramientas de testing para Python</title><content type='html'>Encontré un link muy bueno con una listado bastante extenso de las herramientas existentes para realizar el testing de programas desarrollados con Python.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy"&gt;http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-3165717063118267617?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/3165717063118267617/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=3165717063118267617' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3165717063118267617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/3165717063118267617'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/02/herramientas-de-testing-para-python.html' title='Herramientas de testing para Python'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-5173033718007878471</id><published>2008-01-07T21:18:00.000-02:00</published><updated>2008-01-07T21:22:29.085-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Cheat sheet de PostgreSql</title><content type='html'>Encontré 2 páginas con "cheat sheets" de PostgreSql (no sé cuál sería la traducción de "cheat sheets", quizá "machetes", pero para lo que no saben: son resúmenes sobre lenguajes, programas, etc. con información normalmente usada de referencia cuando no nos acordamos cómo especificar ciertas cosas).&lt;br /&gt;Estas "cheat sheets" las bajé de &lt;a href="http://www.postgresonline.com/journal/index.php?/archives/17-PostgreSQL-8.3-Cheat-Sheet-Overview.html"&gt;aqui&lt;/a&gt; y &lt;a href="http://www.alberton.info/postgresql_cheat_sheet.html"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-5173033718007878471?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/5173033718007878471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=5173033718007878471' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5173033718007878471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/5173033718007878471'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/01/cheat-sheet-de-postgresql.html' title='Cheat sheet de PostgreSql'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-462921523349093923</id><published>2008-01-07T20:40:00.000-02:00</published><updated>2008-01-07T20:46:23.852-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>StaticGenerator para aplicaciones Django</title><content type='html'>Esta herramienta convierte un sitio dinámico desarrollando de Django en un conjunto de HTMLs listos para servir. Es una forma muy común de mejorar significativamente la performance de un sitio. Es distribuido bajo la licencia MIT. &lt;a href="http://superjared.com/projects/static-generator/"&gt;http://superjared.com/projects/static-generator/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En el sitio declaran que se puede mejorar la performance de 500 request por segundo a 7000 req/s:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;mod_python, no caching: 100 req/s&lt;/li&gt;&lt;li&gt;mod_python, memcached: 500 req/s&lt;/li&gt;&lt;li&gt;StaticGenerator file: 7,000 req/s&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/957467034762846168-462921523349093923?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/462921523349093923/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=462921523349093923' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/462921523349093923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/462921523349093923'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2008/01/staticgenerator-para-aplicaciones.html' title='StaticGenerator para aplicaciones Django'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-1786287322566356835</id><published>2007-12-29T23:37:00.000-03:00</published><updated>2007-12-29T23:42:48.806-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Tamaño de tablas/BD en PostgreSql</title><content type='html'>PostgreSql posee algunas funciones muy útiles para determinar el tamaño en disco que ocupa una tabla o una base de datos. Estas son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;pg_relation_size&lt;/li&gt;&lt;li&gt;pg_total_relation_size&lt;/li&gt;&lt;li&gt;pg_database_size&lt;/li&gt;&lt;/ul&gt;Para visualizar mas facilmente el resultado de las funciones anteriores, de puede utilizar &lt;span style="font-weight: bold;"&gt;pg_size_pretty&lt;/span&gt;. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;intranet=# select pg_size_pretty(pg_total_relation_size('requerimiento'));&lt;br /&gt; pg_size_pretty&lt;br /&gt;----------------&lt;br /&gt; 23 MB&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Estas y otras funciones están &lt;a href="http://www.postgresql.org/docs/8.2/static/functions-admin.html"&gt;documentadas&lt;/a&gt; en el sitio de PostgreSql.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-1786287322566356835?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/1786287322566356835/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=1786287322566356835' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1786287322566356835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/1786287322566356835'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2007/12/tamao-de-tablasbd-en-postgresql.html' title='Tamaño de tablas/BD en PostgreSql'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-6055974433749415607</id><published>2007-12-12T09:02:00.000-03:00</published><updated>2007-12-12T09:05:28.079-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='thunderbird'/><category scheme='http://www.blogger.com/atom/ns#' term='xpcom'/><title type='text'>Threads en JavaScript usando XPCOM</title><content type='html'>Encontré una pagina con algunos ejemplos de como utilizar threads con XPCOM, muy útil para desarrollar extensiones de Firefox (y supongo también Thunderbird y el resto de los "primos" de Mozilla).&lt;br /&gt;&lt;br /&gt;Las instrucciones están en &lt;a href="http://skrul.com/blog/projects/threaddemo"&gt;http://skrul.com/blog/projects/threaddemo&lt;/a&gt; y el código accesible via SVN en &lt;a href="http://skrul.com/svn/threaddemo/trunk/"&gt;http://skrul.com/svn/threaddemo/trunk/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-6055974433749415607?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/6055974433749415607/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=6055974433749415607' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6055974433749415607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/6055974433749415607'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2007/12/threads-en-javascript-usando-xpcom.html' title='Threads en JavaScript usando XPCOM'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-957467034762846168.post-2451701708680788249</id><published>2007-12-10T11:13:00.000-03:00</published><updated>2007-12-10T11:15:59.246-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='extension'/><title type='text'>Download Statusbar + Checksum para bajar</title><content type='html'>He "empaquetado" en un XPI los cambios en Download Statusbar... Es realmente facil! Simplemente descomprimi el XPI original, le aplique los parches, cambie el nro. de versión y lo volví a comprimir!&lt;br /&gt;&lt;br /&gt;Pueden bajar Download Statusbar + Checksum desde &lt;a href="http://www.bamboo-it.com.ar/files/downbar-checksum/downbar0_9_5_2_checksum.xpi"&gt;aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/957467034762846168-2451701708680788249?l=blog.hgdeoro.com.ar' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.hgdeoro.com.ar/feeds/2451701708680788249/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=957467034762846168&amp;postID=2451701708680788249' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2451701708680788249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/957467034762846168/posts/default/2451701708680788249'/><link rel='alternate' type='text/html' href='http://blog.hgdeoro.com.ar/2007/12/download-statusbar-checksum-para-bajar.html' title='Download Statusbar + Checksum para bajar'/><author><name>Horacio G. de Oro</name><uri>https://profiles.google.com/112147667258546921145</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-25-qfdStSg0/AAAAAAAAAAI/AAAAAAAAAXc/Jy3uv5xHVEY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
