<?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-20311093</id><updated>2012-01-28T02:45:52.660-08:00</updated><category term='fs'/><category term='ruby'/><category term='podcast'/><category term='grub'/><category term='twisted'/><category term='pyinstaller'/><category term='apple'/><category term='latex'/><category term='techtalk'/><category term='3 actos'/><category term='iphone'/><category term='tesis'/><category term='cython'/><category term='git'/><category term='python'/><category term='steve jobs'/><category term='zope'/><category term='rst2pdf'/><category term='turbogears'/><category term='investigacion'/><category term='video'/><category term='pyqt4'/><category term='inkscape'/><category term='inner blur'/><category term='colacion'/><category term='linux'/><category term='xfs'/><category term='snippets'/><category term='ext3'/><category term='None'/><category term='Debian'/><category term='effect'/><category term='tutorial'/><category term='googlevideo'/><category term='reinventar la rueda'/><category term='unpsjb'/><category term='celular'/><category term='textmate'/><category term='googlecode'/><category term='django'/><category term='gui'/><category term='bitbucket'/><category term='gpu'/><category term='captcha'/><category term='pyqt'/><category term='ipod'/><category term='mac'/><category term='prymatex'/><category term='dsl'/><category term='servicio'/><category term='amarok'/><category term='j2ee'/><category term='mercurial'/><category term='screencast'/><title type='text'>Python y otros yuyos</title><subtitle type='html'>Linux, desarrollo de software, un poco de musica, un poco de gráfica, etc.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default?start-index=101&amp;max-results=100'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>145</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20311093.post-6580858670790391931</id><published>2011-07-08T10:39:00.000-07:00</published><updated>2011-07-08T10:45:17.540-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='investigacion'/><category scheme='http://www.blogger.com/atom/ns#' term='unpsjb'/><title type='text'>Un gran amigo que también es un grande</title><content type='html'>Me acaba de llegar este mail:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #202020; font-family: 'Droid Sans', arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp; &amp;nbsp;Fecha: Tue, 28 Jun 2011 18:06:41 -0300&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; De: Gustavo Rossi&amp;nbsp;&lt;gustavo&gt;&lt;br /&gt;Asunto: Lifiano premiado&lt;br /&gt;&amp;nbsp; &amp;nbsp; Para:&amp;nbsp;gustavo&lt;br /&gt;&lt;br /&gt;La semana pasada, Sergio Firmenich obtuvo el best paper award en la&amp;nbsp;&lt;br /&gt;International Conference on Web Engineering que se realizo en Chipre&amp;nbsp;&lt;br /&gt;por el trabajo:&lt;br /&gt;A framework for concern sensitive client side adaptation&lt;br /&gt;(S. Firmenich, M . Winckler, G. Rossi y S. Gordillo)&lt;br /&gt;&lt;br /&gt;Grande Sergio!!!!!&lt;br /&gt;&lt;br /&gt;------------------------------&lt;wbr&gt;&lt;/wbr&gt;------------------------------&lt;wbr&gt;&lt;/wbr&gt;----&lt;br /&gt;This message was sent using IMP, the Internet Messaging Program.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----- Terminar mensaje reenviado -----&lt;/gustavo&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #202020; font-family: 'Droid Sans', arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Sergio, o para los amigos Keco, fue un compañero de la UNPSJB, de trabajo y es un gran amigo, y hoy está haciendo su doctorado en La Plata.&lt;br /&gt;Me pone muy contento su logro en el campo de la investigación.&lt;br /&gt;Estoy leyendo el paper, que encontré publicado en:&amp;nbsp;&lt;a href="http://www.springerlink.com/content/n3167p807121r318/"&gt;http://www.springerlink.com/content/n3167p807121r318/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¡¡¡Felicitaciones Keco!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-6580858670790391931?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6580858670790391931/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6580858670790391931' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6580858670790391931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6580858670790391931'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2011/07/un-gran-amigo-que-tambien-es-un-grande.html' title='Un gran amigo que también es un grande'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-1118685328013027891</id><published>2011-07-06T19:50:00.000-07:00</published><updated>2011-07-06T19:50:40.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyqt4'/><category scheme='http://www.blogger.com/atom/ns#' term='prymatex'/><title type='text'>Custom Delegates en Prymatex</title><content type='html'>MVC es un patrón de diseño muy conocido, que ha sufrido algunas bastardizaciones, como es el caso de MTV en Django y MVD en Qt.&lt;br /&gt;Hoy quería comentarles como estamos usando esta última en Prymatex.&lt;br /&gt;Como muchos de ustedes sabrán, Prymatex está escrito sobre PyQt4 y recientemente comenzamos a utilizar modelos para almacenar tanto la información de los Bundles, como los temas y variables de entorno (un elemento muy utilizado a la hora de ejecutar los diferentes Bundle Items). Estos modelos responden al concepto Modelo/Vista/Delegado de Qt.&lt;br /&gt;Tods saben a que se refiere modelo y a que vista, pero que es un delegado? Un delegado sirve para permitir a la vista modificar el modelo y además permite hacer widgets especiales (un ejemplo popular para quienes utilcen KDE es el estrellómetro de Amarok).&lt;br /&gt;&lt;br /&gt;Utilizamos delegates para hacer clonar la interfase de configuración de temas de TextMate:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pJNn4XFrMao/ThUc7pi43CI/AAAAAAAABVE/H4ksZKcdEy4/s1600/preferences+colors" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-pJNn4XFrMao/ThUc7pi43CI/AAAAAAAABVE/H4ksZKcdEy4/s320/preferences+colors" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Salvando las distancias, mediante delegates pudimos emular en cierta forma el listado:&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/-2XFZ_6H9g6s/ThUeElzYJSI/AAAAAAAABVI/oe8sg6pKCRw/s1600/pmx2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://1.bp.blogspot.com/-2XFZ_6H9g6s/ThUeElzYJSI/AAAAAAAABVI/oe8sg6pKCRw/s320/pmx2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;El código utilizado está en &lt;a href="https://github.com/D3f0/prymatex/blob/7435852fd33fdfde9bca428c118a46ec18d0965e/prymatex/mvc/delegates.py"&gt;github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-1118685328013027891?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/1118685328013027891/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=1118685328013027891' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1118685328013027891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1118685328013027891'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2011/07/custom-delegates-en-prymatex.html' title='Custom Delegates en Prymatex'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-pJNn4XFrMao/ThUc7pi43CI/AAAAAAAABVE/H4ksZKcdEy4/s72-c/preferences+colors' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6849552261386432034</id><published>2011-06-11T11:14:00.001-07:00</published><updated>2011-06-11T11:14:02.017-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='None'/><title type='text'>Finalmente con un androide ente mis manos</title><content type='html'>&lt;a href="http://lh5.ggpht.com/-TnD1RiiOn-E/TfOwZ6SKMDI/AAAAAAAABSc/r08ck2ZVDLc/Finalmente%252520con%252520un%252520androide%252520ente%252520mis%252520manos_img_1.png"&gt;&lt;img src="http://lh5.ggpht.com/-TnD1RiiOn-E/TfOwZ6SKMDI/AAAAAAAABSc/r08ck2ZVDLc/Finalmente%252520con%252520un%252520androide%252520ente%252520mis%252520manos_img_1.png" style="margin: 0pt 10px 10px 0pt; float: left cursor: pointer;" height="240px" width="320px" /&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;Blogueando desde el cel&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-6849552261386432034?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6849552261386432034/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6849552261386432034' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6849552261386432034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6849552261386432034'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2011/06/finalmente-con-un-androide-ente-mis.html' title='Finalmente con un androide ente mis manos'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-TnD1RiiOn-E/TfOwZ6SKMDI/AAAAAAAABSc/r08ck2ZVDLc/s72-c/Finalmente%252520con%252520un%252520androide%252520ente%252520mis%252520manos_img_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-1901172082236541146</id><published>2011-03-09T14:03:00.000-08:00</published><updated>2011-03-09T14:03:22.012-08:00</updated><title type='text'>Errores en la compilación</title><content type='html'>Este &lt;a href="http://www.google.com.ar/search?q=carnaval+argentina+argentina&amp;amp;hl=es-419&amp;amp;safe=off&amp;amp;client=ubuntu&amp;amp;hs=RJS&amp;amp;channel=cs&amp;amp;prmd=ivnsu&amp;amp;source=univ&amp;amp;tbs=nws:1&amp;amp;tbo=u&amp;amp;sa=X&amp;amp;ei=Bvl3TcCTBI-00QHzm4XeBg&amp;amp;ved=0CDkQqAI"&gt;finde largo&lt;/a&gt; estuvimos haciendo algunos avances y reingenierías sobre &lt;a href="https://github.com/D3f0/prymatex"&gt;Prymatex&lt;/a&gt; y definiendo un posible calendario tentativos de releases.&lt;br /&gt;Yo aporté gran parte de los &lt;a href="http://wiki.python.org/moin/JonathanGardnerPyQtTutorial#Using_pyuic"&gt;archivos UI&lt;/a&gt; (XML con definición de interfases de Qt). Como todos habían migrado a &lt;a href="http://www.kdeblog.com/lanzado-kde-4-6-1-nombre-codigo-helga.html"&gt;KDE 4.6.1&lt;/a&gt;, para no quedarme atrás usé los repositorios experimentales propuestos por kubunut. Durante un &lt;a href="http://en.wikipedia.org/wiki/Sprint_(software_development)"&gt;code sprint&lt;/a&gt; con &lt;a href="http://pinguinox.com.ar/"&gt;Org&lt;/a&gt;, me di cuenta que mi &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pyuic4&lt;/span&gt; había dejando de funcionar!!&lt;br /&gt;&lt;br /&gt;El error se reporta como el siguiente:&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;Traceback (most recent call last):&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/port_v2/invoke.py", line 15, in invoke&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;exit_status = driver.invoke()&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/driver.py", line 40, in invoke&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self._generate()&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/driver.py", line 68, in _generate&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self._opts.pyqt3_wrapper, self._opts.from_imports)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/__init__.py", line 134, in compileUi&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;winfo = compiler.UICompiler().compileUi(uifile, pyfile, from_imports)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/Compiler/compiler.py", line 19, in __init__&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;CompilerCreatorPolicy())&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/uiparser.py", line 91, in __init__&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self.factory = QObjectCreator(creatorPolicy)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "/usr/lib/pymodules/python2.6/PyQt4/uic/objcreator.py", line 61, in __init__&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;self._cwFilters.append(plugin_locals["getFilter"]())&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;File "&lt;string&gt;", line 22, in getFilter&lt;/string&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;ImportError: /usr/lib/pymodules/python2.6/PyKDE4/kdeui.so: undefined symbol: _ZTI13KRatingWidget&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Esto no era bueno, simplemente agregamos un return en la carga de plugins, quedando &lt;a href="http://pastebin.com/WPgDuZhx"&gt;de esta manera&lt;/a&gt;.&lt;br /&gt;Un hack feo, pero solucionó el problema :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-1901172082236541146?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/1901172082236541146/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=1901172082236541146' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1901172082236541146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1901172082236541146'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2011/03/errores-en-la-compilacion.html' title='Errores en la compilación'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8662185958367626471</id><published>2010-12-29T10:25:00.000-08:00</published><updated>2010-12-29T10:25:25.265-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='prymatex'/><title type='text'>Primer Merge con Git</title><content type='html'>Tengo que admitir que me está costando adquirir la práctica en git que tenía en mercurial, en parte mucho me ayuda &amp;nbsp;&lt;a href="https://github.com/robbyrussell/oh-my-zsh"&gt;oh my zsh&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hoy ocurrió lo intevitable, diego y yo tuvimos que mergear lo que veníamos haciendo. Como git pull hace un merge por defecto, intenté ver que pasaba si lo hacia de manera verborrágica:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;defo:prymatex$ git pull -v origin master&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;From github.com:D3f0/prymatex&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;* branch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;master &amp;nbsp; &amp;nbsp; -&amp;gt; FETCH_HEAD&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Renaming src/prymatex/app.py =&amp;gt; src/prymatex/core/app.py&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Auto-merging src/prymatex/core/app.py&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CONFLICT (rename/modify): Merge conflict in src/prymatex/core/app.py&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Automatic merge failed; fix conflicts and then commit the result.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Acá tenemos un renombrado y a su vez un conflicto entre las versiones. Git me invitó a relizar los arreglos, para esto necesitaba algo visual, como kdiff3. Esta heramienta se llama &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git mergetool&lt;/span&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;"&gt;defo:prymatex$ git mergetool&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;merge tool candidates: opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse ecmerge p4merge araxis emerge vimdiff&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Merging the files: core/app.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&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;"&gt;Normal merge conflict for 'core/app.py':&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{local}: modified&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{remote}: modified&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Hit return to start merge resolution tool (kdiff3):&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_CICZrYFdH1w/TRt7S2NskAI/AAAAAAAABOM/FDXn3QdAZGA/s1600/git_conflict.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://1.bp.blogspot.com/_CICZrYFdH1w/TRt7S2NskAI/AAAAAAAABOM/FDXn3QdAZGA/s320/git_conflict.png" width="320" /&gt;&lt;/a&gt;&lt;/div&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;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;Finalmente cuando completé de parchar, hice un commit, que quedó mostró lo siguiente:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;&lt;/span&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;"&gt;defo:prymatex$ git commit -m "merge"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[master b67d4b6] merge&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahí pude hacer push del merge sin problemas:&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;"&gt;defo:prymatex$ git push origin master&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Counting objects: 89, done.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Delta compression using up to 2 threads.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Compressing objects: 100% (60/60), done.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Writing objects: 100% (61/61), 11.41 KiB, done.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Total 61 (delta 42), reused 0 (delta 0)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;To git@github.com:D3f0/prymatex.git&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; c4e1ac2..b67d4b6 &amp;nbsp;master -&amp;gt; master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y gitk me muestra lo siguiente:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_CICZrYFdH1w/TRt7896M_1I/AAAAAAAABOQ/qHPLUFPhbBo/s1600/git_conflict1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://2.bp.blogspot.com/_CICZrYFdH1w/TRt7896M_1I/AAAAAAAABOQ/qHPLUFPhbBo/s320/git_conflict1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algo que también se puede apreciar en el &lt;a href="https://github.com/D3f0/prymatex/network"&gt;navegador de versiones de github hecho con canvas :)&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/20311093-8662185958367626471?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8662185958367626471/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8662185958367626471' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8662185958367626471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8662185958367626471'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/12/primer-merge-con-git.html' title='Primer Merge con Git'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/TRt7S2NskAI/AAAAAAAABOM/FDXn3QdAZGA/s72-c/git_conflict.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5598919961091805915</id><published>2010-12-16T15:19:00.000-08:00</published><updated>2010-12-16T15:19:48.159-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reinventar la rueda'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='prymatex'/><title type='text'>Ponyguruma</title><content type='html'>Hoy jugueteando con Cython,&amp;nbsp;después&amp;nbsp;del último post...&amp;nbsp;&lt;a href="http://dev.pocoo.org/irclogs/%23pocoo.2007-09-29.log"&gt;encoré&amp;nbsp;que el binding de oniguruma&lt;/a&gt; &lt;a href="http://dev.pocoo.org/hg/sandbox/file/98ce1ce17c7c/ponyguruma"&gt;ya existía&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$&amp;nbsp;hg clone http://dev.pocoo.org/hg/sandbox/ pocoo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ cd poco/ponyguruma&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ sudo python setup.py install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y después en ipython:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;In [1]: import ponyguruma&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;In [2]: r = ponyguruma.Regexp('(?&lt;name&gt;[\d\w]+)\s(?&lt;age&gt;\d{1,3})')&lt;/age&gt;&lt;/name&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;In [3]: m = r.match('jose23 21')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;In [4]: m.groupdict&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Out[4]: {'age': '21', 'name': 'jose23'}&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Emula re y está mantenido por la gente de &lt;a href="http://www.pocoo.org/projects/"&gt;pocoo&lt;/a&gt;&amp;nbsp;que tiene muchos proyectos conocidos, así que voy a etiquetar este post con reinventar la rueda :'(&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5598919961091805915?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5598919961091805915/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5598919961091805915' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5598919961091805915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5598919961091805915'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/12/ponyguruma.html' title='Ponyguruma'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5833006198273807381</id><published>2010-12-16T14:15:00.000-08:00</published><updated>2010-12-16T15:20:14.328-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='prymatex'/><category scheme='http://www.blogger.com/atom/ns#' term='cython'/><title type='text'>Cython: Librería de Python para extensiones interactuando con C</title><content type='html'>Hace unos días estoy probando &lt;a href="http://docs.cython.org/"&gt;Cython&lt;/a&gt;, una librería que permite generar extensiones para Python escritas en un lenguaje muy parecido a Python, pero con la posibilidad de utilizar funciones de C.&lt;br /&gt;&lt;br /&gt;Para instalarlo podemos usar pip o easy_install:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ easy_install cython # o pip install cython&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un ejemplo muy sencillo, que envuelve a dos funciones de &lt;a href="http://es.wikipedia.org/wiki/Stdlib.h"&gt;stdlib&lt;/a&gt;, que acabamos de hacer con v4n.&lt;/div&gt;&lt;quote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/quote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# b.pyx&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cdef extern from "stdlib.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; &amp;nbsp; &amp;nbsp; &amp;nbsp;int strlen(char *s)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char *strdup(char *)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def longitud(s):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return strlen(s)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def duplicar(s):&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cdef char *n = strdup(s)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return unicode(n)&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Es un ejemplo muy sencillo y que trata de demostrar que sencillo es envolver las funciones, ahora veamos como compilarlo. Para esto creamos un archivo &lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;setup.py&lt;/span&gt;&lt;/b&gt; con lo siguiente, suponeindo que nombramos a lo anterior &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;b.pyx&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;from distutils.core import setup&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;from distutils.extension import Extension&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;from Cython.Distutils import build_ext&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ext_modules = [Extension("b", ["b.pyx"])]&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;setup(&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;name = 'b',&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;cmdclass = {'build_ext': build_ext},&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;ext_modules = ext_modules&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finalmente, para compilar,&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-family: 'Courier New', Courier, monospace;"&gt;$ python setup.py &amp;nbsp;build_ext --inplace&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Listo, ahora podemos hacer:&lt;/span&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;"&gt;$ python&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[GCC 4.4.5] on linux2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;import b&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;"&gt;&amp;gt;&amp;gt;&amp;gt; dir(b)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__test__', 'duplicar', 'longitud']&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; b.&lt;b&gt;longitud&lt;/b&gt;('alfa')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; u = b.&lt;b&gt;duplicar&lt;/b&gt;('una cadena')&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; print u&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;una cadena&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; u&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;u'una cadena'&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Muy sencillo, hay una inferencia de tipos muy interesante para cuestiones básicas. En prymatex estoy intentando wrapear &lt;a href="http://www.geocities.co.jp/kosako3/oniguruma/doc/API.txt"&gt;oniguruma&lt;/a&gt; en una forma similar a &lt;a href="http://docs.python.org/library/re.html"&gt;re&lt;/a&gt;, porque como ya mencioné en algún momento, las definiciones de sintaxis están hechas &lt;a href="https://github.com/gtcaz/ebundles/raw/master/Bundles/Python.tmbundle/Syntaxes/Python.tmLanguage"&gt;en este formato&lt;/a&gt;. Si les interesa chusmear,&lt;a href="https://github.com/D3f0/prymatex/blob/master/src/prymatex/lib/oniguruma/pyonig.pyx"&gt; está por acá&lt;/a&gt; (hasta que aprenda a usar &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"&gt;git submodule&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/20311093-5833006198273807381?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5833006198273807381/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5833006198273807381' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5833006198273807381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5833006198273807381'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/12/cython-libreria-de-python-para.html' title='Cython: Librería de Python para extensiones interactuando con C'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5678384343670502071</id><published>2010-12-11T14:30:00.000-08:00</published><updated>2010-12-11T14:30:43.003-08:00</updated><title type='text'>Rendí el Certificate in Advanced English (CAE)</title><content type='html'>El pasado 8 de diciembre rendí el &lt;a href="http://www.cambridgeesol.org/exams/general-english/cae.html"&gt;CAE&lt;/a&gt;&amp;nbsp;de la universidad de Cambridge! Después de prepararme un año finalmente tuve el examen en el instituto Leif en Puerto Madryn.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_CICZrYFdH1w/TQP7InTAMaI/AAAAAAAABNc/8X7_1PmEoV8/s1600/IMG_1859.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_CICZrYFdH1w/TQP7InTAMaI/AAAAAAAABNc/8X7_1PmEoV8/s320/IMG_1859.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Desde las 8:30 hasta las 15:45 con una hora y cuarto para comer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5678384343670502071?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5678384343670502071/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5678384343670502071' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5678384343670502071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5678384343670502071'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/12/rendi-el-certificate-in-advanced.html' title='Rendí el Certificate in Advanced English (CAE)'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/TQP7InTAMaI/AAAAAAAABNc/8X7_1PmEoV8/s72-c/IMG_1859.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4906767842757122812</id><published>2010-12-11T13:31:00.000-08:00</published><updated>2010-12-11T13:33:30.359-08:00</updated><title type='text'>Un nuevo título para el Blog</title><content type='html'>Ya hace mucho tiempo &lt;a href="http://pinguinox.com.ar/"&gt;cierta gente&lt;/a&gt; se confundía el título con la propaganda de sprite, así que decidí cambiarlo a algo más adecuado y menos elaborado.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;object height="360" width="480"&gt;&lt;param name="movie" value="http://www.dailymotion.com/swf/video/x2noev?width=&amp;theme=none&amp;foreground=%23F7FFFD&amp;highlight=%23FFC300&amp;background=%23171D1B&amp;start=&amp;animatedTitle=&amp;iframe=0&amp;additionalInfos=0&amp;autoPlay=0&amp;hideInfos=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/x2noev?width=&amp;theme=none&amp;foreground=%23F7FFFD&amp;highlight=%23FFC300&amp;background=%23171D1B&amp;start=&amp;animatedTitle=&amp;iframe=0&amp;additionalInfos=0&amp;autoPlay=0&amp;hideInfos=0" width="480" height="360" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.dailymotion.com/video/x2noev_sprite-las-cosas-como-son_fun"&gt;Sprite - Las cosas como son&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Cargado por &lt;a href="http://www.dailymotion.com/mazcue"&gt;mazcue&lt;/a&gt;. - &lt;a href="http://www.dailymotion.com/ar/channel/fun" target="_self"&gt;Mira más vídeos divertidos.&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ahora con un título más simple, espero darle un poco más de bola. Aunque esta es una promesa&amp;nbsp;difícil&amp;nbsp;de mantener. También agregué disqus que encontré en el blog de &lt;a href="http://lateral.netmanagers.com.ar/"&gt;Roberto Alisna&lt;/a&gt;&amp;nbsp;y que despues me di cuenta que estaba por todos lados, como en la documentación de &lt;a href="http://docs.jquery.com/Main_Page"&gt;jQuery&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4906767842757122812?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4906767842757122812/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4906767842757122812' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4906767842757122812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4906767842757122812'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/12/un-nuevo-titulo-para-el-blog.html' title='Un nuevo título para el Blog'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5043424470717834926</id><published>2010-12-05T15:31:00.000-08:00</published><updated>2010-12-05T15:44:34.157-08:00</updated><title type='text'>Lector de Tarjetas Encore lee SIMs</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hace un tiempo, en la &lt;a href="http://picasaweb.google.com/113503614079325031929/DevFest2010BuenosAires1Y2DeNoviembre?feat=flashslideshow#"&gt;GoogleDevFest '10&lt;/a&gt; me compré un lector de tarjetas de memoria, por que lamentablemente mi lector interno de la notebook solo funciona para memorias SD.&lt;div&gt;El artefacto en cuestión es el siguiente:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://t3.gstatic.com/images?q=tbn:SFWjQx7k8a8FXM:http://www.encore-usa.com/pe/sites/default/files/productslide/ENUCR-3_pdt_main_091204.png&amp;amp;t=1"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 241px; height: 209px;" src="http://t3.gstatic.com/images?q=tbn:SFWjQx7k8a8FXM:http://www.encore-usa.com/pe/sites/default/files/productslide/ENUCR-3_pdt_main_091204.png&amp;amp;t=1" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Lo que no me había dado cuenta es que podía leer las tarjetas SIM. Una forma práctica de tener un backup de los contactos sin recurrir a los servicios del operador de celular (que tienen costo).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La aplicación para linux que encontré es &lt;a href="http://www.integrazioneweb.com/monosim/"&gt;MonoSIM&lt;/a&gt;, que instalé desde &lt;a href="http://www.getdeb.net/welcome/"&gt;getdeb&lt;/a&gt;. La plicación primero te pregunta que lector tenes, en mi caso no había mucha opicón:&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_CICZrYFdH1w/TPwjecC-qkI/AAAAAAAABMQ/Egv6j4KyeIk/s1600/simreader.png"&gt;&lt;img src="http://2.bp.blogspot.com/_CICZrYFdH1w/TPwjecC-qkI/AAAAAAAABMQ/Egv6j4KyeIk/s320/simreader.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5547347846845344322" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 93px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Finalmente pude acceder a los contactos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_CICZrYFdH1w/TPwjtUuN6eI/AAAAAAAABMY/OW_4QyTGXgk/s320/simreader1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5547348102577252834" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 278px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5043424470717834926?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5043424470717834926/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5043424470717834926' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5043424470717834926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5043424470717834926'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/12/lector-de-tarjetas-encore-lee-sims.html' title='Lector de Tarjetas Encore lee SIMs'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/TPwjecC-qkI/AAAAAAAABMQ/Egv6j4KyeIk/s72-c/simreader.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-1897017347362299928</id><published>2010-10-09T07:24:00.001-07:00</published><updated>2010-10-09T07:28:12.239-07:00</updated><title type='text'>Amarok y la mega</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/TLB7T_XTCrI/AAAAAAAABEQ/VJFhYe2z1zY/s1600/mega_en_amarok.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/TLB7T_XTCrI/AAAAAAAABEQ/VJFhYe2z1zY/s320/mega_en_amarok.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5526052326140480178" /&gt;&lt;/a&gt;&lt;br /&gt;Usando Amarok para escuchar el stream de la mega. Lo curioso es que el pugin de wikipieda me tiró la programación de la radio. &lt;div&gt;Cuesta acostumbrarse la versión 2 de este reproductor, pero pequeños detalles como estos están buenos :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-1897017347362299928?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/1897017347362299928/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=1897017347362299928' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1897017347362299928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1897017347362299928'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/10/amarok-y-la-mega.html' title='Amarok y la mega'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/TLB7T_XTCrI/AAAAAAAABEQ/VJFhYe2z1zY/s72-c/mega_en_amarok.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-152507935323500176</id><published>2010-08-24T19:01:00.001-07:00</published><updated>2010-08-24T19:02:56.495-07:00</updated><title type='text'>Curso de Python 2010</title><content type='html'>Comenzó el Curso de Python 2010 en la Universidad Nacional de la Patagonia, edición 2010.&lt;div&gt;El sitio es: &lt;a href="https://sites.google.com/site/cursodepython/"&gt;https://sites.google.com/site/cursodepython/&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/20311093-152507935323500176?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/152507935323500176/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=152507935323500176' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/152507935323500176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/152507935323500176'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/08/curso-de-python-2010.html' title='Curso de Python 2010'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2702981557372544677</id><published>2010-08-18T19:41:00.000-07:00</published><updated>2010-08-18T19:45:44.362-07:00</updated><title type='text'>PyQt4 y sus definiciones de interfase en XML</title><content type='html'>PyQt4 trae dentro de sus herramientas de dearrollo un diseñador de interfases muy cómodo para hacer layouts complejos y facilita su mantenimiento. Este diseñador genera unos archivos XML de extensión UI.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En PyQt4 existen básicamente 2 formas de utilizarlos, cargarlos dinámicamente o compilarlos con la utilidad pyuic. La primera variante es muy interesante para empezar, ya que con solo guardar y volver a lanzar nuestro script, veremos los cambios reflejados.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La segunda variante es la compilación. Generalmente utilizo un Makefile para automatizar esta tarea, y voy a postearlo para poder tenerlo a mano al volver al blog. Quizás a más de uno le sirva:&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';"&gt;# Generar los uic de los ui&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;UI_DIR = "ui_files"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;UI_FILES = $(shell find ${UI_DIR} -iname "*.ui")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;PY_FILES = $(foreach file,${UI_FILES},ui_$(patsubst %.ui,%.py,$(notdir ${file})))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;all: ${PY_FILES}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;ui_%.py: ui_files/%.ui&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;pyuic4 $^ -x -o $@&lt;/span&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/20311093-2702981557372544677?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2702981557372544677/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2702981557372544677' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2702981557372544677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2702981557372544677'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/08/pyqt4-y-sus-definiciones-de-interfase.html' title='PyQt4 y sus definiciones de interfase en XML'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8503910317554079667</id><published>2010-06-27T20:03:00.000-07:00</published><updated>2010-06-27T20:35:15.388-07:00</updated><title type='text'>Velocidades de los medios de almacenamiento</title><content type='html'>Hoy se me dio por comparar las velocidades del disco de la notebook, mi pendrive Flash Voyager de Corssair y una memoria SD Kingston de 2GB.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La salida del &lt;a href="http://es.wikipedia.org/wiki/Hdparm"&gt;hdparm&lt;/a&gt; fue la siguiente:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;defo:~$ sudo hdparm -tT /dev/sda /dev/mmcblk0 /dev/sdb&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/dev/sda:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Timing cached reads:   2164 MB in  2.00 seconds = 1082.96 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Timing buffered disk reads:  186 MB in  3.02 seconds =  61.49 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/dev/mmcblk0:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Timing cached reads:   1988 MB in  2.00 seconds = 994.66 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Timing buffered disk reads:   36 MB in  3.09 seconds =  11.65 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;/dev/sdb:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Timing cached reads:   2128 MB in  2.00 seconds = 1064.50 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Timing buffered disk reads:   76 MB in  3.07 seconds =  24.79 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Con un poco de ayuda de shellscript y googledocs armé una comparación, creo que es útil para las personas que creen que el SD es la solución para transportar información. Son muy lentos. Tan lentos que a veces he visto a Windows hacer cosas extrañas (tampoco se necesita tanto para eso).&lt;br /&gt;&lt;img src="http://spreadsheets.google.com/oimg?key=0AgexwOa1XqPCdHJlQzZFdEE0SGxtTm04NkVIS3ZEUUE&amp;amp;oid=1&amp;amp;zx=7u6ex2nino5o" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8503910317554079667?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8503910317554079667/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8503910317554079667' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8503910317554079667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8503910317554079667'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/06/velocidades-de-los-medios-de.html' title='Velocidades de los medios de almacenamiento'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-964648178628473933</id><published>2010-06-13T10:00:00.000-07:00</published><updated>2010-06-13T10:10:55.849-07:00</updated><title type='text'>Grabando desde Microfono Interno y Externo en XPS1530</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/TBUQfsy-ETI/AAAAAAAABDU/lc8cANw7wkY/s1600/pa2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/TBUQfsy-ETI/AAAAAAAABDU/lc8cANw7wkY/s320/pa2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5482306258180378930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/TBUQfRfx2QI/AAAAAAAABDM/3aI26XIJnA0/s1600/pa1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 250px; height: 320px;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/TBUQfRfx2QI/AAAAAAAABDM/3aI26XIJnA0/s320/pa1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5482306250852129026" /&gt;&lt;/a&gt;&lt;br /&gt;Hace unos días necesité utilizar el micrófono interno de la notebook, pero nunca parecía funcionar desde KMix. Desde Gnome funcionaba perfectamente, pero no le iba dar el gusto a &lt;a href="http://pinguinox.com.ar/"&gt;Org&lt;/a&gt;. Buscando en los foros de Ubuntu, encontré una respuesta interesante: Los microfonos siempre funcionan, pero el problema es el nivel de ganancia. Y era cierto, con &lt;a href="http://0pointer.de/lennart/projects/pavucontrol/"&gt;un control de volumen de PulseAudio&lt;/a&gt; pude ver que estaban saturando. Y al saturar se enmudecen. Así que fue solo cuestión de ajustar a un nivel que no sature.&lt;div&gt;Les dejo unas capturas. El paquete en ubuntu/kubuntu se llama &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;pavucontrol.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; "&gt;Para quien le interese, el micrófono interno es el 1 y el de la entrada de 3.5mm es el 3.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;meta equiv="content-type" content="text/html; charset=utf-8"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-964648178628473933?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/964648178628473933/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=964648178628473933' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/964648178628473933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/964648178628473933'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/06/grabando-desde-microfono-interno-y.html' title='Grabando desde Microfono Interno y Externo en XPS1530'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/TBUQfsy-ETI/AAAAAAAABDU/lc8cANw7wkY/s72-c/pa2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-1921014968662429841</id><published>2010-05-21T17:47:00.001-07:00</published><updated>2010-06-13T10:14:47.509-07:00</updated><title type='text'>Buen Soporte de HP en Linux</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/S_ctu61KqkI/AAAAAAAABBk/ygYSRlDnH5M/s1600/HP1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/S_ctu61KqkI/AAAAAAAABBk/ygYSRlDnH5M/s320/HP1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5473894156181613122" /&gt;&lt;/a&gt;&lt;br /&gt;Hace ya más de dos años adquirí con &lt;a href="http://www.lifia.info.unlp.edu.ar/es/staff.htm"&gt;Keko&lt;/a&gt; una impresora &lt;a href="http://h10025.www1.hp.com/ewfrf/wc/document?lc=es&amp;amp;dlc=es&amp;amp;cc=es&amp;amp;docname=c01287386"&gt;HP P1005&lt;/a&gt;. Hace poco me la traje a mi nuevo hogar y si bien Ubuntu Lucid había detectado la impresora como unas tantas HP más en el trabajo, me pidió que baje los drivers desde HP.&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_CICZrYFdH1w/S_ctvPw-IaI/AAAAAAAABBs/IYStMKHjJhw/s1600/HP2.png"&gt;&lt;img src="http://4.bp.blogspot.com/_CICZrYFdH1w/S_ctvPw-IaI/AAAAAAAABBs/IYStMKHjJhw/s320/HP2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5473894161801159074" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 238px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En &lt;a href="http://sourceforge.net/projects/hplip/"&gt;sourceforge&lt;/a&gt; conseguí una versión acutal de HLIP, que reemplazó la que viene con Ubuntu. La instalación fue la ejecución de un script, que quitó gran parte de los paquetes relacionados con hplip en ubuntu. Finalmente la impresora quedó funcionando.&lt;/div&gt;&lt;div&gt;Fue grata la sorpresa de encontrar que el forntend estaba hecho en Python y Qt4, acá les dejo una captura:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_CICZrYFdH1w/S_ctvZrkmzI/AAAAAAAABB0/Sw-ynfEPfJE/s1600/HP3.png"&gt;&lt;img src="http://3.bp.blogspot.com/_CICZrYFdH1w/S_ctvZrkmzI/AAAAAAAABB0/Sw-ynfEPfJE/s320/HP3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5473894164462869298" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 306px; height: 320px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Update: El Scanner tambén funciona en las multifunción!, pero para quienes tengan una impresora de red, pueden hacer,&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ hpmakeuri direccion_ip #Esto genera una dirección hp:// de para XSane&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$ xsane &lt;uri_de_xane&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Gracias &lt;a href="http://ar.linkedin.com/pub/alejandro-oscar-cisternas/9/570/976"&gt;Lalo&lt;/a&gt; por el tip&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-1921014968662429841?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/1921014968662429841/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=1921014968662429841' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1921014968662429841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1921014968662429841'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/05/buen-soporte-de-hp-en-linux.html' title='Buen Soporte de HP en Linux'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/S_ctu61KqkI/AAAAAAAABBk/ygYSRlDnH5M/s72-c/HP1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-9207887087577309632</id><published>2010-05-08T07:23:00.000-07:00</published><updated>2010-05-08T08:01:56.071-07:00</updated><title type='text'>La ficha del docente corre en Wine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/S-V8ypgqesI/AAAAAAAABBc/pCfHnuwG74c/s1600/ficha.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 191px;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/S-V8ypgqesI/AAAAAAAABBc/pCfHnuwG74c/s320/ficha.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5468914532089494210" /&gt;&lt;/a&gt;&lt;br /&gt;Dentro de poco comienza la acreditación por parte de la CONEAU de la UNPSJB (Universidad Nacional de la Patagonia, San Juan Bosco).&lt;div&gt;Uno de los requisitos es rellenar una ficha en un software llamado "&lt;a href="http://www.coneau.edu.ar/archivos/fd/InstalarFichaDocente.exe"&gt;ficha del docente&lt;/a&gt;". Como soy ayudante de Sistemas Operativos, tengo la obligación de completarla. Al descargarla y probar su ejecución en Wine, el emulador de windows, funcionó muy bien :).&lt;/div&gt;&lt;div&gt;El software pare estar hecho en Delphi con una base de datos propietaria llamada NexusDB, que parece ser un simil SQLite propietario con IDE.&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/20311093-9207887087577309632?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/9207887087577309632/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=9207887087577309632' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9207887087577309632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9207887087577309632'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/05/la-ficha-del-docente-corre-en-wine.html' title='La ficha del docente corre en Wine'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/S-V8ypgqesI/AAAAAAAABBc/pCfHnuwG74c/s72-c/ficha.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5662241682131750270</id><published>2010-04-15T10:30:00.000-07:00</published><updated>2010-04-15T10:35:57.792-07:00</updated><title type='text'>La UNPSJB en el Google Earth :o</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/S8dOLfwTJtI/AAAAAAAAA6U/qmjtbb4SLh4/s1600/uni4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/S8dOLfwTJtI/AAAAAAAAA6U/qmjtbb4SLh4/s320/uni4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5460419032619624146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/S8dOLBJcO_I/AAAAAAAAA6M/sAHTzX3dVSA/s1600/uni3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/S8dOLBJcO_I/AAAAAAAAA6M/sAHTzX3dVSA/s320/uni3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5460419024403577842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/S8dOK-frneI/AAAAAAAAA6E/IWUfLp0Z97c/s1600/uni2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/S8dOK-frneI/AAAAAAAAA6E/IWUfLp0Z97c/s320/uni2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5460419023691554274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/S8dOKj0zWiI/AAAAAAAAA58/K1k9ZUaU9Dw/s1600/uni1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/S8dOKj0zWiI/AAAAAAAAA58/K1k9ZUaU9Dw/s320/uni1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5460419016532384290" /&gt;&lt;/a&gt;&lt;br /&gt;Hoy buscando unas direcciones en el Google Earth, encontré que existía el edificio en 3D de el edificio de "aulas" de la UNPSJB Trelew.&lt;div&gt;Les dejo unas capturas.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5662241682131750270?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5662241682131750270/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5662241682131750270' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5662241682131750270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5662241682131750270'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/04/la-unpsjb-en-el-google-earth-o.html' title='La UNPSJB en el Google Earth :o'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/S8dOLfwTJtI/AAAAAAAAA6U/qmjtbb4SLh4/s72-c/uni4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8964766564524429751</id><published>2010-04-04T10:46:00.000-07:00</published><updated>2010-04-04T10:56:01.432-07:00</updated><title type='text'>Django en el Wizard de PyDev</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/S7jR0Ne0mOI/AAAAAAAAA40/4h61_EmUuUk/s1600/blog1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 259px;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/S7jR0Ne0mOI/AAAAAAAAA40/4h61_EmUuUk/s320/blog1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456341643461695714" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hace poco actualicé PyDev sobre un Eclipse Galielo, creo que es la version 3.5.2. Al iniciar el asistente de proyectos, me encuentro con la grata sorpresa de que Django estaba incluido. Aquí algunas capturas:&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_CICZrYFdH1w/S7jSB3ZG2HI/AAAAAAAAA48/hr7sbfQ8gD4/s1600/blog2.png"&gt;&lt;img src="http://4.bp.blogspot.com/_CICZrYFdH1w/S7jSB3ZG2HI/AAAAAAAAA48/hr7sbfQ8gD4/s320/blog2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456341878050314354" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 145px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Tan solo hizo falta agregar a la configuración de ejecución el parámetro runserver.&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_CICZrYFdH1w/S7jSNTU3rfI/AAAAAAAAA5E/ot699A0F76I/s1600/blog3.png"&gt;&lt;img src="http://3.bp.blogspot.com/_CICZrYFdH1w/S7jSNTU3rfI/AAAAAAAAA5E/ot699A0F76I/s320/blog3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456342074527297010" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 248px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Y al parecer funcionó:&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_CICZrYFdH1w/S7jSZ0AdbjI/AAAAAAAAA5M/hBSjjBx9PSM/s1600/blog4.png"&gt;&lt;img src="http://3.bp.blogspot.com/_CICZrYFdH1w/S7jSZ0AdbjI/AAAAAAAAA5M/hBSjjBx9PSM/s320/blog4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456342289458490930" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 41px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_CICZrYFdH1w/S7jSlgg8BOI/AAAAAAAAA5U/mBs8AjhOCe8/s1600/blog5.png"&gt;&lt;img src="http://1.bp.blogspot.com/_CICZrYFdH1w/S7jSlgg8BOI/AAAAAAAAA5U/mBs8AjhOCe8/s320/blog5.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5456342490384434402" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 158px; " /&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/20311093-8964766564524429751?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8964766564524429751/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8964766564524429751' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8964766564524429751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8964766564524429751'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/04/django-en-el-wizard-de-pydev.html' title='Django en el Wizard de PyDev'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/S7jR0Ne0mOI/AAAAAAAAA40/4h61_EmUuUk/s72-c/blog1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2164707265542632428</id><published>2010-02-04T20:37:00.001-08:00</published><updated>2010-02-04T20:44:47.413-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gpu'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>Python y GPUs??</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://linuxwall32.files.wordpress.com/2009/06/pyqt_portada.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 246px; height: 327px;" src="http://linuxwall32.files.wordpress.com/2009/06/pyqt_portada.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Googleando por comentarios sobre el bidning de Nokia de Qt (PySide), encontré un hilo en StackOverflow. Uno de los post me llamó la anteción y encontré &lt;a href="http://stackoverflow.com/users/204299/arno-pahler"&gt;Arno Pähler&lt;/a&gt; y su sitio &lt;a href="http://www.graviscom.com/"&gt;http://www.graviscom.com/&lt;/a&gt;. Al parecer desarrolla las interfases de alto nivel de un software que trabaja con CUDA/Havok? utilizando &lt;a href="http://www.graviscom.com/images/"&gt;PyQt&lt;/a&gt;. Otra aplicación interesante :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-2164707265542632428?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2164707265542632428/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2164707265542632428' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2164707265542632428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2164707265542632428'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/02/python-y-gpus.html' title='Python y GPUs??'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8251284836017383616</id><published>2010-02-04T20:19:00.000-08:00</published><updated>2010-02-04T20:32:50.700-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt4'/><category scheme='http://www.blogger.com/atom/ns#' term='googlecode'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>Crossplatform TextMate (CrossMates) ahora es Prymatex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/S2ueHxxJo3I/AAAAAAAAAag/4-dZrbMHxfo/s1600-h/Prymatex_Logo.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 96px; height: 96px;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/S2ueHxxJo3I/AAAAAAAAAag/4-dZrbMHxfo/s320/Prymatex_Logo.png" alt="" id="BLOGGER_PHOTO_ID_5434611231808398194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Luego de un año desde el momento donde comenzaba con la idea de implementar &lt;a href="http://code.google.com/p/crossmates/"&gt;TextMate sobre Python/PyQt4&lt;/a&gt;, retomo el proyecto. Esta vez no estoy solo, diegomvh, compañero de tesis y &lt;a href="http://pinguinox.com.ar/"&gt;locurask&lt;/a&gt; me acompañan. Esta vez fue rebautizado: Comenzando con PyMate, se deformó en Prymate, para luego dar lugar  a un X por UniX, con lo que tenemos PryMateX (del cual sale una linda sigla PMX).&lt;br /&gt;El &lt;a href="http://code.google.com/p/prymatex"&gt;proyecto&lt;/a&gt; está hosteado en Google Code en un repositorio Mercurial. Quienes quieran comenzar a probar, pueden hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;hg clone http://code.google.com/hg/prymatex&lt;br /&gt;cd src/prymatex&lt;br /&gt;python main.py&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Necesitan Python 2.6 debido a la &lt;a href="http://docs.python.org/dev/library/plistlib.html"&gt;plistlib&lt;/a&gt; y PyQt 4.5 debido a alguna funcionalidad extra con el manejo de &lt;a href="http://doc.trolltech.com/4.5/qtabwidget.html"&gt;QTabWidgets&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hoy está en un estado alfa, porque aún no se completa la envoltura/wrapping de una librería de expresiones regulares con la cual están definidos los Bundles de TextMate, llamada &lt;a href="http://www.geocities.jp/kosako3/oniguruma/"&gt;Oniguruma&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cualquier voluntario está invitado a participar, posteen comentarios o envien un mail a alguno de los miembros del proyecto!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8251284836017383616?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8251284836017383616/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8251284836017383616' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8251284836017383616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8251284836017383616'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/02/crossplatform-textmate-crossmates-ahora.html' title='Crossplatform TextMate (CrossMates) ahora es Prymatex'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/S2ueHxxJo3I/AAAAAAAAAag/4-dZrbMHxfo/s72-c/Prymatex_Logo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6942974064086299556</id><published>2010-01-05T05:21:00.000-08:00</published><updated>2010-01-05T05:53:21.380-08:00</updated><title type='text'>Plist en Python</title><content type='html'>El formato para guardar archivos de muchas apps de Mac, como iTunes o TextMate es Plist, o Property List. Puede venir como XML o como binario.&lt;br /&gt;&lt;br /&gt;En el proyecto CrossMates, la lecutura y escritura de este tipo de archivos es escencial. Revisando por ahí, como sincoronizar el iPhone en linux, encontré que existe una tal libplist, pero googleando un poco, en Python 2.6, es soporte ya es nativo! Si, si, se llama &lt;a href="http://docs.python.org/dev/library/plistlib.html"&gt;plistlib&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cada día quedan menos excusas para continuar el &lt;a href="http://code.google.com/p/crossmates"&gt;proyecto&lt;/a&gt;, jaja.&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/20311093-6942974064086299556?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6942974064086299556/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6942974064086299556' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6942974064086299556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6942974064086299556'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2010/01/plist-en-python.html' title='Plist en Python'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7587668169843732201</id><published>2009-12-29T14:29:00.000-08:00</published><updated>2010-02-04T20:34:19.150-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pyinstaller'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>Creación de ejecutables de Python</title><content type='html'>&lt;p&gt;&lt;/p&gt;Cree un pequeño tutorial sobre como crear ejecutables con PyInstaller.&lt;div&gt;Está focalizado en PyQt4, pero aplica a lo que quieran generar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;object height="364" width="445"&gt;&lt;param name="movie" value="http://www.youtube.com/v/E4FGR_tSnTo&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/E4FGR_tSnTo&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x234900&amp;amp;color2=0x4e9e00&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Espero que les sea útil :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Disculpen si pasé las pantallas demaciado rápido :S&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7587668169843732201?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7587668169843732201/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7587668169843732201' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7587668169843732201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7587668169843732201'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/12/creacion-de-ejecutables-de-python.html' title='Creación de ejecutables de Python'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6282919466281096727</id><published>2009-12-16T07:04:00.000-08:00</published><updated>2009-12-16T07:10:23.008-08:00</updated><title type='text'>Protopy: Liberada la tesis, y recibidos!!!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/Syj3VhyEIYI/AAAAAAAAAZg/6BMoKF9hXuE/s1600-h/protopy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 303px; height: 320px;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/Syj3VhyEIYI/AAAAAAAAAZg/6BMoKF9hXuE/s320/protopy.png" alt="" id="BLOGGER_PHOTO_ID_5415850501130690946" border="0" /&gt;&lt;/a&gt;Finalmente terminamos la tesis de Aplicaciones Web Desconetadas. Trabajamos sobre Django, Gears y Firefox y logramos desconectar las aplicaciones con poca reescritura de código :)&lt;br /&gt;&lt;br /&gt;En breve mandaremos a Ajaxian, los blogs de Django y a la lista de Python argentina, a ver si alguien se prende :)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://code.google.com/p/protopy"&gt;&lt;span style="font-size:180%;"&gt;http://code.google.com/p/protopy&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://protopy.com.ar"&gt;&lt;span style="font-size:180%;"&gt;http://protopy.com.ar&lt;/span&gt;&lt;/a&gt; (gracias &lt;a href="http://pinguinox.com.ar"&gt;Org&lt;/a&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/20311093-6282919466281096727?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6282919466281096727/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6282919466281096727' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6282919466281096727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6282919466281096727'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/12/protopy-liberada-la-tesis-y-recibidos.html' title='Protopy: Liberada la tesis, y recibidos!!!'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/Syj3VhyEIYI/AAAAAAAAAZg/6BMoKF9hXuE/s72-c/protopy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4924043748981417728</id><published>2009-12-16T06:36:00.000-08:00</published><updated>2010-02-04T20:46:12.795-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='twisted'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Twisted, una pequeña introducción</title><content type='html'>&lt;p&gt;Esta es una paqueña introducción a &lt;a href="http://twistedmatrix.com/trac/"&gt;Twisted&lt;/a&gt;. Un framework de redes en Python, orientado a eventos.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twisted.internet&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;reactor&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twisted.internet&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twisted.python&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MiProtocolo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connectionMade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Conexion establecida con"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dataReceived&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Me dijiste: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connectionLost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Conexion Cerrada &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientFactory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MiProtocolo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startLogging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setStdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;reactor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listenTCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyFactory&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;reactor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Para probar esto podemos crear un socket con netcat, la navaja suzia de las redes:&lt;/p&gt;&lt;p&gt;nc localhost 8080&lt;/p&gt;&lt;p&gt;y al escribir algunos caracteres y presionar Control-D veremos como trabaja esto de lo orientado a eventos :)&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/20311093-4924043748981417728?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4924043748981417728/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4924043748981417728' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4924043748981417728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4924043748981417728'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/12/probando-el-resaltado-usrbinenv-python.html' title='Twisted, una pequeña introducción'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8029478016180451910</id><published>2009-12-13T10:12:00.000-08:00</published><updated>2010-02-04T20:46:53.154-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rst2pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='tesis'/><title type='text'>LaTeX y lenguajes intermedios</title><content type='html'>El martes que viene (15 de diciembre) presentamos la tesis. Se trata de una extensión de Django para desconectar aplicaciones, aprovechando Gears y Firefox. El proyecto lleva ya más de 1000 commits, y tiene varios componentes:&lt;div&gt; - offline, una aplicación genérica autocontenida que sirve para desconectar&lt;/div&gt;&lt;div&gt; - Doff, una implementación de Django sobre una libería propia, llamda Protopy&lt;/div&gt;&lt;div&gt; - Protopy, una librería de JavaScript (1.7) que provee un sistema de módulos Pythonicos en JS, orientación a objetos Pythonica, DOM, Eventos y varios buitlins (similares a la API de Python).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pasen y vean: &lt;a href="http://code.google.com/p/protopy"&gt;http://code.google.com/p/protopy&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero, más allá de un proyecto para la comunidad, es una tesis. Así que necesitamos hacer un documento. Comenzamos usando LaTeX, puro y duro, como suele decir &lt;a href="https://lidi.info.unlp.edu.ar/%7Efernando/"&gt;uno de los profes&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Luego decantamos en &lt;a href="http://sphinx.pocoo.org/"&gt;Sphinx&lt;/a&gt;, que nos dio bastantes buenos resultados, aunque hubo que realizar varios &lt;a href="http://code.google.com/p/protopy/source/browse/docs/hacks.py"&gt;hacks&lt;/a&gt;. Tuvimos que hacer varios arreglos de bajo nivel, la impresión que nos llevamos es queno existe aún un mecanismo simple de generación de documentos de tesis, lo que se puede traducir en que somos vagos para aprender latex... o que nos falta googlear más :S&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un proyecto que promete mucho es &lt;a href="http://code.google.com/p/rst2pdf/"&gt;rst2pdf&lt;/a&gt;, de &lt;a href="http://lateral.netmanagers.com.ar/"&gt;Roberto Alsina&lt;/a&gt;, un argentino desarrollador de KDE :). Quizás hubiese servido para generar la doc, sospecho que &lt;a href="http://pfactorial.wordpress.com/"&gt;Lau&lt;/a&gt; lo puede estar usando.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora estoy encarando las presentación del martes con &lt;a href="http://www.informatik.uni-freiburg.de/%7Efrank/ENG/latex-course/latex-course-3/latex-course-3_en.html"&gt;Beamer&lt;/a&gt;. Veremos que sale :)&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/20311093-8029478016180451910?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8029478016180451910/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8029478016180451910' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8029478016180451910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8029478016180451910'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/12/latex-y-lenguajes-intermedios.html' title='LaTeX y lenguajes intermedios'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-202021291516226386</id><published>2009-12-07T06:30:00.000-08:00</published><updated>2009-12-07T06:32:58.416-08:00</updated><title type='text'>Palmó la batería</title><content type='html'>&lt;span style="font-family: courier new;"&gt;&lt;span style="font-family: georgia;"&gt;Ya lleva un año y 7 meses la pobre y quedó agotada.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;Una lástima.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;defo:~$ cat /proc/acpi/battery/BAT0/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;alarm:                   unsupported&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;present:                 yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;design capacity:         5200 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;last full capacity:      1576 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;battery technology:      rechargeable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;design voltage:          11100 mV&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;design capacity warning: 520 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;design capacity low:     157 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;capacity granularity 1:  52 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;capacity granularity 2:  52 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;model number:            DELL RN8878&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;serial number:           37502&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;battery type:            LION&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;OEM info:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;present:                 yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;capacity state:          ok&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;charging state:          charged&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;present rate:            1 mA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;remaining capacity:      509 mAh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;present voltage:         11852 mV&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-family: georgia;"&gt;1576mAh = &lt;/span&gt;&lt;span style="font-family: georgia;"&gt;&lt;/span&gt;&lt;/span&gt;30% de la capacidad inicial :'(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-202021291516226386?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/202021291516226386/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=202021291516226386' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/202021291516226386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/202021291516226386'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/12/palmo-la-bateria.html' title='Palmó la batería'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7866450811355091201</id><published>2009-12-05T06:48:00.000-08:00</published><updated>2010-02-04T20:33:29.482-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='servicio'/><category scheme='http://www.blogger.com/atom/ns#' term='bitbucket'/><category scheme='http://www.blogger.com/atom/ns#' term='googlecode'/><title type='text'>Utilizando el servicio de Mercurial de Google</title><content type='html'>Hace mucho que no blogueaba, lo se... pero bueno, hoy es sábado por la mañana, vamos a ver que sale...&lt;br /&gt;&lt;br /&gt;Finalmente migré de BitBucket mis repositorios por la limitación de espacio. BitBucket ofrece 150MB para los usuarios gratuitos mientras que Google Code ofrece 1GB.&lt;br /&gt;&lt;br /&gt;Los proyectos que migré fueron el editor de texto aplazado aún (&lt;a href="http://code.google.com/p/restscada/"&gt;CrossMates&lt;/a&gt;), el proyecto de investigación sobre la red de microcontroladores e Internet (&lt;a href="http://code.google.com/p/restscada"&gt;RestScada&lt;/a&gt;)y la tesis (&lt;a href="http://code.google.com/p/protopy/"&gt;Protopy&lt;/a&gt;), ya falta poquito para la entrega! SIiii! :)&lt;br /&gt;&lt;br /&gt;Todavía quedan algunos proyectos en el BitBucket, como los &lt;a href="http://bitbucket.org/D3f0/unp-str-tp1/"&gt;trabajos prácticos&lt;/a&gt; del curso de postgrado de Tiempo Real.&lt;br /&gt;&lt;br /&gt;Google Code nos permite no solo usar mercurial con una cuota enorme, sino que nos deja manejar la Wiki como un repo. Eso es bastante interesante, lo que anda haciendo falta es algo para previsualizar offline como va quedando la wiki. El markup que usan no es muy complejo, quizás se podría constituir un &lt;span style="font-style: italic;"&gt;plugin&lt;/span&gt; para el editor de texto.&lt;br /&gt;&lt;br /&gt;Me gustó mucho el servicio, cortito y al pie.&lt;br /&gt;&lt;br /&gt;Bitbucket está hecho en Django y usa Pistón para realizar las APIs. El proyecto está interesante, pero el tema de la capacidad me estaba trayendo problemas, por más que parezca basura, nunca es buena deshacerse de la historia de tu repo, por lo menos sirve para la nostalgia y ver como evolucionan las cosas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7866450811355091201?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7866450811355091201/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7866450811355091201' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7866450811355091201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7866450811355091201'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/12/utilizando-el-servicio-de-mercurial-de.html' title='Utilizando el servicio de Mercurial de Google'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4744200835709774402</id><published>2009-06-03T13:12:00.000-07:00</published><updated>2009-06-03T13:23:25.523-07:00</updated><title type='text'>google code anuncia soporte para hg</title><content type='html'>En el sitio oficial de mercurial acabo de leer que en google code están comenzando a probar el soporte para hg. Todavía no está disponible para el público general, pero lo estará en breve :)&lt;br/&gt;Actualmente utilizo bitbucket, que tiene una inyerfase web bastante bonita, pero el conjunto de repositorios de un usuario no puede superar los 150MB. No se si abandone bitbucket, pero está sedición de google sin duda contribuira a la popularidad de mi sistema de versiones preferido :)&lt;div class="iblogger-footer"&gt;&lt;br clear="all"/&gt;&lt;p style="text-align:right;font-size:10px;"&gt;[Posted with &lt;a href="http://illuminex.com/iBlogger/index.html"&gt;iBlogger&lt;/a&gt; from my iPhone]&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4744200835709774402?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4744200835709774402/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4744200835709774402' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4744200835709774402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4744200835709774402'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/06/google-code-anuncia-soporte-para-hg.html' title='google code anuncia soporte para hg'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-747347556845120987</id><published>2009-05-25T12:35:00.000-07:00</published><updated>2009-05-25T12:50:55.651-07:00</updated><title type='text'>Recuperar iphone cuando se rompe iTunes</title><content type='html'>Gracias a la aplicación ifuse pude montar el iphone a través del cable USB, y ver las carpetas "importantes" de mi usuario (mobile). La existencia del directorio iTunes_control me hizo sospechar de que se podría llegar a sincronizar el aparato a través de libgpod en linux. GtkPod pareció detectarlo, pero... rompio todo. Al punto que itunes (vía vmware) solo ofrecía reparar el teléfono reinstalando el SO. Aclato que en el teléfono lo único que no funcionaba era la aplicación de iPod. Googleando un poco vi que había alternarivas de sincronización en winblow$, así que me di a la tarea de ver si alguna reconstruia la db. Con la vetsión gratuita de media monkey se solucionó el problema. Agregué algunos temas el incluso me asistió en la recuperación de tapitas. Espero que amarok2 pronto pueda tener la funcionalidad que tenía con mi iPod nano. Por lo demás estoy conforme con el teléfono, ahora que soy iTunes independiente :)&lt;div class="iblogger-footer"&gt;&lt;br clear="all"/&gt;&lt;p style="text-align:right;font-size:10px;"&gt;[Posted with &lt;a href="http://illuminex.com/iBlogger/index.html"&gt;iBlogger&lt;/a&gt; from my iPhone]&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-747347556845120987?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/747347556845120987/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=747347556845120987' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/747347556845120987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/747347556845120987'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/05/recuperar-iphone-cuando-se-rompe-itunes.html' title='Recuperar iphone cuando se rompe iTunes'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-514153277959961965</id><published>2009-05-21T11:27:00.000-07:00</published><updated>2009-05-21T11:47:15.522-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fs'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='celular'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iPhone</title><content type='html'>Luego de haberme bicicleteado bastante en movistar y habiendo recorrido varias de las casas de celulares de mi pueblo natal (forzado a cambiar por AMX), felizmente soy poseedor de un hermoso iphone blanco, donde llevó el correo, los feeds, agenda y desde el cual estoy escribiendo esta entrada.&lt;br/&gt;Luego del jailbreak pude instalar nuevas apps, entre las cuales se encuentra una terminal y un servidor de ssh.&lt;br/&gt;Quizás lo que mas llama la atención, cuando uno comienza a urgar por sftp, es la forma en la que se ha dispuesto el filesystem. Recuerdo un post donde Linus bardeaba la gerarquia estandard del FS de MacOS, creo que ahora entiendo por que. Aunque a pesar de todo parece que apple decidió almacenar todo en archivos propety list (xml) y en bases sqlite (mensajes de texto, agenda, libreta de contactos, etc), de manera de que habría forma de sincronizar el teléfono con mi SO predilecto. &lt;br/&gt;Algo que aún queda por explorar es el tema del desarrollo para el aparato, donde quizás mi principal obstáculo es mi desconocimiento de ObjectiveC.&lt;div class="iblogger-footer"&gt;&lt;br clear="all"/&gt;&lt;p style="text-align:right;font-size:10px;"&gt;[Posted with &lt;a href="http://illuminex.com/iBlogger/index.html"&gt;iBlogger&lt;/a&gt; from my iPhone]&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-514153277959961965?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/514153277959961965/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=514153277959961965' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/514153277959961965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/514153277959961965'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/05/iphone.html' title='iPhone'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3889882499009684319</id><published>2009-02-28T11:32:00.000-08:00</published><updated>2009-02-28T11:32:00.225-08:00</updated><title type='text'>CSS orientado a Objetos</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Una muy buena presentación que vi en Ajaxian.&lt;br/&gt;En &lt;a href='http://developer.yahoo.com/yui/'&gt;YUI&lt;/a&gt; muchos de los conceptos que se ven en estra presentación se aplican.&lt;br/&gt;Es bueno tener estos conceptos presentes a la hora de crear CSS.&lt;br/&gt;&lt;div id='__ss_990405' style='width: 425px; text-align: left;'&gt;&lt;a title='Object Oriented CSS' href='http://www.slideshare.net/stubbornella/object-oriented-css?type=presentation' style='margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;'&gt;Object Oriented CSS&lt;/a&gt;&lt;div class='youtube-video'&gt;&lt;object width='425' height='355' style='margin: 0px;'&gt;&lt;param value='http://static.slideshare.net/swf/ssplayer2.swf?doc=oocss-1233786987806904-3&amp;amp;stripped_title=object-oriented-css' name='movie'&gt; &lt;/param&gt;&lt;param value='true' name='allowFullScreen'&gt; &lt;/param&gt;&lt;param value='always' name='allowScriptAccess'&gt; &lt;/param&gt;&lt;embed width='425' height='355' allowfullscreen='true' allowscriptaccess='always' type='application/x-shockwave-flash' src='http://static.slideshare.net/swf/ssplayer2.swf?doc=oocss-1233786987806904-3&amp;amp;stripped_title=object-oriented-css'&gt; &lt;/embed&gt;  &lt;/object&gt;&lt;/div&gt;&lt;div style='font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;'&gt;View more &lt;a href='http://www.slideshare.net/' style='text-decoration: underline;'&gt;presentations&lt;/a&gt; from &lt;a href='http://www.slideshare.net/stubbornella' style='text-decoration: underline;'&gt;Nicole Sullivan&lt;/a&gt;. (tags: &lt;a href='http://slideshare.net/tag/modules' style='text-decoration: underline;'&gt;modules&lt;/a&gt; &lt;a href='http://slideshare.net/tag/blocks' style='text-decoration: underline;'&gt;blocks&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;img border='0' width='0' height='0' src='http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU4NDkwMjg2OTkmcHQ9MTIzNTg*OTMyNDcyMCZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPTM5ODIxOGU5Y2I3YzQ*MmY5MzRiOTZkYzEzNTNmYmQw.gif' style='visibility: hidden; width: 0px; height: 0px;'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=9f4f11ce-9a15-4dfc-8ede-bfdd44b0cafc' class='zemanta-pixie-img'/&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/20311093-3889882499009684319?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3889882499009684319/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3889882499009684319' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3889882499009684319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3889882499009684319'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/02/css-orientado-objetos.html' title='CSS orientado a Objetos'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-9179988243701892243</id><published>2009-02-26T19:09:00.000-08:00</published><updated>2009-02-26T19:09:00.418-08:00</updated><title type='text'>Una materia menos y LaTeX</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Ayer rendí la anteúltima materia de mi carrera y aprobé :) La materia me gusta muy poco (algebra lineal) pero, saqué algo positivo: La profe que nos dió clase de consulta estaba interesada en aprender &lt;a href='http://texlipse.sourceforge.net/'&gt;LaTeX&lt;/a&gt; (y yo también), así que aprendimos &lt;a href='http://texlipse.sourceforge.net/'&gt;LaTeX&lt;/a&gt;. Algo sabía al respecto, que era un lenguaje para hacer PDFs hermosos, que tenía un buen soporte para fórmulas matemáticas y también podía producir presentaciones muy buenas con &lt;a href='http://amath.colorado.edu/documentation/LaTeX/prosper/'&gt;prosper&lt;/a&gt; o &lt;a href='http://es.wikipedia.org/wiki/Beamer'&gt;beamer&lt;/a&gt; (que conocí gracias a &lt;a href='http://santiagomarquezd.googlepages.com/'&gt;Santiago&lt;/a&gt;).&lt;br/&gt;En #latex de &lt;a href='http://es.wikipedia.org/wiki/Freenode'&gt;irc.freenode.net&lt;/a&gt; me recomendaron &lt;a href='http://texlipse.sourceforge.net/'&gt;texclipse&lt;/a&gt;, un plugin para mi IDE acutal, Eclipse. Pero muchos editores de latex dando vueltas (vi, emacs, lyx, kile, etc.)&lt;br/&gt;&lt;a href='http://texlipse.sourceforge.net/'&gt;LaTeX&lt;/a&gt; es un leguaje de marcas, en realidad, un conjunto de macros para un lenguaje de bajo nivel, llamado TeX.&lt;br/&gt;Así como distros de linux, existen varias vairadades de &lt;a href='http://texlipse.sourceforge.net/'&gt;LaTeX&lt;/a&gt;. &lt;a href='http://www.tug.org/tetex/'&gt;Tetex&lt;/a&gt; es una no mantenida, &lt;a href='http://miktex.org/'&gt;MikTex&lt;/a&gt; una rama para windows, &lt;a href='http://www.tug.org/mactex/'&gt;MacTex&lt;/a&gt; para Mac, y en GNU tenemos &lt;a href='http://www.tug.org/texlive/'&gt;LiveTex&lt;/a&gt;, que es multiplataforma.&lt;br/&gt;Estoy tratando de hacer correr LiveTex sobre la máquina virtual donde tengo instalado winblows, pero ya van 1.2GB!&lt;br/&gt;&lt;br/&gt;Pero refelxionando un poco, la funcionalidad que da TeXclipse es básicamente esto:&lt;br/&gt;&lt;blockquote&gt;while inotifywait -r -e modify mi_archivo.tex; do&lt;br/&gt;    pdflatex mi_archivo.tex mi_archivo.pdf&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=445bbf52-e268-49f3-966d-1225a024be1f' class='zemanta-pixie-img'/&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/20311093-9179988243701892243?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/9179988243701892243/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=9179988243701892243' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9179988243701892243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9179988243701892243'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/02/una-materia-menos-y-latex.html' title='Una materia menos y LaTeX'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5217573936007147978</id><published>2009-02-19T10:10:00.000-08:00</published><updated>2009-02-19T10:10:00.136-08:00</updated><title type='text'>Desarmando una MacBook Pro</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;En ifixit.com desarman una MacBook Pró, con un buen detalle de imágenes. Un detalle que no conocía, es que la batería no se puede &lt;a href='http://www.ifixit.com/Guide/First-Look/MacBook-Pro-17-Inch-Unibody/618/1#s3248'&gt;reemplazar facilmente como en una laptop PC&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=a9dc7808-ca03-49b6-aa07-007c0aa9a806' class='zemanta-pixie-img'/&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/20311093-5217573936007147978?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5217573936007147978/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5217573936007147978' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5217573936007147978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5217573936007147978'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/02/desarmando-una-macbook-pro.html' title='Desarmando una MacBook Pro'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3277487897134509306</id><published>2009-02-09T21:16:00.000-08:00</published><updated>2009-02-09T21:16:00.684-08:00</updated><title type='text'>A shell to rule them all</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img src='http://zsh.dotsrc.org/Images/wizard.gif' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;&lt;br/&gt;Bash es una herramienta muy poderosa y el autocompletado que incluye en Ubuntu (creo desde 7.04) lo hace aún más fácil de aprender. Sin embargo, cuando comencé el proceso "pimp my bash", empecé a notar que la performance comienza a disminuir, algo que se vuelve notorio al arranque.&lt;br/&gt;Muchas aplicaciones degradan su rendimiento con el toqueteo, es algo casi natural, pero muchas veces imperceptible o tolerable... pero en una herramienta tan fundamental para un usuario Linux, no va. Esperar 0.5 a 1 segundo por un shell en un procesador Core 2 Duo no va. Por lo menos para mi no.&lt;img src='http://www.tcsh.org/oystercatcher.gif' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;'/&gt;&lt;br/&gt;Así que decidí dar un paseo por los otros shells. Probé ksh, csh y no no me convencieron. Tan solo ver que un golpe de tabulador desplaza ocho espacios a la derecha me dio mucha tristesa, aunque la velocidad de spawneo (perdonen el spanglish) era muy buena. Pocas horas más tarde, &lt;a href='http://www.tcsh.org/Home'&gt;tcsh&lt;/a&gt; mejoró el panorama (si mal no recuerdo viene de BSD). &lt;br/&gt;Finalmente di con zsh, que pregonaba un poderoso sistema de compleción (o se dice completado?).&lt;br/&gt;Tras instalarlo, la compleción no estaba disponible pero entre &lt;a href='http://delicious.com/D3f0/zsh'&gt;la doc de gentoo y la wiki de arch&lt;/a&gt;, logré configurarlo. Velocidad de spawn muy buena, configuración bastante etendible, compatible con sh y hasta ahora con todos los scripts de bash que he probado... y con un autocompletado para sacarse el sombrero:&lt;br/&gt;En vez de ir alternando entre las posibles opciones, las lista en las lineas inferiores al prompt, de manera de tener un pantallazo general de las opciones, pero no conforme con esto, muchos comandos tienen ayuda detallada:&lt;br/&gt;&lt;img src='http://lh6.ggpht.com/_CICZrYFdH1w/SZEJXYarVBI/AAAAAAAAAWo/MmgPEomr8go/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Una sintaxis de for simplificada, no neceista do accion1; accion2; done:&lt;br/&gt;&lt;font face='monospace'&gt;for x in *; echo $x&lt;/font&gt; en vez de&lt;font face='monospace'&gt; for x in *; do echo $x; done&lt;/font&gt;&lt;br/&gt;Editor de historial mejorado cuando tipeamos comandos multilinea, corrige comandos cuando le pifeamos al orden de los caracteres, las instancias de zsh pueden colaborar un historial global y buscar en cada terminal (cosa que no pasaba en bash y realmente nunca comprendí muy bien cual era su filosofía con respecto a varias sesiones y un solo history) entre otras features que pueden leer en su &lt;a href='http://www.faqs.org/faqs/unix-faq/shell/zsh/'&gt;FAQ&lt;/a&gt;.&lt;br/&gt;Lo que les puedo recomendar es que lo prueben ustedes mismos.&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=27c5771d-b8eb-4583-9610-790628d16b25' class='zemanta-pixie-img'/&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/20311093-3277487897134509306?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3277487897134509306/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3277487897134509306' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3277487897134509306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3277487897134509306'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/02/shell-to-rule-them-all.html' title='A shell to rule them all'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_CICZrYFdH1w/SZEJXYarVBI/AAAAAAAAAWo/MmgPEomr8go/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6960898134916711650</id><published>2009-02-07T11:04:00.001-08:00</published><updated>2009-02-07T11:04:13.816-08:00</updated><title type='text'>Editor compatible con TextMate</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hace un mes comencé a crear un editor de texto (no una IDE) con PyQt4.&lt;br/&gt;¿Por qué? &lt;br/&gt;&lt;ul&gt;&lt;li&gt;Me di cuenta que la parte jugosa de TextMate es Open Source, es decir, todo el conjunto de bundles que provee (sintaxis, snippets, comandos, templates, etc.) están en un repositorio &lt;a href='http://macromates.com/svn/Bundles/trunk/'&gt;SVN&lt;/a&gt; bajo licencia GPL.&lt;/li&gt;&lt;li&gt;Kate es genial, pero no es fácil de extender. Sobre todo cuando tu cerebro se olvida de los vericuetos de C++.&lt;/li&gt;&lt;li&gt;El concepto de proyecto de TextMate es muy bueno.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;TextMate adolece de una consola integrada.&lt;/li&gt;&lt;li&gt;Falta un textmate para linux, más allá de los numerosos posts en varios blogs sobre pimp my gedit.&lt;/li&gt;&lt;/ul&gt;Los bundles de TextMate están hechos mayoritariamente en Ruby, aunque los hay en Perl, php y Python.&lt;br/&gt;Todos estos bundles están guradados en un dialecto de XML llamado Property List (plist) y se ve más o menos así:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;&amp;lt;!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&amp;gt;&lt;br/&gt;&amp;lt;plist version="1.0"&amp;gt;&lt;br/&gt;&amp;lt;dict&amp;gt;&lt;br/&gt;        &amp;lt;key&amp;gt;content&amp;lt;/key&amp;gt;&lt;br/&gt;        &amp;lt;string&amp;gt;|yesno:"${1:arg}"&amp;lt;/string&amp;gt;&lt;br/&gt;        &amp;lt;key&amp;gt;keyEquivalent&amp;lt;/key&amp;gt;&lt;br/&gt;        &amp;lt;string&amp;gt;@|&amp;lt;/string&amp;gt;&lt;br/&gt;        &amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&lt;br/&gt;        &amp;lt;string&amp;gt;yesno&amp;lt;/string&amp;gt;&lt;br/&gt;        &amp;lt;key&amp;gt;scope&amp;lt;/key&amp;gt;&lt;br/&gt;        &amp;lt;string&amp;gt;text.html.django&amp;lt;/string&amp;gt;&lt;br/&gt;        &amp;lt;key&amp;gt;uuid&amp;lt;/key&amp;gt;&lt;br/&gt;        &amp;lt;string&amp;gt;20F0FE5C-BF8C-4258-8F93-3D6F62447068&amp;lt;/string&amp;gt;&lt;br/&gt;&amp;lt;/dict&amp;gt;&lt;br/&gt;&amp;lt;/plist&lt;br/&gt;&lt;/blockquote&gt;Que parecido a una serialización de un diccionario en XML, no? Ya hay &lt;a href='http://www.shearersoftware.com/software/developers/plist/'&gt;módulos&lt;/a&gt; &lt;a href='http://odz.sakura.ne.jp/toys/wiki/python-plist'&gt;para decodificar plist&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;La API entre el editor y estos scripts es muy similar a un CGI, lo cual me pareció genial. Para quien le interese, lo mejor es ver los screencasts en la &lt;a href='http://macromates.com/screencasts'&gt;pagina del creador de TextMate&lt;/a&gt;. Son varias vueltas de tuerca sobre la tradicional llamada a comandos desde un editor (como a Make, o correr un script sobre bash, etc.).&lt;br/&gt;&lt;br/&gt;Comencé utilizando el componente QSciScinitilla, pero la creación de sintaxis se hace en un dialecto que desconozco.&lt;br/&gt;Así que decidí usar el editor de texto nativo de PyQt4, con su subrayador de sintaxis.&lt;br/&gt;&lt;br/&gt;Lamentablemente por otros proyectos he tenido que dejar el desarollo temporalmente, pero acá van unos screen-shots, de una alfa muy alfa:&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh4.ggpht.com/_CICZrYFdH1w/SY3YE7IzqAI/AAAAAAAAAWk/e09F5R04kKo/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh5.ggpht.com/_CICZrYFdH1w/SY3X57NwZwI/AAAAAAAAAWg/nhXE9W6J4F0/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh6.ggpht.com/_CICZrYFdH1w/SY3XxjmCfTI/AAAAAAAAAWc/YDcf3wrdvmE/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&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/20311093-6960898134916711650?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6960898134916711650/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6960898134916711650' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6960898134916711650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6960898134916711650'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/02/editor-compatible-con-textmate.html' title='Editor compatible con TextMate'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_CICZrYFdH1w/SY3YE7IzqAI/AAAAAAAAAWk/e09F5R04kKo/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8839777925494395510</id><published>2009-02-07T10:42:00.000-08:00</published><updated>2009-02-07T10:42:00.656-08:00</updated><title type='text'>Regex</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hace unos días le explicaba a un amigo sobre &lt;a href='http://en.wikipedia.org/wiki/Regex'&gt;regex&lt;/a&gt;. En los días posteriores me puse a pensar que las expresiones regulares fueron algo que no comprendí o utilizé cabalmente hasta que llegué a Python, además de poder meter comentarios.&lt;br/&gt;Creo que los grupos nombrados, que proximamente estarán en la implementación de referencia (PRCE) fueron la kiler feature.&lt;br/&gt;Hoy estaba limpiando unos TODOs de una aplicación que integra SqlAlchemy, PyQt y Twisted (todavía no es una WIP pero va tomando forma) y encontré la siguiente linea:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;(?P&amp;lt;type&amp;gt;\w*)://&lt;br/&gt;(?P&amp;lt;user&amp;gt;[\w]+):&lt;br/&gt;(?P&amp;lt;pass&amp;gt;[\w\d]+)@&lt;br/&gt;(?P&amp;lt;host&amp;gt;[\w]*):&lt;br/&gt;(?P&amp;lt;port&amp;gt;[\w]+)\/&lt;br/&gt;(?P&amp;lt;db&amp;gt;[\w]+)&lt;br/&gt;&lt;/blockquote&gt;Que básicamente paresea cosas TIPO_DB://USER:PASS@HOST/BASE&lt;br/&gt;Que se convirtió en esta, mejorada:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;(?P&amp;lt;type&amp;gt;\w{2,15})://    # Tipo de la base de datos&lt;br/&gt;&lt;br /&gt;(?:&lt;br/&gt;&lt;br /&gt;   (?:&lt;br/&gt;&lt;br /&gt;       (?P&amp;lt;user&amp;gt;[\w\d]{1,50})&lt;br/&gt;&lt;br /&gt;       (?::(?P&amp;lt;pass&amp;gt;[\w\d]{1,50}))?&lt;br/&gt;&lt;br /&gt;       @&lt;br/&gt;&lt;br /&gt;   )?&lt;br/&gt;&lt;br /&gt;   (?P&amp;lt;host&amp;gt;[\w]*)&lt;br/&gt;&lt;br /&gt;   (?::(?P&amp;lt;port&amp;gt;[\d]{3,5}))?&lt;br/&gt;&lt;br /&gt;)?\/   # Puso user:pass@host&lt;br/&gt;&lt;br /&gt;(?P&amp;lt;db&amp;gt;[\w]+) # Nombre de la base, siempre es obligatorio&lt;br/&gt;&lt;br /&gt;(?:\?(?P&amp;lt;params&amp;gt;[\w]*(?:\=[\w\d]+)))? # Parametros extra &lt;br/&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Si bien todavía le falta un poco, creo que quedó modificable e incluso se puede modificar más.&lt;br/&gt;Intenté codificar lo mismo en ruby y php, pero no es trivial lograr la misma funcionalidad.&lt;br/&gt;Que bueno es haber encontrado Python, lo único que lamento es no haberlo descubrido antes :)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Nota: Todo fue debugueado con Kodos, que es otra killer app, que en algún momento pienso pasar a PyQt4, ya que su layuot no es muy widescreen friendly.&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/20311093-8839777925494395510?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8839777925494395510/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8839777925494395510' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8839777925494395510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8839777925494395510'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2009/02/regex.html' title='Regex'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-67224035870732761</id><published>2008-12-18T23:17:00.000-08:00</published><updated>2008-12-18T23:18:23.747-08:00</updated><title type='text'>Wine + Hg = Freeze Time</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img height='140' width='84' src='http://albertjh.cymaho.com/wp-content/uploads/2008/06/logo-wine.png' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;Ultimamente me vi en la necesidad de convertir archivos de Autocad (DWG/DWF) a raster/bitmap.&lt;br/&gt;El problema es que las aplicaciones son para window$ y casi siempre trials, con tiempo de expiración.&lt;br/&gt;Para saltarme esta limitación de tiempo se me ocurrió utillizar el sistema de versiones que suelo usar para los proyectos de software, Mercurial. La idea era &lt;i&gt;freezar&lt;/i&gt; el conjunto de directorios que genera wine y cada vez que se agota el tiempo, volver a una versión anterior de este conjunto de directorios.&lt;br/&gt;Primero, instalo la aplicación en un "prefix" de wine, que es como una botella, o un contenedor de una "instalación asilada" de Window$. Para esto:&lt;br/&gt;&lt;blockquote&gt;$ WINEPREFIX=~/.wine_freezado_1 wine setup.exe&lt;br/&gt;&lt;/blockquote&gt;o&lt;blockquote&gt;$ WINEPREFIX=~/.wine_freezado_1 wine msiexec /i setup.msi&lt;/blockquote&gt;Inmediatamente después generamos un repositorio en el directorio, añadiamos todos los archivos y generamos un commit.&lt;br/&gt;&lt;blockquote&gt;$ cd ~/.wine_freezado_1; hg init; hg add; hg ci -m "Estado inicial"&lt;br/&gt;&lt;br/&gt;&lt;/blockquote&gt;Y listo, una vez que se vence el tiempo, simplemente, hg revert --all.&lt;br/&gt;Quizás por comodidad sea interesante generar un nuevo commit después de haber dejado la aplicación preseteada.&lt;br/&gt;&lt;br/&gt;&lt;img height='228' width='284' src='http://s3.gadgetreview.com.s3.amazonaws.com/app_duros_frozen.jpg' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/&gt;Algo interesante de ver es que es lo que la aplicación modifica para tener conciencia del tiempo. Generalmente es el registro, y si la cuestión es bastante tonta, hasta podemos hacer nuestro propio "crack".&lt;br/&gt;&lt;br/&gt;Lamentablemente no todas las aplicaciones funcionan bien con wine. Pero como en general hay bastante redundancia con el soft, que siempre algo se encuentra.&lt;br/&gt;&lt;br/&gt;Espero que les sirva.&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/20311093-67224035870732761?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/67224035870732761/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=67224035870732761' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/67224035870732761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/67224035870732761'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/12/wine-hg-freeze-time.html' title='Wine + Hg = Freeze Time'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6364854228617054200</id><published>2008-11-27T22:01:00.001-08:00</published><updated>2008-11-27T22:01:43.126-08:00</updated><title type='text'>Perfil gráfico de arranque</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Encontré una aplicación llamada &lt;a href='http://www.bootchart.org/'&gt;Bootchart&lt;/a&gt; que produce un detalle sobre el arranque del sistema, generando una gráfica de uso de CPU y carga de I/O. Podemos ver gráficamente que es lo que más demora, como si se tratase de &lt;a href='http://developer.yahoo.com/yslow/'&gt;YSlow&lt;/a&gt; en &lt;a href='http://www.getfirebug.com'&gt;Firebug&lt;/a&gt;.&lt;br/&gt;&lt;img src='http://lh4.ggpht.com/_CICZrYFdH1w/SS-I11M958I/AAAAAAAAAUg/jB5YcuLtLpw/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&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/20311093-6364854228617054200?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6364854228617054200/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6364854228617054200' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6364854228617054200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6364854228617054200'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/11/perfil-grfico-de-arranque.html' title='Perfil gráfico de arranque'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_CICZrYFdH1w/SS-I11M958I/AAAAAAAAAUg/jB5YcuLtLpw/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4601784620541964224</id><published>2008-11-10T22:10:00.001-08:00</published><updated>2008-11-10T22:10:17.775-08:00</updated><title type='text'>Depurando in situ: pdb + ipython =&gt; ipdb</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Muchas veces nos encontramos con situaciones que requieren de una depuración paso a paso, sobre todo cuando tenemos una lógica un poco intrincada. Ipdb (easy_install ipdb) es básicamente pdb (python debugger) con las características de ipython.&lt;br/&gt;En nuestro script (por ejemplo, una vista de django):&lt;br/&gt;&lt;blockquote&gt;import ipdb&lt;br/&gt;&lt;br /&gt;ipdb.set_trace()&lt;br/&gt;&lt;/blockquote&gt;...y mágicamente nuestro script se detendrá en esa posición del código:&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh3.ggpht.com/_CICZrYFdH1w/SRkhY5VCN-I/AAAAAAAAAUE/wKGu0N4ueB8/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;Los atajos de ipdb sob los mismo de pdb:&lt;br/&gt;&lt;br/&gt;&lt;blockquote&gt;l -&amp;gt; mostrar la seccion de código donde estamos&lt;br/&gt;s -&amp;gt; step&lt;br/&gt;c -&amp;gt; continue&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;Existen otros, pero no los recuerdo ahora.&lt;br/&gt;Espero que les sirva!&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/20311093-4601784620541964224?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4601784620541964224/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4601784620541964224' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4601784620541964224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4601784620541964224'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/11/depurando-in-situ-pdb-ipython-ipdb.html' title='Depurando in situ: pdb + ipython =&amp;gt; ipdb'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_CICZrYFdH1w/SRkhY5VCN-I/AAAAAAAAAUE/wKGu0N4ueB8/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-213520407865120030</id><published>2008-11-09T14:30:00.001-08:00</published><updated>2008-11-09T14:30:29.420-08:00</updated><title type='text'>Kate como editor</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Inspirado en el post de &lt;a href='http://humitos.wordpress.com/2007/09/10/programando-con-kate/'&gt;Humitos sobre desarrollo con Kate&lt;/a&gt;, y viendo la forma en la que textmate ejecuta los programas, me dije, debe haber una fomra fácil de hacerlo en Linux.&lt;br/&gt;Humitos mostraba como hacer uso del ejecutar como script (Ctrl + Alt + X). El problema que encontraba con kate, es que los scripts se cerraban ni bien terminaban.&lt;br/&gt;En la configuración de kate, en la seccion de herramientas avanzadas:&lt;br/&gt;&lt;img src='http://lh3.ggpht.com/_CICZrYFdH1w/SRdjCgnd-YI/AAAAAAAAAT4/7T2hlCtKaR4/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Modifiqué la ejecución de console:&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh4.ggpht.com/_CICZrYFdH1w/SRdjNuS6PQI/AAAAAAAAAT8/O9_U5EPFg8U/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Agregando la variable FROM con valor kate. Una alternativa es agregar --noclose a la invocación, pero tenía que presionar Alt-F4 al terminar el script.&lt;br/&gt;&lt;br/&gt;Una vez hecho esto, en los scripts agrego lo siguiente (que lo tengo como sinppet):&lt;br/&gt;&lt;img src='http://lh6.ggpht.com/_CICZrYFdH1w/SRdkP7rjOKI/AAAAAAAAAUA/SbA-zRIwAxY/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;De esta manera puedo evitar que console se cierre cuando trabajo y solo cuando lo hago desde kate. Aunque se podría adaptar a otros editores.&lt;br/&gt;&lt;br/&gt;Espero que les sirva.&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/20311093-213520407865120030?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/213520407865120030/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=213520407865120030' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/213520407865120030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/213520407865120030'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/11/kate-como-editor.html' title='Kate como editor'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_CICZrYFdH1w/SRdjCgnd-YI/AAAAAAAAAT4/7T2hlCtKaR4/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-481894820759422532</id><published>2008-11-09T13:10:00.001-08:00</published><updated>2008-11-09T13:10:43.150-08:00</updated><title type='text'>Paseo por MacOSX</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hace tiempo que me había cautivado la intriga de conocer "el sistema operativo de los screencasts".&lt;br/&gt;Excepto en &lt;a href='www.showmedo.com'&gt;showmedo&lt;/a&gt;, donde la plataforma es variada, en su mayoría los screencasts que he visto son realizados sobre Mac.&lt;br/&gt;Con una versión del OS modificada, llamada &lt;a href='http://video.google.com/videosearch?q=iATKOS&amp;amp;ie=UTF-8&amp;amp;oe=utf-8&amp;amp;um=1&amp;amp;sa=X&amp;amp;oi=video_result_group&amp;amp;resnum=10&amp;amp;ct=title#'&gt;iATKOS&lt;/a&gt;, me di a la aventrua. La instalación tuvo el pequeño detalle de tener que modificar por consola el identificador de partición (0xAF) con fdisk. Una vez hecho esto y formateada, la instalación se realizó sin problemas. ACPI no funciona, lo que significa, que la PC no se apaga, ni se reinicia, ni se duerme. Un pequeño detalle.&lt;br/&gt;Instalé los drivers de Nvidia y nada más. El sonido no funcionaba, tampoco la red ni la wireless, pero si el adaptador USB-Wifi que había comprado hace poco.&lt;br/&gt;&lt;br/&gt;Para el usuario de Linux, mac tiene la consola relegada, no existe un Alt-F2, hay muchas combinaciones de teclado que aprender y para instalar sosftware GNU hay que hacerlo mediante macports.&lt;br/&gt;Macports es lentooooooooooooooo, bueno, compila todo. Algo que el usuario de Linux tradicional (exceptuando a los usuarios de gentoo, no estamos acostumbrados). Estas incomodidades supongo que son pasajeras, ya que lo que instalas con macports lo haces una vez cada mucho tiempo y en definitiva, al teclado te acostumbras.&lt;br/&gt;&lt;br/&gt;Hay algo que si me sorprendió mucho, y es la forma en la que se distribulle el software: Cuando bajas un programa, bajas un DMG, una suerte de imagen de disco. Una vez montada, arrastrás la aplicación a la carpeta /Applications y queda "instalada". El navegador de archivos te muestra todo como un icono, nada de carpetas, ni archivos, es una aplicación. La idea es buena, pero no hay nada como apt.&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh6.ggpht.com/_CICZrYFdH1w/SRdMOGn-ZRI/AAAAAAAAATw/AjLlfz615m0/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Lo que si me encantó fue el monitor de procesos. Es como un &lt;a href='http://htop.sourceforge.net/affinity.png'&gt;htop&lt;/a&gt; recargado.&lt;br/&gt;&lt;br/&gt;&lt;img src='http://lh5.ggpht.com/_CICZrYFdH1w/SRdMkVC0lyI/AAAAAAAAAT0/TZwtj6PGFIo/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Finalmente, creo que es una plataforma linda, para desarrollar, pero un toque incómoda al principio con el teclado.&lt;br/&gt;Es bastante velóz. La plítica del administrador de ventanas es bastante molesta, pero, Expośé y Spaces ayudan bastante.&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/20311093-481894820759422532?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/481894820759422532/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=481894820759422532' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/481894820759422532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/481894820759422532'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/11/paseo-por-macosx.html' title='Paseo por MacOSX'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_CICZrYFdH1w/SRdMOGn-ZRI/AAAAAAAAATw/AjLlfz615m0/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6307782648333106794</id><published>2008-11-06T20:58:00.001-08:00</published><updated>2008-11-06T20:58:29.468-08:00</updated><title type='text'>Dos sitios donde obtener django mediante Mercurial</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div align='center'&gt;&lt;img src='http://lh3.ggpht.com/_CICZrYFdH1w/SRPKlHAzZyI/AAAAAAAAATs/MmiFCaOYDug/%5BUNSET%5D.png?imgmax=800' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;/div&gt;Mercurial es un sistema de control de versiones distribuido muy versatil del cual ya he hablado en algún momento en mi blog. Está escrito en Python y va por la versión 1.0.2 al momento de escribir esta entrada. &lt;br/&gt;Django es un framework web cuyo lema es "Un framework para perfeccionistas con fechas límite". Django se carateriza por su reformulación del famoso patrón MVC, como MTV y una interfase de administración automática y customizable generada a partir del modelo.&lt;br/&gt;El desarrollo de django se sostiene sobre un repositorio SVN. Por suerte hay gente que mantiene mirrors sobre mercurial:&lt;br/&gt;&lt;a href='http://hg.gomaa.us/django/'&gt;hg.gomaa.us&lt;/a&gt;&lt;br/&gt;&lt;a href='http://hg.dpaste.com/django/trunk'&gt;hg.dpaste.com&lt;/a&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/20311093-6307782648333106794?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6307782648333106794/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6307782648333106794' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6307782648333106794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6307782648333106794'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/11/dos-sitios-donde-obtener-django.html' title='Dos sitios donde obtener django mediante Mercurial'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_CICZrYFdH1w/SRPKlHAzZyI/AAAAAAAAATs/MmiFCaOYDug/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2245728074739446266</id><published>2008-11-02T14:57:00.001-08:00</published><updated>2008-11-02T14:57:21.253-08:00</updated><title type='text'>Como hacer dinero con Softweare Libre (literalmente)</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;img src='http://4.bp.blogspot.com/_KhIIKmJ4wWc/SQiXPCrV5gI/AAAAAAAAAFc/Sv_XFUJSlds/s400/Architectuur+5+2008+kz+v5.jpg' style='max-width: 800px;'/&gt;&lt;br/&gt;En la &lt;a href='http://www.inkscape.org/mailing_lists.php'&gt;lista de inskape&lt;/a&gt; apareció el &lt;a href='http://pythonide.blogspot.com/2008/10/how-to-make-money-with-free-software.html'&gt;siguiente link&lt;/a&gt;. &lt;br/&gt;El Ministerio de Finanzas holades organizó un concurso en el que participaron un grupo arquitectos y artistas invitados. La meta no era crear un edificio sino la moneda de 5 euros conmemorativa con el nombre "Netherlands and Architecture". En el post se puede ver todo el desarrollo de la moneda.&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/20311093-2245728074739446266?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2245728074739446266/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2245728074739446266' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2245728074739446266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2245728074739446266'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/11/como-hacer-dinero-con-softweare-libre.html' title='Como hacer dinero con Softweare Libre (literalmente)'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KhIIKmJ4wWc/SQiXPCrV5gI/AAAAAAAAAFc/Sv_XFUJSlds/s72-c/Architectuur+5+2008+kz+v5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3405049036883369652</id><published>2008-05-30T21:41:00.001-07:00</published><updated>2008-05-30T21:41:19.572-07:00</updated><title type='text'>Chiche nuevo</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hace rato que no actualizo el blog. No les voy a decir que voy a tratar de revertirlo porque estaría mintiendo.&lt;br/&gt;Este es mi chiche nuevo:&lt;br/&gt;&lt;img src='http://4.bp.blogspot.com/_74KpThzt13U/R1XpKfajRDI/AAAAAAAAAB0/b2yY_iUVRbI/s400/xps_m1530_300+%28580x404%29.jpg' style='max-width: 800px;'/&gt;&lt;br/&gt;&lt;br/&gt;Una &lt;b&gt;Dell XPS 1530&lt;/b&gt; configurada con un Intel Core 2 Duo de 2.0GHz, 3GB de RAM, 320GB de disco (5400rpm) y una placa acceleradora nVidia 8600M GT.&lt;br/&gt;Tiene algunos chiches extras que vienen con todas las XPS: Cámara web integrada, lector de huellas digitales y microfono integrado.&lt;br/&gt;Dentro de los puertos de expansión lo más destacable es el HDMI, del cual no creo que valla a sacar mucho provecho en linux, de todos modos aún no dispongo en casa de ningún periférico con esta entrada.&lt;br/&gt;&lt;br/&gt;La máquina venía con Window Vista Home Premium, que al instalar los drivers de la tableta Wacom, dejó de funcionar.&lt;br/&gt;Luego con un vista Ultimate, trás instalar Leopard de la mano de iATKOS también a quedado inutilizado, de todas maneras mucho no me importa.&lt;br/&gt;&lt;br/&gt;El desepeño del sistema es más que aceptable aunque hay algunas cosas que extraño de mi viejo equipo de escritorio. La &lt;b&gt;Sound Blaster Live!&lt;/b&gt;, la HDA Intel, con un SigmaTel STAC9228 no es lo que yo llamaría "High Definition Audio". Quizás sea ALSA.&lt;br/&gt;&lt;br/&gt;El lector de huellas es otro chiche muy cómodo. Trás instalar Kubuntu 8.04 y darme una vuelta por la wiki de gentoo, quedó funcionando perfectamente.&lt;br/&gt;El touchpad y la placa wireless (una instel Pro Wireless 3945) no están funcionando como esperaba, pero como todo hardware nuevo, hay que esperar a que salgan mejores drivers.&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/20311093-3405049036883369652?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3405049036883369652/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3405049036883369652' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3405049036883369652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3405049036883369652'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/05/chiche-nuevo.html' title='Chiche nuevo'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_74KpThzt13U/R1XpKfajRDI/AAAAAAAAAB0/b2yY_iUVRbI/s72-c/xps_m1530_300+%28580x404%29.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3197018049040084832</id><published>2008-04-27T18:49:00.000-07:00</published><updated>2008-04-27T19:25:14.733-07:00</updated><title type='text'>Instalación de Mercurial 1.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/SBUzEGcxDFI/AAAAAAAAAO0/crqG1377XBQ/s1600-h/h.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/SBUzEGcxDFI/AAAAAAAAAO0/crqG1377XBQ/s320/h.png" alt="" id="BLOGGER_PHOTO_ID_5194113890785496146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mercruial es un sistema de control de versiones distribuido, escrito casi totalmente en python.&lt;br /&gt;Habiendose liberado la version 1.0, la mayoría de las distribuciones siguen incluyendo las versinones 0.9.3-0.9.5.&lt;br /&gt;Para instalar la verisón 1.0, primero elminaremos la version que traiga instalada nuestro sistema (estos ejemplos se basarn en *ubuntu):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;$ sudo apt-get remove --purge mercurial&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ cd /tmp&lt;/span&gt; &lt;span style="font-style: italic;"&gt;$ curl http://hg.intevation.org/files/mercurial-1.0.tar.gz | tar xzf -&lt;/span&gt; &lt;span style="font-style: italic;"&gt;$ cd mercurial-1.0/&lt;/span&gt; &lt;span style="font-style: italic;"&gt;$ make all; sudo make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora nos toca hablitar la extensión hgk, que nos muestra un árbol visual de las diferentes ramas del repositorio.&lt;br /&gt;&lt;br /&gt;Para esto necesitamos copiar el archivo hgk que se encuentra en mercurial-1.0/contrib a algún lugar en el path. En mi caso lo copié a /usr/local/bin.&lt;br /&gt;Tras esto, tenemos que instalar el intérprete de tcl/tk, simplemente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo apt-get install tk8.5 # En gutsy es 8.4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por último, nos falta hablitar esta extensión por defecto.&lt;br /&gt;La configuración global de mercurial se encuentra en /etc/mercurial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo mkdir -p /etc/mercurial/hgrc.d/&lt;/span&gt; &lt;span style="font-style: italic;"&gt;$ echo -e "[extensions]\nhgk=\n" | sudo tee /etc/mercurial/hgrc.d/hgk.rc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora ya podemos hacer &lt;span style="font-weight: bold;"&gt;hg view&lt;/span&gt; en cualquiera de uestros repos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3197018049040084832?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3197018049040084832/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3197018049040084832' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3197018049040084832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3197018049040084832'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/04/instalacin-de-mercurial-10.html' title='Instalación de Mercurial 1.0'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/SBUzEGcxDFI/AAAAAAAAAO0/crqG1377XBQ/s72-c/h.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8624793519025247024</id><published>2008-03-24T17:05:00.000-07:00</published><updated>2008-03-24T17:06:35.985-07:00</updated><title type='text'>Compendio de machetes</title><content type='html'>Aquí pueden encontrar vasrios machetes útiles para varios lenguajes.&lt;br /&gt;&lt;a href="http://www.smashingmagazine.com/2006/10/30/cheat-sheet-round-up-ajax-css-latex-ruby/"&gt;http://www.smashingmagazine.com/2006/10/30/cheat-sheet-round-up-ajax-css-latex-ruby/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El de Javscript me perece muy buen, para tenerlo colgado en la pared.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8624793519025247024?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8624793519025247024/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8624793519025247024' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8624793519025247024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8624793519025247024'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/03/compendio-de-machetes.html' title='Compendio de machetes'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2218728971387084150</id><published>2008-03-24T16:52:00.000-07:00</published><updated>2008-03-24T17:00:30.115-07:00</updated><title type='text'>Diseño web actual</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/R-g_mE5_iZI/AAAAAAAAAOU/8TDJs0Y_-Mc/s1600-h/reparto_del_tiempo.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/R-g_mE5_iZI/AAAAAAAAAOU/8TDJs0Y_-Mc/s320/reparto_del_tiempo.jpg" alt="" id="BLOGGER_PHOTO_ID_5181461294674315666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Buscando una imagen donde aparecieran los logos de todos los toolkits/frameworks de javascript actuales me topé con esto. Aquí tienen la &lt;a href="http://www.squiz.co.uk/__data/assets/image/0019/13645/time_breakdown.jpg"&gt;versión original&lt;/a&gt;. La solución es quitar la zona amarillo pato :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-2218728971387084150?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2218728971387084150/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2218728971387084150' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2218728971387084150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2218728971387084150'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/03/diseo-web-actual.html' title='Diseño web actual'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/R-g_mE5_iZI/AAAAAAAAAOU/8TDJs0Y_-Mc/s72-c/reparto_del_tiempo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8313861409885400512</id><published>2008-03-14T19:44:00.000-07:00</published><updated>2008-03-14T20:00:13.540-07:00</updated><title type='text'>Sorpresas</title><content type='html'>Finalmente estoy en mi último año de inglés, así que decidí comprarme un diccionario en serio, uno Oxford Advanced Learner.&lt;br /&gt;Al comprar una edición de tapa blanda no esperaba que en la contratapa trajera un CD. Para mi sorpresa no estaba rallado ni nada. Pero mi sorpresa fue mayor cuando al montar el CD Nautilus mostraba un directorio con nombre "linux". Al entrar, veo que aparece un subdirectorio con nombre vlc (así que pensé que era solo algún reproductor de video, para algún que otro contenido multimedial), pero afortunadamente estaba equivocado, porque también había un install.sh!&lt;br /&gt;Tras correrlo, comenzó la instalación.&lt;br /&gt;Luego de terminar, tenía en mi escritorio, un oald.desktop con algunos "-e" de más, quizás por alguna incrrecta utilización de echo en el shellscript.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/R9s5edr-WaI/AAAAAAAAAN0/QJksFGv06VE/s1600-h/oxford.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/R9s5edr-WaI/AAAAAAAAAN0/QJksFGv06VE/s200/oxford.png" alt="" id="BLOGGER_PHOTO_ID_5177795392120445346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez corregido en kate, mediante Ctrl + B, tenía el flamante acceso a una aplicación que nunca pensé que estuviere hecha sobre Mozilla.&lt;br /&gt;Funcionó perfectamente, ahora ya tengo una aplicación para resolver las dudas que mi fiel amigo dict perfecto a &lt;a href="http://linux.die.net/man/8/dictd"&gt;dict&lt;/a&gt;.&lt;br /&gt;Más alla de haber obtenido una excelente herramienta, me di cuenta de que si existe una plataforma para desarrollar aplicaciones multimediales para GNU, (bueno, también está Songbird, pero este diccionario es del 2005).&lt;br /&gt;Bueno, dejo un par de shots más...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/R9s7Dtr-WcI/AAAAAAAAAOE/VdRwtIVqzQ8/s1600-h/oxford2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/R9s7Dtr-WcI/AAAAAAAAAOE/VdRwtIVqzQ8/s320/oxford2.png" alt="" id="BLOGGER_PHOTO_ID_5177797131582200258" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/R9s7e9r-WdI/AAAAAAAAAOM/fX_PPRkC6xg/s1600-h/oxford1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/R9s7e9r-WdI/AAAAAAAAAOM/fX_PPRkC6xg/s320/oxford1.png" alt="" id="BLOGGER_PHOTO_ID_5177797599733635538" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8313861409885400512?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8313861409885400512/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8313861409885400512' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8313861409885400512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8313861409885400512'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/03/sorpresas.html' title='Sorpresas'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/R9s5edr-WaI/AAAAAAAAAN0/QJksFGv06VE/s72-c/oxford.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4684964550897624424</id><published>2008-01-24T17:51:00.000-08:00</published><updated>2010-02-04T20:45:46.502-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amarok'/><category scheme='http://www.blogger.com/atom/ns#' term='podcast'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><title type='text'>Podcasts y Python.</title><content type='html'>&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.vidadeunconsultor.com/wp-content/uploads/2007/03/podcast_logo.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://www.vidadeunconsultor.com/wp-content/uploads/2007/03/podcast_logo.jpeg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hace más o menos tres meses que comencé a escuchar &lt;a href="http://es.wikipedia.org/wiki/Podcasting"&gt;podcasts&lt;/a&gt;. En un principio par aprobar esa feature de Amarok y luego como herramienta útil y sobre todo práctica para escuchar conferencias o programas, además de practicar un poco el inglés "inglés" que como me mencionó una profesora, se vuelve menos claro que el americano con las consonantes aspiradas :$&lt;br /&gt;Pero bueno, este post en particular es para comentarles de dos podcasts muy interesantes si están usando o aprendiendo &lt;a href="http://www.python.org/"&gt;python. &lt;/a&gt;&lt;br /&gt;Los podcasts son:&lt;br /&gt;Python 411: &lt;a href="http://www.awaretek.com/python/"&gt;http://www.awaretek.com/python/&lt;/a&gt;&lt;br /&gt;y los de PyCon 2007: &lt;a href="http://pycon.blogspot.com/2007/11/pycon-2007-podcast.html"&gt;http://pycon.blogspot.com/2007/11/pycon-2007-podcast.html&lt;/a&gt;&lt;br /&gt;Por último, una captura de como se agregarn a &lt;a href="http://amarok.kde.org/"&gt;su reproductor favorito&lt;/a&gt;:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/R5lElZHIFBI/AAAAAAAAANU/rsDCNHdPTPw/s1600-h/ua3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/R5lElZHIFBI/AAAAAAAAANU/rsDCNHdPTPw/s320/ua3.png" alt="" id="BLOGGER_PHOTO_ID_5159230257316238354" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4684964550897624424?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4684964550897624424/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4684964550897624424' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4684964550897624424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4684964550897624424'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/01/podcasts-y-python.html' title='Podcasts y Python.'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/R5lElZHIFBI/AAAAAAAAANU/rsDCNHdPTPw/s72-c/ua3.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7184505978052061554</id><published>2008-01-24T17:38:00.000-08:00</published><updated>2008-01-24T17:50:48.616-08:00</updated><title type='text'>Mi iPod :)</title><content type='html'>Finamente tomé la decisión de comprar un iPod. Elegí el iPod nano, versión antigua, de 2GB.&lt;br /&gt;Por ratón lo compré usado por mercadolibre, y si bien el producto funciona de perfectamente,  la cobertura de acrílico tiene aglunas rallas así como  la parte trasera.&lt;br /&gt;¿Por que un iPod? Quería algo que funcione, nada de pilas,  pocas horas de autonomía ni nada, que no tarde mucho en copiar y mover archivos y que se pueda administrar fácilmente desde el software.&lt;br /&gt;El resultado es que es un excelente producto, hace lo que tiene que hacer y lo hace bien. Ahora me llevo la música y los podcasts cuando salgo. Todavía no lo exprimí al 100% (instalar linux por ejemplo), pero estoy muy satisfecho. La única pega es que no reproduce Ogg.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tecnogadgets.com/fotografias/ipod_nano_1G.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.tecnogadgets.com/fotografias/ipod_nano_1G.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7184505978052061554?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7184505978052061554/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7184505978052061554' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7184505978052061554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7184505978052061554'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2008/01/mi-ipod.html' title='Mi iPod :)'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4483952435117892286</id><published>2007-12-06T20:40:00.000-08:00</published><updated>2007-12-06T20:46:59.428-08:00</updated><title type='text'>Patrones para UIs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/R1jQE5BEqqI/AAAAAAAAAMA/FVJuW6t1Ryw/s1600-h/Interaction+Design+Pattern+Library+-+Welie.com_1197002259585.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/R1jQE5BEqqI/AAAAAAAAAMA/FVJuW6t1Ryw/s320/Interaction+Design+Pattern+Library+-+Welie.com_1197002259585.png" alt="" id="BLOGGER_PHOTO_ID_5141087757086796450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Siempre que oímos de patrones, recordamos los patrones de Gamma y cia. Existen muchos otros (los programadores Java no puedan mantener una conversación sobre su lenguaje sin hacer referencia a ellos), pero que pasa con la UI de nuestras aplicaciones web? Existen patrones para la interfase de usuario? Por supuesto, esta es una web que una buena recopilación &lt;a href="http://www.welie.com/patterns/index.php"&gt;http://www.welie.com/patterns/index.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4483952435117892286?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4483952435117892286/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4483952435117892286' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4483952435117892286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4483952435117892286'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/12/patrones-para-uis.html' title='Patrones para UIs'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/R1jQE5BEqqI/AAAAAAAAAMA/FVJuW6t1Ryw/s72-c/Interaction+Design+Pattern+Library+-+Welie.com_1197002259585.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-9051487397694817145</id><published>2007-11-21T12:32:00.000-08:00</published><updated>2007-11-21T13:35:14.647-08:00</updated><title type='text'>Mercurial</title><content type='html'>Hace un tiempo que vengo usando &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; para matener los proysctos propios (siempre regañé de la incomodidad del setup para el uso personal) y  la necesidad de cierta disciplina a la hora de hacer commit. Yo soy un programador de rachas, es decir, existen momentos creativos, y momentos de crítica. Generalmente, cuando me ilumino, hago un commit como medida preventiva si rompo todo :S (para que voy a branchear si estoy trabajando solo). Cuando hago lo mismo trabajando en grupo, es decir ser &lt;span style="font-style: italic;"&gt;commit friendly...&lt;/span&gt; a veces, se entretejen mis commits, con  los de otro programador con su "racha creativa", y se llega a un estado que se puede describir con estas palabras: "perá, no hagas commit", "dale, dale, ahora hacé commit", y cosas así...&lt;br /&gt;Comencé a probar otros mecanismos de control de versiones. Probé Svk y Darcs, Bazaar(muy superficialmente, me parecía que estaba demaciado enfocado al desarrollo de Ubuntu) y finalmente encontré algo sencillo, su nombre es &lt;span style="font-weight: bold;"&gt;mercurial&lt;/span&gt; (aka hg). Sinceramente, no fue por el tema de nuestro proceso caótico de desarrollo, sino por que la máquina donde teníamos nuestro server de svn con apache, estaba alejada geográficamente, y nos conectabamos por vpn, y a veces el enlace no funcionaba.&lt;br /&gt;&lt;br /&gt;La documentación oficial es corta, sin embargo suficiente.&lt;br /&gt;La principal diferencia entre un sistema de control distribuido, es que uno hace los commits contra su propio repositorio, luego hace push o pull de sus cambios, hacia o desde otro repositorio respectivamente.&lt;br /&gt;Cada copiad de trabajo, es una rama. Si usamos repositorio central, convergerán en el producto final, pero mientras tanto, podemos mantener localmente las versiones. Debido ha esto aumenta la posibilidad de hacer el merge un poco más caótico, pero creo que estar consiente de esto. Si sospecho que alguien en mi equipo de trabajo puede estar introduciendo cambios que pueden hacer que mi merge contra el repo central sea una odisea, puedo hacer un pull del repo de esta persona y ver como remediar el problema.&lt;br /&gt;&lt;br /&gt;El setup para http es bastante sencillo, corre como cgi, es cuestion de una regla para mod_rewrite y un location si queremos tener login.&lt;br /&gt;Otra coasa que no probé pero sonó muy bien, es que es plugineable.&lt;br /&gt;&lt;br /&gt;Bien, como se usa?&lt;br /&gt;Primero lo instalamos, apt-get install mercurial, emerge mercurial o yum install mercurial (según usemos Debian/Ubuntu, Gentoo o Fedora).&lt;br /&gt;Para crear el repo, en una carpeta:&lt;br /&gt;$ hg init&lt;br /&gt;ahora, si lo que queremos es hacer un "checkout", sería algo como&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ hg clone http://repo # También podemos enviar los cambios por mail o por ssh&lt;/span&gt;&lt;br /&gt;cuando queremos hacer commit (muy similar a svn)&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ hg commit &lt;/span&gt;&lt;br /&gt;los rollbacks&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ hg rollback&lt;/span&gt;&lt;br /&gt;para enviar los cambios&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ hg push&lt;/span&gt;&lt;br /&gt;y para traerlos&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ hg pull&lt;/span&gt;&lt;br /&gt;Toda la configuración está en la carpeta oculta .hg en el archivo hgrc (.hg/hgrc)&lt;br /&gt;Los archivos que queremos hacer pasar por lato, los ponemos en un .hgignore en el root del proyecto.&lt;br /&gt;Para servir el proyecto por http, adivinen, hg serve, jeje, para quienes usaron subversion la sintaxis es muy similar en muchos comandos, y para quienes no, creo que es bastante sencillo.&lt;br /&gt;&lt;br /&gt;Tiene un plugin para &lt;a href="http://trac.edgewall.org/wiki/TracMercurial"&gt;trac&lt;/a&gt;, que todavía no probé, pero también es otra feature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-9051487397694817145?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/9051487397694817145/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=9051487397694817145' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9051487397694817145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9051487397694817145'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/11/mercurial.html' title='Mercurial'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3601636214502882612</id><published>2007-11-12T20:27:00.000-08:00</published><updated>2007-11-12T21:55:30.696-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='screencast'/><title type='text'>Creación de screencasts</title><content type='html'>Una imagen vale más que mil palabras, y un video?&lt;br /&gt;La wikipedia define un screencast como: &lt;span style="font-style: italic;"&gt;&lt;br /&gt;"Un screencast es una grabación digital de la salida por pantalla de la computadora, a veces conteniendo narración de audio."&lt;/span&gt;&lt;br /&gt;Existe bastante software para crear screencasts, en Windows, uno muy popular es Camtasia. En el mundo GNU, existen varias posibilidades, pero solo les voy a hablar de las que me parecen maś apropiadas.&lt;br /&gt;Para capturar el video, la mejor aplicación IMHO es Record-My-Desktop, con su idonea interfase Gtk-Record-My-Desktop. Para instalarlo en Ubuntu:&lt;br /&gt;&lt;span style="font-family:onload;"&gt;$ sudo apt-get install gtk-recordmydesktop&lt;/span&gt;&lt;br /&gt;La aplicación es muy intuitiva, y la captura no consume tanto CPU como ffmpeg. Los resultados son más que aceptables.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RzkrW57cjXI/AAAAAAAAALA/nKNYtgEEYPE/s1600-h/gtk_recordmd.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RzkrW57cjXI/AAAAAAAAALA/nKNYtgEEYPE/s320/gtk_recordmd.png" alt="" id="BLOGGER_PHOTO_ID_5132180922872663410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La salida de esta aplicación es un archivo out.ogg en nuestro directorio home, que podremos ver sin problemas con vlc, mplayer (les recomiendo la GUI &lt;a href="http://smplayer.sf.net/"&gt;smplayer)&lt;/a&gt; o xine.&lt;br /&gt;Siempre graben 5 segundos más de screencast al final, para que no se les certe el video si los keyframes estan muy lejos.&lt;br /&gt;El problema de este formato OGG/Theora, es que ocupa mucho espacio. Para reducir el espacio, podemos recodificar el video utilizando otra aplicación llamada Avidemux que nos brinda una variedad de codecs interesante.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ sudo apt-get install avidemux&lt;/span&gt;&lt;br /&gt;Avidemux no abre directamente los archivos generados por record-my-desktop, debemos convertirlos a algo que el entienda. Para esto podemos utilizar mencoder.&lt;br /&gt;Para instalar mencoder&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ sudo apt-get install mencoder&lt;/span&gt;&lt;br /&gt;y para convertir los videos, desde una consola (que podemos lanzar con F4 en Konqueror), ejecutamos la siguiente linea:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ mencoder OUT.OGG -o SALIDA.AVI -ovc lavc -oac mp3lame&lt;br /&gt;&lt;/span&gt;El archivo SALIDA.AVI puede ser leido sin problemas por avidemux. Tengan en cuenta que si hacen varias grabaciones con record-my-desktop, serán numeradas como out.ogg, out.ogg.1, out.ogg.2, etc.&lt;br /&gt;Una vez cargado el archivo en Avidemux, vamos a configurar el codec de video:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RzkwHZ7cjYI/AAAAAAAAALI/Q8GPbTdsnRo/s1600-h/avidemux_video.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RzkwHZ7cjYI/AAAAAAAAALI/Q8GPbTdsnRo/s320/avidemux_video.png" alt="" id="BLOGGER_PHOTO_ID_5132186154142829954" border="0" /&gt;&lt;/a&gt;H264 es uno de los codecs más avanzados que probé, produce las mejores relaciones peso/calidad, y no trae muchos problemas a la hora de reproducir los archivos.&lt;br /&gt;A la hora de configurar la tasa de bits y las pasadas existen varias alternativas, pero les recomiendo la de elección de tamaño de archivo. Recuerden que si van a enviar el video por mail, el máximo tamaño de attachment es generalmente 10MBs. En lo posible es mejor no acercarse, a menos que nuestros videos alcancen los 20-30 minutos.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/Rzk0D57cjaI/AAAAAAAAALY/6OE7AZ3zsIs/s1600-h/avidemux_video1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/Rzk0D57cjaI/AAAAAAAAALY/6OE7AZ3zsIs/s320/avidemux_video1.png" alt="" id="BLOGGER_PHOTO_ID_5132190492059798946" border="0" /&gt;&lt;/a&gt;Además del codec de video, podemos aplicar varios filtros, uno útil, es el resizer, esto nos puede ahorrar varios bits :)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/Rzk1B57cjbI/AAAAAAAAALg/NQuA5EwijIA/s1600-h/avidemux_video2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/Rzk1B57cjbI/AAAAAAAAALg/NQuA5EwijIA/s320/avidemux_video2.png" alt="" id="BLOGGER_PHOTO_ID_5132191557211688370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Finalmente, si nuestro screencast tiene audio, debemos elegir el codec de audio.&lt;br /&gt;Notarán que no existe ningún botón de "Comenzar" o "Convertir" , para iniciar la conversión, tenemos que ir al menú Archvio &gt; "Añadir a la lista de tareas", poniendo el nombre de la tarea y el nombre del archivo destino. Luego con "Archivo" &gt; "Mostar Lista de Tareas" o Ctrl + J, seleccionamos la tarea y la ejecutamos.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/Rzk8HZ7cjdI/AAAAAAAAALw/ZFsjyrRlKps/s1600-h/codificando.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/Rzk8HZ7cjdI/AAAAAAAAALw/ZFsjyrRlKps/s320/codificando.png" alt="" id="BLOGGER_PHOTO_ID_5132199348282363346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Tengan en cuenta que la barra de progreso debe llenarse dos veces si eligieron una codificación de video de dos pasadas (casi siempre).&lt;br /&gt;&lt;br /&gt;Espero que les sirva!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3601636214502882612?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3601636214502882612/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3601636214502882612' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3601636214502882612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3601636214502882612'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/11/creacin-de-screencasts.html' title='Creación de screencasts'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/RzkrW57cjXI/AAAAAAAAALA/nKNYtgEEYPE/s72-c/gtk_recordmd.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3384196697085466962</id><published>2007-11-09T12:25:00.000-08:00</published><updated>2007-11-09T13:29:07.188-08:00</updated><title type='text'>Reflexiones de primera semana</title><content type='html'>Hoy se cumple la primera semana en el laburo de la Uni. Todo ha ido bastante tranquilo. Me aguarda una gran tarea, la de migrar MDeamon a Postfix/Fetchmail o lo que más convega. Control de tráfico también será una de las tareas a tener en cuenta...&lt;br /&gt;En este ultimo tiempo también he estado trabajando bastante con Django,  en un trabajo para una intranet. Aprendí que no hay punto de comparación entre un lenguaje dinámico y uno estático (tipado). Salieron cosas genéricas para generar formularios, para generar búsquedas, listados, cosas que espero podamos liberar cuando estén más maduras. Hoy, cuando la primera entrega se encuentra hecha, veo que necesitamos mejorar el proceso, más que el producto. Los lenguajes ya son lo suficientemente sofisticados, los frameworks, los tenemos en todos los colores y sabores, pero cuando el desarrollo se extiende a más de una persona, el proceso de desarrollo es el principal responsable de las demoras y fallas. Ya se, son las palabras de las materias de ingeniería de software, pero, jejeje, voy a refrescar uno de los dichos de uno de mis profes "si escucho, olvido; si leo, recuerdo; si hago, aprendo"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3384196697085466962?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3384196697085466962/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3384196697085466962' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3384196697085466962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3384196697085466962'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/11/reflexiones-de-primera-semana.html' title='Reflexiones de primera semana'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5367437286280186311</id><published>2007-10-22T02:20:00.000-07:00</published><updated>2007-10-22T02:41:22.476-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xfs'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fs'/><category scheme='http://www.blogger.com/atom/ns#' term='ext3'/><title type='text'>Chau FAT32!</title><content type='html'>Finalmente me he deshecho de una espina que venía molestando desde hace mucho, una partición &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;FAT&lt;/span&gt;32 de 91&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;GB&lt;/span&gt;.&lt;br /&gt;La operación se realizó sin mayores inconvenientes. Agregué el disco para hacer el almacenamiento temporal. Gracias a que &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Kubuntu&lt;/span&gt; trabaja con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;UUIDs&lt;/span&gt; en vez de dispositivos en &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;fstab&lt;/span&gt;, no hubo mayores dramas a la hora del montaje.&lt;br /&gt;Luego de copiar todos los archivos, desde la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;fat&lt;/span&gt; a la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;ext&lt;/span&gt;3 del disco temporal, había transcurrido casi una hora, en la que  se portó bastante bien.&lt;br /&gt;Paso siguiente a la copia fue eliminar la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;platición&lt;/span&gt; con &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;cfdisk&lt;/span&gt;.&lt;br /&gt;Tuve que hacer &lt;span style="font-family: trebuchet ms; color: rgb(51, 51, 153);"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;export&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;LANG&lt;/span&gt;="C"&lt;/span&gt;, para que dejara de pedirme el molesto acento, en al confirmación de si realmente estaba seguro de escribir la tabla de particiones.&lt;br /&gt;El sistema de archivos elegido fue &lt;a href="http://en.wikipedia.org/wiki/XFS"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;XFS&lt;/span&gt;&lt;/a&gt; al cual ya había convertido otra partición con mucha documentación. &lt;span style="font-family: trebuchet ms; color: rgb(51, 51, 153);"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;mkfs&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;ext&lt;/span&gt;3 /&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;dev&lt;/span&gt;/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;sdb&lt;/span&gt;8&lt;/span&gt; hizo el trabajo de el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;formateo&lt;/span&gt; en menos de un segundo... pero la copia de archivos tardó una hora más...&lt;br /&gt;Luego de editar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;fstab&lt;/span&gt;, y montar la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;paritción&lt;/span&gt;, inicié &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Amarok&lt;/span&gt;, y no hizo falta hacer nada especial, la colección estaba intacta, con el adicional de carga más veloz de los temas.&lt;br /&gt;Todo un éxito.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms; color: rgb(51, 51, 153);"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5367437286280186311?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5367437286280186311/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5367437286280186311' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5367437286280186311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5367437286280186311'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/10/chau-fat32.html' title='Chau FAT32!'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4944069758446544115</id><published>2007-10-16T11:27:00.000-07:00</published><updated>2007-10-16T11:31:22.137-07:00</updated><title type='text'>Wine Reviews</title><content type='html'>Encontré &lt;a href="http://wine-review.blogspot.com/"&gt;este blog&lt;/a&gt; con detallados pasos de instalación de aplicaciones de Windows en Linux mediante Wine.&lt;br /&gt;Contiene información detallada, enumerando las características que funcionan y las que no.&lt;br /&gt;Vale la pena darse una vuelta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4944069758446544115?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4944069758446544115/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4944069758446544115' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4944069758446544115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4944069758446544115'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/10/wine-reviews.html' title='Wine Reviews'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3509156782015810818</id><published>2007-10-09T20:01:00.000-07:00</published><updated>2007-10-09T20:25:28.882-07:00</updated><title type='text'>Kernel 2.6.23</title><content type='html'>Ya salió el flamante &lt;a href="http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.tar.bz2"&gt;kernel 2.6.23&lt;/a&gt; con muchas novedades. El nuevo scheduler y varios mecanismos de virtualización ya integrados. Actualmente con el kernel patcheado con el &lt;a href="http://members.optusnet.com.au/ckolivas/kernel/"&gt;último parche de Kolivas&lt;/a&gt;, vmware-server no quiere saber nada. Así que vamos a probar que tal le va a este Ubuntu (con sus días como 7.04 contados) con este nuevo núcleo.&lt;br /&gt;Acá les dejo un párrafito de OSNews:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;This version includes the new and shiny CFS process scheduler, a simpler read-ahead mechanism, the lguest 'Linux-on-Linux' paravirtualization hypervisor, XEN guest support, KVM smp guest support, variable process argument length, SLUB is now the default slab allocator, SELinux protection for exploiting null dereferences using mmap, XFS and ext4 improvements, PPP over L2TP support, the 'lumpy' reclaim algorithm, a userspace driver framework, the O_CLOEXEC file descriptor flag, splice improvements, a new fallocate() syscall, lock statistics, support for multiqueue network devices, various new drivers and many other minor features and fixes.&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/20311093-3509156782015810818?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3509156782015810818/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3509156782015810818' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3509156782015810818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3509156782015810818'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/10/kernel-2623.html' title='Kernel 2.6.23'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-340918334791867259</id><published>2007-10-07T12:00:00.000-07:00</published><updated>2007-10-07T12:18:05.596-07:00</updated><title type='text'>PyMagazine!!!</title><content type='html'>&lt;a href="http://www.pythonmagazine.com/c/index"&gt;Python Magazine&lt;/a&gt; es una revista orientada totalmente al lenguaje Python.&lt;br /&gt;Acaba de comenzar a publicarse este mes y &lt;a href="http://www.pythonmagazine.com/img/issues/2007/10/PyMag_2007-10.pdf"&gt;su primer ejemlar se puede descargar en PDF&lt;/a&gt;.&lt;br /&gt;La revista está en inglés, algo que no creo que cambie ya que en estas pampas todo parece estar copado por .Net, Java y PHP.&lt;br /&gt;La suscripción cuesta &lt;a href="http://www.xe.com/ucc/"&gt;60 dólares canadienses, casi $200 pesos argentinos&lt;/a&gt;. Creo que voy a necesitar hacerme de una tarjeta de crédito :-(&lt;br /&gt;He leído un solo artículo, el de &lt;a href="http://www.holdenweb.com/"&gt;Steve Holden&lt;/a&gt; sobre las PyCONs, pero tiene artículos muy interesantes, uno de ellos trata sobre crear extensiones en C para Python :)&lt;br /&gt;&lt;br /&gt;Fuente &lt;a href="http://www.vivalinux.com.ar"&gt;VivaLinux&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-340918334791867259?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/340918334791867259/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=340918334791867259' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/340918334791867259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/340918334791867259'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/10/pymagazine.html' title='PyMagazine!!!'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8239693225078061572</id><published>2007-09-11T13:12:00.000-07:00</published><updated>2007-09-11T13:19:19.126-07:00</updated><title type='text'>Adiviná que OS estoy Usando, con VBox 1.5</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/Rub3d_TAomI/AAAAAAAAAKo/IGOm8VmgeXk/s1600-h/autocompletado2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/Rub3d_TAomI/AAAAAAAAAKo/IGOm8VmgeXk/s400/autocompletado2.png" alt="" id="BLOGGER_PHOTO_ID_5109042921877840482" border="0" /&gt;&lt;/a&gt;La última actualización de Virtual Box (1.5), me ha sorprendido, integración seamless con el de las ventanas del huésped escritorio anfitrión! Todo a un apt-get de distanacia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8239693225078061572?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8239693225078061572/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8239693225078061572' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8239693225078061572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8239693225078061572'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/09/adivin-que-os-estoy-usando-con-vbox-15.html' title='Adiviná que OS estoy Usando, con VBox 1.5'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/Rub3d_TAomI/AAAAAAAAAKo/IGOm8VmgeXk/s72-c/autocompletado2.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5686922523751515102</id><published>2007-08-24T21:35:00.000-07:00</published><updated>2007-08-24T21:48:39.910-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grub'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Recuperar Ubuntu/Debian</title><content type='html'>Esto es común cuando se instala Windows en un disco donde se tenía Linux instalado. El MBR es reescrito por el sistema de arranque de Microsoft.&lt;br /&gt;Existen varias alternativas, una de estas, es descargar Smart Boot Manager e instalarlo en el disco en cuestión, nos mostrará un menú de arranque con todas las particiones.&lt;br /&gt;La otra opción es reinstalar Grub (el programa que levanta Linux, el "menucito" ese que &lt;span style="font-style: italic;"&gt;aparecía &lt;/span&gt;antes mostrándome los sistemas operativos disponibles para arrancar).&lt;br /&gt;Para esto necesitamos arrancar con un CD o DVD de alguna distribución, y llegar a una consola de root.&lt;br /&gt;Una vez en la consola debemos averiguar cual era la paritción que tenía instalado nuestro linux, para esto podemos usar &lt;span style="font-weight: bold;"&gt;diskdruid&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;cfdisk&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;fdisk -l&lt;/span&gt;. Paso siguiente es crear un punto de montaje para esta partición:&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;mkdir /mnt/linux&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Tras crear el directorio debemos montar la partición&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;mount NOMBRE_PATICION /mnt/linux&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Luego debemos montar dos pseudo-filesystems, a saber /proc y /dev&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;mount -o bind /proc /mnt/linux/proc&lt;br /&gt;mount -o bind /dev /mnt/linux/dev&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Ahora ya podemos hacer el cambio de raíz, que sería como volver a nuestro desaparecido linux.&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;chroot /mnt/linux&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Nos queda instalar grub, mediante la utilidad grub-install&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;grub-install NOMBRE_PATICION&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Espero que les halla sido útil!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5686922523751515102?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5686922523751515102/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5686922523751515102' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5686922523751515102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5686922523751515102'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/08/recuperar-ubuntudebian.html' title='Recuperar Ubuntu/Debian'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4083927987159227962</id><published>2007-08-04T05:53:00.000-07:00</published><updated>2007-08-04T09:24:36.651-07:00</updated><title type='text'>SQLObject: Guardando Objetos en Una Base de Datos fácilmente.</title><content type='html'>&lt;a href="http://www.sqlobject.org/SQLObject.html"&gt;SQLObject&lt;/a&gt; es un Mapeador de Objetos en Tablas de Bases de Datos, &lt;span style="font-style: italic;"&gt;Object Relational Mapper&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;Object Relational Manager&lt;/span&gt;(o simplement ORMs)&lt;span style="font-style: italic;"&gt;. &lt;/span&gt;Si bien existen otros ORMs, como SQLAlchemy o el propio ORM de Django, SQLObject se caracteriza por su curva de aprendizaje de escasa pendiente.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Las bases de datos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Las Bases de Datos actuales se basan en el concepto de entidades (persona, auto, ejemplar) y relaciones (tiene, maneja, pertenece &lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;-Generalmente estos nombres se suelen usar en las etapas más primigenias de los modelos-&lt;/span&gt;&lt;/span&gt;).&lt;br /&gt;Inicialmente se crea un modelo llamado conceptual, donde se utilizan 3 &lt;span style="font-weight: bold;"&gt;primitivas:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;especificación,&lt;/span&gt; &lt;span style="font-style: italic;"&gt;generalización&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;agregación.&lt;/span&gt; Como las bases de datos no soportan el concepto de herencia (generalización), entre otras cosas,  se va "bajando" el modelo, hacia un modelo lógico, que si es posible utilizar en una base de datos.&lt;br /&gt;Para interactuar con estas bases de datos relacionales, se utiliza un lenguaje llamado SQL (&lt;span style="font-style: italic;"&gt;Structured Query Language&lt;/span&gt;), que tiene su estandar y todo, pero como siempre, hay varios sabores.&lt;br /&gt;Los comandos &lt;a href="http://es.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt; se dividen en &lt;a href="http://es.wikipedia.org/wiki/SQL#Lenguaje_de_Definici.C3.B3n_de_datos_.28LDD.29"&gt;DDL&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/SQL#Lenguaje_de_Manipulaci.C3.B3n_de_datos_.28LMD.29"&gt;DML.&lt;/a&gt; &lt;a href="http://es.wikipedia.org/wiki/SQL#Lenguaje_de_Definici.C3.B3n_de_datos_.28LDD.29"&gt;DDL&lt;/a&gt; (Data Definition Language) es el lenguaje que nos permite generar y alterar la estructura de la base de datos. &lt;a href="http://es.wikipedia.org/wiki/SQL#Lenguaje_de_Manipulaci.C3.B3n_de_datos_.28LMD.29"&gt;DML&lt;/a&gt; es el lenguaje de manipulación de datos, con el que podemos ingresar datos (INSERT), recuperar (SELECT), borrar (DELETE) y actualizar (UPDATE).&lt;br /&gt;Dentro del software que usamos para las bases de datos tenemos: DBDesigner, Open System Architect (version Open Source de Data Architect), PGAdmin 3, MySQL Administrator, MySQL Query Browser, SQLiteman y SQLite Browser.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Los objetos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Los objetos se basan en diferentes principios de los que rigen las bases de datos (herencia, polimorfismo, encapsulamiento, &lt;span style="font-style: italic;"&gt;persistencia&lt;/span&gt;, etc.). En un mundo ideal, con infinita memoria persistente, no necesitaríamos guardar objetos en una base de datos, pero, en el mundo real, debemos hacerlo.&lt;br /&gt;Si pensamos en que es un objeto, en Python, vendrá a nuestras cabezas la idea del diccionario, de métodos(funciones) y atributos(variables).&lt;br /&gt;En python, los atributos de instancia, son inicializados en el &lt;span style="font-weight: bold;"&gt;inicializador&lt;/span&gt;  (o método &lt;span style="font-weight: bold;"&gt;__init__&lt;/span&gt;), de manera que de antemano, no podemos "ver" los atributos de la clase, así que de alguna manera tendremos que especificarle al ORM, que datos queremos guardar de nuestra clase.&lt;br /&gt;También será necesario saber que tipo de datos queremos guardar de cada objeto. Un nombre será de tipo cadena, una fecha de tipo fecha, un precio de tipo flotante, y así con cada elemento de nuestro modelo de clases.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Acción&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Bien, vamos que como se plasma toda esta cachara en código Python. Para esto voy a suponer que tienen SQLite instalado y SQLObject (con easy_install de las python-setuptool se instala perfectametne)&lt;br /&gt;from sqlobject import *&lt;br /&gt;# Esta es una base de datos en memoria&lt;br /&gt;__connection__ = "sqlite:/:memory:"&lt;br /&gt;class Persona(SQLObject):&lt;br /&gt;   nombre = StringCol(length=30)&lt;br /&gt;   apellido = StringCol(length=30)&lt;br /&gt;   altura = FloatCol()&lt;br /&gt;Persona.createTable()&lt;br /&gt;# Creamos tres personas, no hace falta que guardemos las instancias en p&lt;br /&gt;# ya que no se las lleva el GC, están en la DB!!!&lt;br /&gt;p = Persona(nombre = "Eduardeo", apellido = "Perez", altura = 1.96)&lt;br /&gt;p = Persona(nombre = "Maria Laura", apellido = "Garatti", altura = 1.73)&lt;br /&gt;p = Persona(nombre = "Pablo", apellido = "Martinez", altura = 1.68)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;# Ahora recorremos las persona que generamos&lt;br /&gt;for i in Persona.select():&lt;br /&gt;   print i&lt;br /&gt;# Y ahora una connsulta con altura, pasando a condición SQL&lt;br /&gt;for i in Persona.select("""altura &gt; 1.70 """):&lt;br /&gt;   print i&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Relaciones&lt;/span&gt;&lt;br /&gt;Las relaciones entre objetos, pueden ser uno a uno, uno a muchos o muchos a muchos. En este aso el ejemplo es sencillo. Es una relación uno a muchos.&lt;br /&gt;El ejemplo se trata de un modelo donde tenemos proveedores y productos.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#! /usr/bin/python&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; sqlobject &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Para usar MySQL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# mysql:/usuario:pass@host/base&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;__connection__ &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"sqlite:/:memory:"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Proveedor&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;SQLObject&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    nombre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; StringCol&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;length&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;20&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    direccion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; StringCol&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;length&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;60&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __str__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.nombre&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Producto&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;SQLObject&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    nombre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; StringCol&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;length&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;20&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    precio &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; FloatCol&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    proveedor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ForeignKey&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Proveedor'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __str__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Prod: &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt; $ %.2f"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.nombre, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.precio&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# El programa principal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __name__ &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"__main__"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; tabla &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Proveedor, Producto&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;]:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        tabla.createTable&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    p1 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Proveedor&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;nombre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Muebles del Sur"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, direccion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Av. Alcorta Cicatriz"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    p2 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Proveedor&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;nombre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Muebles del Este"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, direccion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Zapiola 340"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    p3 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Proveedor&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;nombre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Equipamientos Fontana"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, direccion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Fontana 223"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Para achicar un poco el codigo y usar algo de los hermosos tipo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# que python nos provee, armamos un diccionario con el proveedor&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# como clave y una lista de tuplas (producto, precio)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    datos_pro &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; p1 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Silla'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;120&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Mesa'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;150&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'alacena'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;200&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)]&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                  p2 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Armario'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;300&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Frazada'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;70&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                            &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Pytho For Dummies'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;9.99&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;]&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                  p3 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Martillo'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;25&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Neumatico'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;200&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Banco'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;70&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; prov, productos &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; datos_pro.iteritems&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;():&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; nombre, precio &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; productos&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            Producto&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; nombre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; nombre, precio &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; precio, proveedor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; prov&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Mostrando todos los productos:"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; prod &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Producto.select&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;():&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; prod&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Un conjunto (set) tiene la propiedad de que sus elementos no se repiten&lt;br /&gt;   # a diferencia de una lista o un diccionario.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    provs &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; set&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; p &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Producto.select&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"""precio &amp;lt; 100"""&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        provs.add&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;p.proveedor&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Proveedores con productos de menos de $100:"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;40&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; p &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; provs&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"*"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, p&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;A diferencia de PyQt, donde es necesario mantener la referencia al objeto una vez instanciado para que el Garbage Collector no nos lo borre, en este caso, con cada instancia que generamos se genera una tupla en la base de datos. De manera que no es necesario guardar estas referencias. El método select(), que heredamos de las clase SQLObject, nos permite hacer consultas. Le pasamos como argumento, lo que podríamos en el WHERE de nuestro SQL.&lt;br /&gt;&lt;br /&gt;Si bien es necesario saber algo de SQL para sacarle el jugo, es evidente las facilidad con la que persistimos objetos.&lt;br /&gt;SQLObject tiene muchas cosas interesantes, de hecho, es el ORM de TurboGears, un framework web ala Rails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4083927987159227962?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4083927987159227962/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4083927987159227962' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4083927987159227962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4083927987159227962'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/08/sqlobject-guardando-objetos-en-una-base.html' title='SQLObject: Guardando Objetos en Una Base de Datos fácilmente.'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7802463477739230088</id><published>2007-07-11T02:36:00.000-07:00</published><updated>2007-07-11T02:54:22.478-07:00</updated><title type='text'>Hacia Kubuntu.... y una noticia triste: Despedida a Con Kolivas</title><content type='html'>Ya hace una semana y un día que estoy utilizando Kubuntu, luego de haber terminado de destruir un Debian que había sufrido casi todos mis caprichos.&lt;br /&gt;Tengo ciertos puntos a favor de Kubuntu en el corto tiempo que lo estoy usando:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Software más actualizado para Desktop/Desarrollo.&lt;br /&gt;En particular, Python, OpenOffice, Amarok.&lt;/li&gt;&lt;li&gt;Mucha documentación muy fácil y redundante.&lt;/li&gt;&lt;li&gt;Muchos repositorios bastante &lt;span style="font-style: italic;"&gt;serios&lt;/span&gt; para nutrir a la distro con software adicional.&lt;br /&gt;Con serios me refiero a que no rompen dependencias con otros paquetes del mainstream y cosas por el estilo.&lt;/li&gt;&lt;li&gt;Cosas de moda, a pocos apt-get... como compiz-fussion. Al ser una ditro popular, siempre hay alguien compilando lo que queremos :)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Sin embargo encontré varios detalles molestos. Pocas imágenes de núcleo por defecto y performance bastante mala en comparación a Debian. Mucho menos software en los repositorios. Tiempos de arranque más prolongados.&lt;br /&gt;&lt;br /&gt;Finalmente, respeta perfectamente muchos de los mecanismos de debianero, por ejemplo, el make-kpkg, para crear una imagen del kernel y unos headers (para nvidia, vmware, etc.). Así que solucionar el tema del kernel por defecto no tuvo mayores complicaciones. Creo que voy a quedarme con Kubuntu por algún tiempo.&lt;br /&gt;Por último una pálida: Al bajar los parches de Con Kolivas para el kernel 2.6.22, me enteré que la versión 2.6.22-ck1 será la última.&lt;br /&gt;Veremos que nos depara el planificador totalmente justo de Ingo Molnar en el release 2.6.23.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7802463477739230088?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7802463477739230088/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7802463477739230088' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7802463477739230088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7802463477739230088'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/07/hacia-kubuntu-y-una-noticia-triste.html' title='Hacia Kubuntu.... y una noticia triste: Despedida a Con Kolivas'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7235920586308015778</id><published>2007-07-10T01:50:00.000-07:00</published><updated>2007-07-10T02:04:49.498-07:00</updated><title type='text'>Mejorando compatibilidad de Wine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RpNK-23NZxI/AAAAAAAAAKg/-G7LV7mGCyI/s1600-h/editor1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RpNK-23NZxI/AAAAAAAAAKg/-G7LV7mGCyI/s400/editor1.png" alt="" id="BLOGGER_PHOTO_ID_5085490847970846482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vía &lt;a href="http://vivalinux.com.ar"&gt;Vivalinux&lt;/a&gt; me enteré que se liberó &lt;a href="http://www.wine-doors.org/wordpress/"&gt;Wine-Doors,&lt;/a&gt; una aplicación escrita en &lt;a href="http://www.pygtk.org/"&gt;PyGTK,&lt;/a&gt; que nos permite instalar varios programas de winblows en nuestro wine, como por ejemplo, QuickTime, DVD Decrypter, varias fuentes, runtimes de Micro$oft, y algunos juegos, como Half Life o WoW 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7235920586308015778?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7235920586308015778/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7235920586308015778' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7235920586308015778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7235920586308015778'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/07/mejorando-compatibilidad-de-wine.html' title='Mejorando compatibilidad de Wine'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/RpNK-23NZxI/AAAAAAAAAKg/-G7LV7mGCyI/s72-c/editor1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4781159928019899367</id><published>2007-06-27T14:47:00.000-07:00</published><updated>2007-06-28T15:54:35.383-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>Creación de una calculadora con Python y PyQt4</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Introducción:&lt;/span&gt;&lt;br /&gt;Vamos a emprender la "aventura" de crear una calculadora. Python nos va a ayudar con su introspección y sus tipos de datos diccionario, lista y tupla; Qt nos va a dar una mano con sus mecanismos de conexión y algunas propiedades útiles que define en su clase base principal, QObject.&lt;br /&gt;Por último, y para hacer menos aburrido el tema, usaremos un autómata finito (aka. maquina de estados) para emular el comportamiento de esas calculadoras económicas de bolsillo, desarrolladas en algún país del este...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Diseño de la interfase:&lt;br /&gt;&lt;/span&gt;Para esto, utilizaremos el diseñador de Qt, en Debian el binario se llama designer (o designer-qt4 si se tiene Qt3 y Qt4 instalados).&lt;br /&gt;Es una buena oportunidad de usar los layouts, en especial, uno que no usamos a menudo, el layout matricial, o de celdas (QGridLayout).&lt;br /&gt;Luego de jugar un rato, podremos hacer algo como lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RoLfHm3NZtI/AAAAAAAAAKA/2g-dmdY0tMw/s1600-h/edicion1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RoLfHm3NZtI/AAAAAAAAAKA/2g-dmdY0tMw/s400/edicion1.jpg" alt="" id="BLOGGER_PHOTO_ID_5080868651411531474" border="0" /&gt;&lt;/a&gt;Donde hemos definido los nombres de los objetos, respetando un patrón, en este caso, los digitos, se llaman btn_digit_&lt;numero&gt;, ej: btn_digit_1, btn_digit_2, btn_digit_3, etc.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RoLhIG3NZuI/AAAAAAAAAKI/oleYCZGvg3o/s1600-h/layout_pre.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RoLhIG3NZuI/AAAAAAAAAKI/oleYCZGvg3o/s400/layout_pre.jpg" alt="" id="BLOGGER_PHOTO_ID_5080870859024721634" border="0" /&gt;&lt;/a&gt;Desde tenemos algunos atajos muy útiles, CTRT+R para probar la interfase, F1 para obtener la información del Widget que tenemos seleccionado y CTRL+I, para acceder al diálogo de propiedades del Widget, donde editamos la paleta, las fuentes, dimensiones y demás propiedades netamente visuales.&lt;br /&gt;El .ui de la interfase se puede descargar aquí: &lt;a href="http://paste2.org/p/4131"&gt;interfase.ui&lt;/a&gt;&lt;br /&gt;&lt;span&gt;En este ejemplo, he usado el mecanismo de herencia múltiple, no el de carga dinámica.&lt;br /&gt;Para esto tenemos que compilar el .ui en un .py, para automatizar la tarea, suelo usar un Makefile, como  &lt;a href="http://paste2.org/p/4132"&gt;este&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Lógica de la calculadora:&lt;/span&gt;&lt;br /&gt;Si estuviésemos programando en Visual Basic, Delphi o cualquier otro entorno orientado a eventos, seguramente pondríamos el código de la aplicación en cada pulsación de cada botón, pero en este caso, utilizaremos un autómata.&lt;br /&gt;Un automata finito se define como un alfabeto de entrada (en este caso, los botones de la calculadora), un conjunto de estados, un cojunto de transiciones y un conjunto de acciones asociadas a cada transición.&lt;br /&gt;La maquina de estados se inicializa en algún estado inicial, y a medida que va recibiendo entrada, irá saltando de estado en estado, y realizando las funciones asociadas.&lt;br /&gt;En este caso, la calculadora cuenta con un solo lugar de almacenamiento (o acumulador), además usa la pantalla como buffer temporal de los datos. Tendrá la capacidad de recordar una operación.&lt;br /&gt;El automata consiste en un módulo a parte, llamado automata.py, que posee la tabla de transiciones, y la función que ejecuta las transiciones de acuerdo a la entrada.&lt;br /&gt;&lt;/numero&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;automata &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[]&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'digito'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'primer_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'establecer'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operacion'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operando'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'almacenar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'igual'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'clear'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'limpiar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'primer_dig'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'primer_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'actualizar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'digito'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'primer_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'actualizar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operacion'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operando'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,  &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'guardar_op'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'almacenar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'igual'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'almacenar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'clear'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'limpiar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operando'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero_dos'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'establecer'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'digito'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'segundo_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'establecer'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operacion'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'igual'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'clear'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'limpiar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero_dos'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero_dos'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'digito'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'segundo_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'establecer'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operacion'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero_dos'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'iugal'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero_dos'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'clear'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'limpiar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'segundo_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'segundo_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'actualizar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'digito'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'segundo_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'actualizar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operacion'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'guardar_op'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'igual'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'clear'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'limpiar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'cero'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'establecer'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'digito'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'primer_dig'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'establecer'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operacion'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'operando'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'almacenar'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'guardar_op'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'igual'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'resultado'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'clear'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'en_cero'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'limpiar'&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Para generalizar esta lógica, utilizaremos las capacidades de introspección de Python.&lt;br /&gt;¿Que es esto?&lt;br /&gt;Bueno, es implemente dada una instanacia, obtener una función (que es un objeto después de todo, no?)&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;funcion = getattr(instancia, "nombre")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;funcion(arg1, arg2)&lt;/span&gt;&lt;br /&gt;Jejeje, muy fácil. De esta manera, para ejecutar el autómata tenemos una función muy simple:&lt;br /&gt;&lt;div style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; caracter, vista &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''Ejecuta la logia de la caluladora.'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    entrada &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; tipo_entrada&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;str&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;caracter&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    transicion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;getattr&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;vista, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"estado"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;][&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;entrada&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Realizar la lista de acciones relacionadas con el cambio de estado&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# si es que existen...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; transicion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FUNCIONES&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;]:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; i &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; transicion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FUNCIONES&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;]:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; DEBUG&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"estado &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt; &gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;)"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;getattr&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;vista, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"estado"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ,i, caracter&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            accion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;getattr&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;vista, i&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            accion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;caracter&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; DEBUG&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Cambiando a &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;%&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;transicion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PROXIMO_ESTADO&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;setattr&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;vista, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"estado"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, transicion&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PROXIMO_ESTADO&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;El código del autómata se puede ver completo en: &lt;a href="http://paste2.org/p/4130"&gt;automata.py&lt;/a&gt;&lt;br /&gt;Vemos que la función recibe una vista como parámetro. Viene a ser algo así como un patrón visitante venido a menos.&lt;br /&gt;Por último, tenemos que generar la aplicación y hereder de QMainWindow, relaizar los connects y ponerle un splash...&lt;br /&gt;&lt;div style="border: 1px solid rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#! /usr/bin/python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# *-* encoding: utf-8 *-*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Autor: Nahuel Deofossé (c) 2007&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Licencia: GPL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Todo PyQt4 :)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; PyQt4.Qt &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Generado a través del editor de designar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# cuando se actualiza el GUI, se debe correr Make para que&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# se transformen en código&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; interfase &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Ui_MainWindow&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Para los argumentos de linea de entrada&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; sys&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Todas las definiciones del automata que hemos separado en otro modulo (py)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; automata &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ejecutar_automata&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Algunas funciones utiles&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Calculadora&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;QApplication&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''Aplicacion calculadora simple'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __init__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;argumentos&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        QApplication.__init__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;argumentos&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        splash_pxmap &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QPixmap&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"./resources/splash.png"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        splash &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QSplashScreen&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;splash_pxmap&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        splash.show&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ventana &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; VentanaCalculadora&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ventana.show&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        splash.finish&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ventana&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.exec_&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; VentanaCalculadora&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;QMainWindow, Ui_MainWindow&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''GUI de la calculadora.'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    estado &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"en_cero"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# De acuerdo a los estados del automata&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    operacion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __init__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, padre &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;None&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''Constructor de la ventana'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        QMainWindow.__init__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, padre&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.setupUi&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.connect&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.actionSalir, SIGNAL&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"triggered()"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, qApp.&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;exit&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Conectamos los digitos&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;for&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; i &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;in&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_1, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_2,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_3, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_4,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_5, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_6,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_7, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_8,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_9, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.btn_digit_0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;                    &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;]:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.connect&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;i, SIGNAL&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"clicked()"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.in_digito&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Ahora conectamos las operaciones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; in_digito&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''Pulsado de un digito'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        num &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.sender&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.objectName&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()[-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;num, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; on_btn_op_add_pressed&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"+"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; on_btn_op_sub_pressed&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; on_btn_op_mul_pressed&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"*"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; on_btn_op_div_pressed&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"/"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; on_btn_op_res_pressed&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"="&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; on_btn_clear_pressed&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        ejecutar_automata&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"c"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Funciones que llama el automata&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; actualizar&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''Agrega un caracter al display '''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.setText&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.text&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; c &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; establecer&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''Establece el valor del display'''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.setText&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; operar&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;pass&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; almacenar&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;float&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.text&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; guardar_op&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.operacion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; c&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; operar&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        result &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor2 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;float&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.text&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.operacion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"+"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            result &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;elif&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.operacion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"-"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            result &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;elif&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.operacion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"/"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            result &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;elif&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.operacion &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"*"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            result &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;else&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Nada"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.setText&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;str&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;result&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; limpiar&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, c&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.lineResultado.setText&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"0"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.valor &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __name__ &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"__main__"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    app &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Calculadora&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;sys.argv&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Como verán, el código es muy simple y corto. Se puede extender con facilidad.&lt;br /&gt;Hemos visto varias cosas interesantes de Python y de PyQt.&lt;br /&gt;Un diagrama, de lo que sucede sería como el siguietnte:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RoQ5km3NZwI/AAAAAAAAAKY/fAQRkeLlVrM/s1600-h/g8033.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RoQ5km3NZwI/AAAAAAAAAKY/fAQRkeLlVrM/s400/g8033.png" alt="" id="BLOGGER_PHOTO_ID_5081249580650948354" border="0" /&gt;&lt;/a&gt;En el rectángulo verde vemos el conjunto de los eventos, el rectángulo rojo es el autómta y sobre la esquina superior derecha, el rectángulo naranja es el estado que se mantiene en la vista... y las funciones que cuelgan, son las que el autómata utiliza como interface para modificar el estado de la vista...&lt;br /&gt;Finalmente, habrán notado que he mezclado el estado (modelo) con la vista, en este caso, generar una separación complicaba las cosas -llevando las cosas fuera del scope de lo que quería mostrar-.&lt;br /&gt;&lt;br /&gt;Si quieren el código completo, envienme un mail a&lt;br /&gt;&lt;a alt="Disculpen la calidad de la imagen :(" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RoM47m3NZvI/AAAAAAAAAKQ/xkcHMPXIyyQ/s1600-h/logo1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RoM47m3NZvI/AAAAAAAAAKQ/xkcHMPXIyyQ/s400/logo1.gif" alt="" id="BLOGGER_PHOTO_ID_5080967401299601138" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4781159928019899367?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4781159928019899367/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4781159928019899367' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4781159928019899367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4781159928019899367'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/06/creacin-de-una-calculadora-con-python-y.html' title='Creación de una calculadora con Python y PyQt4'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/RoLfHm3NZtI/AAAAAAAAAKA/2g-dmdY0tMw/s72-c/edicion1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3401859868418917255</id><published>2007-06-07T14:05:00.000-07:00</published><updated>2007-06-07T15:28:17.338-07:00</updated><title type='text'>Virtualización Libre</title><content type='html'>Luego de ser usuario de VMWare por algún tiempo, decidí probar VirtualBox, la cual, venía en cómodos deb's y hoy ya con repo propio.&lt;br /&gt;La instalación fue muy sencilla, constando solo de un dpkg -i. Solito compiló sus modulos, los instaló sin chistar, aún con mi kernel altamente patchado.&lt;br /&gt;La interfase (en Qt, haaaaaaaaaa :) ) es muy clara, y la instalación del SO huésped es muy sencilla.&lt;br /&gt;Les voy dejando algunas imágenes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/Rmh2fiaHJ0I/AAAAAAAAAIs/Rdi3J3G3_kU/s1600-h/vbox_2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/Rmh2fiaHJ0I/AAAAAAAAAIs/Rdi3J3G3_kU/s400/vbox_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5073435264417212226" border="0" /&gt;&lt;/a&gt;Más tarde&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/Rmh27SaHJ2I/AAAAAAAAAI8/X46kFvEXiyI/s1600-h/vbox_4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/Rmh27SaHJ2I/AAAAAAAAAI8/X46kFvEXiyI/s400/vbox_4.jpg" alt="" id="BLOGGER_PHOTO_ID_5073435741158582114" border="0" /&gt;&lt;/a&gt;Más tarde...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/Rmh3IyaHJ3I/AAAAAAAAAJE/Acq75f4n6p8/s1600-h/vbox_5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/Rmh3IyaHJ3I/AAAAAAAAAJE/Acq75f4n6p8/s400/vbox_5.jpg" alt="" id="BLOGGER_PHOTO_ID_5073435973086816114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Más tarde, no cometería el atroz error de usar IE, así que...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/Rmh3YiaHJ4I/AAAAAAAAAJM/uK7KjZCoM9Q/s1600-h/vbox_6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/Rmh3YiaHJ4I/AAAAAAAAAJM/uK7KjZCoM9Q/s400/vbox_6.jpg" alt="" id="BLOGGER_PHOTO_ID_5073436243669755778" border="0" /&gt;&lt;/a&gt;Uno de los Shot que utilicé para la charla de SVN/trac que dimos ayer en la facu...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/Rmh4FyaHJ5I/AAAAAAAAAJU/5z4FiQ5WmoE/s1600-h/vbox_7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/Rmh4FyaHJ5I/AAAAAAAAAJU/5z4FiQ5WmoE/s400/vbox_7.jpg" alt="" id="BLOGGER_PHOTO_ID_5073437021058836370" border="0" /&gt;&lt;/a&gt;Por úlitmo, hoy actualizada,  vía &lt;span style="font-weight: bold;"&gt;apt&lt;/span&gt; la última version, 1.4&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/Rmh4GSaHJ6I/AAAAAAAAAJc/AQ0z-aaKCBo/s1600-h/vbox_9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/Rmh4GSaHJ6I/AAAAAAAAAJc/AQ0z-aaKCBo/s400/vbox_9.jpg" alt="" id="BLOGGER_PHOTO_ID_5073437029648770978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="border-style: solid; border-color: rgb(0, 0, 0) rgb(34, 34, 34) rgb(0, 0, 0) rgb(0, 0, 0); border-width: 1px 2px 1px 1px; margin: 2px; padding: 2px; background: rgb(221, 221, 221) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Mejor que VMWare? En velocidad es un poco más lenta, casi imperceptible, pero tiene muchas comodidades que la hacen más accesible para el usuario poco experimentado. Por ejemplo, el administrador de discos, que nos permite intercambiar los discos asignados a una máquina virtual con otra.&lt;br /&gt;Creo que vale la pena probarla. Quizás para muchos el factor de desición es que es descarga gratuita!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RmiGUyaHJ7I/AAAAAAAAAJk/-LasuW069h4/s1600-h/vbox_10.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RmiGUyaHJ7I/AAAAAAAAAJk/-LasuW069h4/s400/vbox_10.jpg" alt="" id="BLOGGER_PHOTO_ID_5073452671919663026" border="0" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.virtualbox.org/" target="_blank"&gt;&lt;b&gt;Ir al sitio &gt;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3401859868418917255?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3401859868418917255/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3401859868418917255' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3401859868418917255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3401859868418917255'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/06/virtualizacin-libre.html' title='Virtualización Libre'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/Rmh2fiaHJ0I/AAAAAAAAAIs/Rdi3J3G3_kU/s72-c/vbox_2.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-363275984372367929</id><published>2007-05-16T21:31:00.000-07:00</published><updated>2007-05-16T22:23:12.878-07:00</updated><title type='text'>Opensource Flash</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RkvdH3XSfQI/AAAAAAAAAIk/brpjGJ0D9D0/s1600-h/os_flash.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RkvdH3XSfQI/AAAAAAAAAIk/brpjGJ0D9D0/s400/os_flash.jpg" alt="" id="BLOGGER_PHOTO_ID_5065385333098708226" border="0" /&gt;&lt;/a&gt;Esta es una pagina que abrió hace poco y trata sobre las distintas alternativas libres a la plataforma &lt;strike&gt;Macromedia&lt;/strike&gt; Adobre Flash. Es interesante para la gente que se dedica a los multimedios, acá les dejo el Link: &lt;a href="http://www.osflash.org/"&gt;http://www.osflash.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-363275984372367929?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/363275984372367929/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=363275984372367929' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/363275984372367929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/363275984372367929'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/opensource-flash.html' title='Opensource Flash'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/RkvdH3XSfQI/AAAAAAAAAIk/brpjGJ0D9D0/s72-c/os_flash.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7717266143541129016</id><published>2007-05-15T15:41:00.000-07:00</published><updated>2007-05-15T16:59:36.849-07:00</updated><title type='text'>PyQt en Windows</title><content type='html'>La instalación de PyQt4 en mi Debian Sid no tuvo mayores inconvenientes, es más, era uno de lo s paquetes que había instalado para correr algunos scripts de SuperKaramba &lt;span style="font-size:85%;"&gt;(si, ya se PyQt3, pero bueno, cuando fui a Synpatics vi que tenía tambien la version 4)&lt;br /&gt;&lt;span style="font-size:100%;"&gt;A raíz de una inquietud que me surgió de las complicaciones que tuvo Latuaro para compilar PyQt, decidí ver que tan complicado era.&lt;br /&gt;&lt;div style="border: 1px dashed black; margin: 3px; padding: 10px; background: rgb(238, 238, 238) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Notar que es una instalación de Qt/C++ al comienzo, la parte de PyQt son los últimos pasos.&lt;br /&gt;&lt;/div&gt;Vamos por Qt...&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;Bajé primero MinGW (que ahora es tipo Cygwin, te bajas un exe chiquito, y cuando lo ejecutas te baja gcc, g++, make, etc. solito de internet, hice una instalación &lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;full&lt;/span&gt;). Luego me daría cuenta que no era necesario, pero bueno, yo creía que había que compilar algo...&lt;br /&gt;Para los que no conozcan MinGW, es un port de gcc a windows, similar a cygwin.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Al momento de la ejecutar este &lt;span style="color: rgb(0, 0, 102);"&gt;MinGW-5.1.2.exe&lt;/span&gt; me advierte de que hay una versión más nueva, no le hice caso, después de todo, acababa de bajarlo!) &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;Luego bajé la versión _binaria_ de Qt para windows(&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;qt-win-opensource-4.2.3-mingw.exe&lt;/span&gt;), en la pagina de Trolltech, dije que deseaba realizar desarrollo Open Source, hay que fijarse que sea la que termina en &lt;span style="color: rgb(0, 0, 102);"&gt;-mingw.exe&lt;br /&gt;&lt;/span&gt;Para varias bajé Vim 7.1 y Mc, aunque nada pude hacer contra la consola antinatural de windows, que ni de tamaño se puede cambiar con facilidad :(&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;Comienza la instalación (de Qt), me pregunta donde está MinGW, se lo apunto (C:\mingw), me dice que la versión que soporta es la 3.2, luego avisa que no encuentra w32api.h. Pero el archivo está, obviamente que con el nuevo estadar de C++, es decir, sin el .h final. Despues de eso la instalacion termina sin problema, y me genera en el menú inicio los accesos al diseñador, lingüista, asistente, etc. Y un par de bat para meter las variables de Qt en el Path. &lt;span style="color: rgb(255, 0, 0);"&gt;Tomé todas las variables y las puse en el Path del sistema, este sería el paso que haría a la versión compilada de PyQt4 funcionar.&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;Así quedaron las variables de entorno:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;ALLUSERSPROFILE=C:\Documents and Settings\All Users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;APPDATA=C:\Documents and Settings\defo\Datos de programa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CLASSPATH=.;C:\Archivos de programa\QuickTime\QTSystem\QTJava.zip&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CLIENTNAME=Console&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CommonProgramFiles=C:\Archivos de programa\Archivos comunes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;COMPUTERNAME=YGGDRASIL-GHOST&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ComSpec=C:\WINDOWS\system32\cmd.exe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FP_NO_HOST_CHECK=NO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;HOMEDRIVE=C:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;HOMEPATH=\Documents and Settings\defo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LANGUAGE=es&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LOGONSERVER=\\YGGDRASIL-GHOST&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;MCC_INCLUDE=C:\MCC18\h;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;MCHOME=C:\MC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;NUMBER_OF_PROCESSORS=1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;OS=Windows_NT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Path=C:\MCC18\mpasm;C:\MCC18\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\Syste&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;m32\Wbem;C:\Archivos de programa\QuickTime\QTSystem\;C:\MCC18\mpasm;C:\MCC18\bin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;;C:\Python25;C:\MinGW\bin;C:\MCC18\mpasm;C:\MCC18\bin;C:\Python25;C:\MinGW\bin;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;C:\Archivos de programa\Vim\vim71";C:\Qt\4.2.3\bin;C:\MinGW\bin;C:\Python25\Lib\&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;idlelib&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PROCESSOR_ARCHITECTURE=x86&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PROCESSOR_IDENTIFIER=x86 Family 15 Model 47 Stepping 0, AuthenticAMD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PROCESSOR_LEVEL=15&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PROCESSOR_REVISION=2f00&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ProgramFiles=C:\Archivos de programa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PROMPT=$P$G&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;QMAKESPEC=win32-g++&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;QTDIR=C:\Qt\4.2.3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;QTJAVA=C:\Archivos de programa\QuickTime\QTSystem\QTJava.zip&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SESSIONNAME=Console&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SystemDrive=C:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SystemRoot=C:\WINDOWS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TEMP=C:\DOCUME~1\defo\CONFIG~1\Temp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TMP=C:\DOCUME~1\defo\CONFIG~1\Temp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;USERDOMAIN=YGGDRASIL-GHOST&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;USERNAME=defo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;USERPROFILE=C:\Documents and Settings\defo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;windir=C:\WINDOWS&lt;br /&gt;&lt;span style=";font-family:times new roman;font-size:100%;"  &gt;Probé una pequeña app en Qt y funcionó perfectamente.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;Luego fui a por PyQt de la pagina de &lt;a href="http://www.riverbankcomputing.co.uk/pyqt/download.php"&gt;Riverbank&lt;/a&gt; y bajé la version binaria (no el codigo fuente, ni SIP, me advierte que no incluye Qt, pero es algo que ya tengo instalado).&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;Luego de instalarlo, realizé los imports, como hemos visto en los anteriores posts y todo funcionó perfectamente. Como podrán ver:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RkpIBLSGGMI/AAAAAAAAAIU/hi2sIx9na4g/s1600-h/Qt_win.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RkpIBLSGGMI/AAAAAAAAAIU/hi2sIx9na4g/s320/Qt_win.jpg" alt="" id="BLOGGER_PHOTO_ID_5064939915977300162" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;Espero que les halla servido como para orientarse, y tengan en cuenta que esta es una instalación de desarrollo, para el end-user se puede automatizar todo el proceso.&lt;br /&gt;Finalmente les dejo las URLs de la documentación de PyQt. Es del propio sitio de Riverbank:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Documentación general: &lt;a href="http://www.riverbankcomputing.com/Docs/PyQt4/pyqt4ref.html"&gt;http://www.riverbankcomputing.com/Docs/PyQt4/pyqt4ref.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Referencia de las clases: &lt;a href="http://www.riverbankcomputing.com/Docs/PyQt4/html/classes.html"&gt;http://www.riverbankcomputing.com/Docs/PyQt4/html/classes.html&lt;/a&gt;&lt;br /&gt;...y recuerden que pueden sacar mucho del assistant!&lt;br /&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/20311093-7717266143541129016?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7717266143541129016/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7717266143541129016' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7717266143541129016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7717266143541129016'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/pyqt-en-windows.html' title='PyQt en Windows'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/RkpIBLSGGMI/AAAAAAAAAIU/hi2sIx9na4g/s72-c/Qt_win.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8644092051308277008</id><published>2007-05-13T16:14:00.000-07:00</published><updated>2007-05-13T16:19:41.281-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Decoradores en Python</title><content type='html'>Es una interesante característica que incluye Python 2.4 en adelante.&lt;br /&gt;Veamos un pequeño ejemplo:&lt;br /&gt;&lt;pre style='overflow-x: scroll;'&gt;&lt;br /&gt;&lt;span style="font-style: italic;color: #808080;"&gt;#! /usr/bin/python&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #ff00ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; time&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; decorador&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;funcion&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; nueva&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;(*&lt;/span&gt;&lt;span style="color: #000000;"&gt;lista_args&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    tiempo1 &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; time.time&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    valor &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; funcion&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;(*&lt;/span&gt;&lt;span style="color: #000000;"&gt;lista_args&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    tiempo2 &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; time.time&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    delta &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tiempo2 &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; tiempo1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"La funcion '&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;%s&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;()' tardo en ejecutarse &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;%s&lt;/span&gt;&lt;span style="color: #dd0000;"&gt; segundos"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;funcion.func_name, delta&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; valor&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; nueva&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;@decorador&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; func&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;a, b&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold;color: #000000;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; a &lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; b&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;func&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;3&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Como resultado produce:&lt;br /&gt;&lt;pre style='overflow-x: scroll;'&gt;&lt;br /&gt;[nahuel@valhalla workspace]$ python deco.py&lt;br /&gt;La funcion 'func()' tardo en ejecutarse 4.05311584473e-06 segundos&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hay mucho más en &lt;a href="http://www-128.ibm.com/developerworks/linux/library/l-cpdecor.html?ca=dgr-lnxw57python" target="_blank"&gt;Charming Python: Decorators make magic easy&lt;/a&gt; (en inglés)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8644092051308277008?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8644092051308277008/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8644092051308277008' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8644092051308277008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8644092051308277008'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/decoradores-en-python.html' title='Decoradores en Python'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2441942410109328495</id><published>2007-05-13T15:35:00.000-07:00</published><updated>2007-05-13T16:01:09.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>Conectando eventos en PyQt</title><content type='html'>Ahora que conocemos los rudimentos de PyQt, es hora de hacer algo cuando el usuario interactúa con la GUI.&lt;br /&gt;Para esto usaremos el &lt;span style="font-weight: bold;"&gt;connect&lt;/span&gt; (método de QObject).&lt;br /&gt;Veamos el siguiente ejemplo, (ha sido lo más simple que se me ha ocurrido&lt;br /&gt;Como verán esta vez no lo hice desde la consola sino desde el editor de texto (de donde saqué los colores bonitos).&lt;br /&gt;&lt;pre style="overflow-x: scroll;"&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#! /usr/bin/python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;Un ejemplo de conexion de eventos en PyQt4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;'''&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; PyQt4.QtCore &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; PyQt4.QtGui &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; sys&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Ventana&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;QWidget&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __init__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    QWidget.__init__&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;args&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Redimencionar la ventana&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.resize&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;QSize&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;QRect&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;400&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;110&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.size&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()))&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;#.expandedTo(Form.minimumSizeHint()))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    boton &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QPushButton&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Pulsame"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# Agrandar el boton&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    boton.setGeometry&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;QRect&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;100&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;20&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;80&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;27&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    QWidget.connect&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;boton, SIGNAL&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"clicked()"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.un_metodo &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# ahora lo conectamos con otro&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; un_metodo&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"hola"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# algo que quizas se podría llamar main()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; principal&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;():&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  app &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; QApplication&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;sys.argv&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  v &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Ventana&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  v.show&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  app.exec_&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(128, 128, 128);"&gt;# lo que se ejecuta cuando llamamos al script&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; __name__ &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;==&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"__main__"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  principal&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;()&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;A esta altura comenzarán a chocarse, si es que ya no lo han hecho con no conocer los métodos de las clases de Qt, a veces &lt;b&gt;dir()&lt;/b&gt;, &lt;b&gt;type()&lt;/b&gt; y el método &lt;b&gt;__doc__&lt;/b&gt; de los objetos no es suficiente y requerimos algo más solido.&lt;br /&gt;Para esto está QtAssistant (o simplemente assistant, o assistant-qt4) desde la consola. Es "la ayuda" que sale cuando pulsamos &lt;b&gt;F1&lt;/b&gt; sobre un &lt;b&gt;widget&lt;/b&gt; en el diseñador.&lt;br /&gt;Para finalizar los invito a volver a la consola y ver que interesante idea de modularidad tiene python (digamos que el script de más arriba se llama &lt;span style="font-family: courier new;"&gt;eje.py&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;pre style='overflow-x: scroll;'&gt;&lt;br /&gt;[nahuel@valhalla Documents]$ python&lt;br /&gt;Python 2.4.4 (#2, Jan 13 2007, 17:50:26)&lt;br /&gt;[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; import eje&lt;br /&gt;&gt;&gt;&gt; eje.principal()&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero que ya le estén agarrando el gustito! Les advierto que es muy adictivo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-2441942410109328495?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2441942410109328495/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2441942410109328495' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2441942410109328495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2441942410109328495'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/conectando-eventos-en-pyqt.html' title='Conectando eventos en PyQt'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4042990979591678144</id><published>2007-05-13T14:46:00.000-07:00</published><updated>2007-05-13T15:33:22.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>PyQt, usando interfases creadas con Designer</title><content type='html'>Una vez que creamos un archivo &lt;span style="font-weight: bold;"&gt;.ui&lt;/span&gt; en QtDesigner, existen dos formas de usarlo en nuestra aplicación:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Compilarlo con &lt;span style="font-weight: bold;"&gt;pyuic &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cargarlo dinámicamente mediante el modulo &lt;span style="font-weight: bold;"&gt;PyQt4.uic&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Vemos el punto &lt;span style="font-weight: bold;font-size:180%;" &gt;1&lt;/span&gt;. Vamos a la consola, en el directorio donde hallamos guardado el &lt;span style="font-weight: bold;"&gt;.ui &lt;/span&gt;con el Designer, ejecutamos:&lt;br /&gt; &lt;span style="font-weight: bold;font-family:courier new;" &gt;pyuic mi_archivo.ui&lt;/span&gt;&lt;br /&gt;Si tienen ambas versiones de PyQt, quizás el comando sea &lt;span style="font-weight: bold;"&gt;pyuic4&lt;/span&gt;, si les da el error:&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;pyuic: File generated with too recent version of Qt Designer (4.0 vs. 3.3.7)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Vemos que todo el código es lanzado por la salida estándar, para eso usaremos el operador &lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;&gt;&lt;/span&gt;&lt;/span&gt; para mostrarlo:&lt;br /&gt; &lt;span style="font-weight: bold;font-family:courier new;" &gt;pyuic mi_archivo.ui &gt; mi_clase.py&lt;/span&gt;&lt;br /&gt;Muy bien, ahora tendremos las clase, mi_clase que tendrá en su interior la clase que inicializa la interfase sobre el widget que hemos elegido como base (&lt;span style="font-family:courier new;"&gt;QDialog, QWidget, QMainWidget...&lt;/span&gt;).&lt;br /&gt;Ahora desde la consola python en el mismo directorio podemos hacer:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(0, 0, 0); background: rgb(243, 255, 251) none repeat scroll 0% 50%; overflow-x: scroll; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;[nahuel@valhalla ~]$ python&lt;br /&gt;Python 2.4.4 (#2, Jan 13 2007, 17:50:26)&lt;br /&gt;[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; from PyQt4.QtGui import *&lt;br /&gt;&gt;&gt;&gt; from PyQt4.QtCore import *&lt;br /&gt;&gt;&gt;&gt; import mi_clase&lt;br /&gt;&gt;&gt;&gt; dir(mi_clase)&lt;br /&gt;['QtCore', 'QtGui', 'Ui_Form', '__builtins__', '__doc__', '__file__', '__name__', 'sys']&lt;br /&gt;&gt;&gt;&gt; class MiVentana(QWidget, mi_clase.Ui_Form):&lt;br /&gt;...     """ Heredo del Widget y de la clase que compile con pyuic """&lt;br /&gt;...     def __init__(self, *args):&lt;br /&gt;...             # Lo primero es llamar al padre&lt;br /&gt;...             QWidget.__init__(self, *args)&lt;br /&gt;...             # ahora uso un metodo que define Ui_Form para generar la interfase&lt;br /&gt;...             self.setupUi(self)&lt;br /&gt;...             print "Creacion de una ventana" # un mensajito como para avisar&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; # ahora creamos el contexto de aplicacion Qt (QApplication)&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; import sys&lt;br /&gt;&gt;&gt;&gt; app = QApplication(sys.argv)&lt;br /&gt;&gt;&gt;&gt; v = MiVentana()&lt;br /&gt;Creacion de una ventana&lt;br /&gt;&gt;&gt;&gt; # ohhh, magico, no?&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; v.show()&lt;br /&gt;&gt;&gt;&gt; # a correr.......&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; app.exec_()&lt;br /&gt;0&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;y obtenemos esto:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RkeNWLSGGKI/AAAAAAAAAIE/ARJgyqdG6_4/s1600-h/qtdes3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RkeNWLSGGKI/AAAAAAAAAIE/ARJgyqdG6_4/s320/qtdes3.jpg" alt="" id="BLOGGER_PHOTO_ID_5064171718126737570" border="0" /&gt;&lt;/a&gt;Bueno, aquí también les dejo &lt;a href="http://paste2.org/p/3209" target="_blank"&gt;el UI&lt;/a&gt;, que como verán es un XML.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Ahora vamos con el método dinámico(&lt;span style="font-weight: bold;font-size:180%;" &gt;2&lt;/span&gt;), ya que se han tragado estos ultimos 3 posts sobre PyQt vamos a comenzar a ir más rápdio, si se complica me avisan, ok?&lt;br /&gt;&lt;pre style="border: 1px solid rgb(0, 0, 0); background: rgb(243, 255, 251) none repeat scroll 0% 50%; overflow-x: scroll; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;[nahuel@valhalla ~]$ python&lt;br /&gt;Python 2.4.4 (#2, Jan 13 2007, 17:50:26)&lt;br /&gt;[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; from PyQt4.QtCore import *&lt;br /&gt;&gt;&gt;&gt; from PyQt4.QtGui import *&lt;br /&gt;&gt;&gt;&gt; # El modulo compilador de UIs&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; from PyQt4 import uic&lt;br /&gt;&gt;&gt;&gt; # Veamos que tiene&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; dir(uic)&lt;br /&gt;['Compiler', 'PYQT_VERSION_STR', 'StringIO', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__path__', '_display_code', '_header', 'compileUi', 'compiler', 'exceptions', 'indenter', 'loadUi', 'loadUiType', 'objcreator', 'properties', 'time', 'uiparser']&lt;br /&gt;&gt;&gt;&gt; # Veamos la documentacion del metodo que usaremos...&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; uic.loadUi.__doc__&lt;br /&gt;'loadUi(uifile, baseinstance=None) -&gt; widget\n\n    Load a Qt Designer .ui file and return an instance of the user interface.\n\n    uifile is a file name or file-like object containing the .ui file.\n    baseinstance is an optional instance of the Qt base class.  If specified\n    then the user interface is created in it.  Otherwise a new instance of the\n    base class is automatically created.\n    '&lt;br /&gt;&gt;&gt;&gt; # Bueno, vamos a probarlo&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; import sys&lt;br /&gt;&gt;&gt;&gt; app = QApplication(sys.argv)&lt;br /&gt;&gt;&gt;&gt; ventana = uic.loadUi('./mi_clase.ui')&lt;br /&gt;&gt;&gt;&gt; ventana.show()&lt;br /&gt;&gt;&gt;&gt; app.exec_()&lt;br /&gt;0&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;&lt;/pre&gt;Espero que se hallan divertido viendo la flexibilidad que tiene PyQt para generar interfases.&lt;br /&gt;Si están dudando que mecanismo usar el dinámico o el compilado, eso va a depender de que tan frecuentemente cambien la GUI. Los más osados podrían recompilar dinámicamente su &lt;span style="font-weight: bold;"&gt;.ui&lt;/span&gt; y de esa manera emular un Makefile...&lt;br /&gt;Bueno, no les complico más, hagan los ejemplos, y cualquier problema me avisan,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4042990979591678144?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4042990979591678144/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4042990979591678144' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4042990979591678144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4042990979591678144'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/pyqt-usando-interfases-creadas-con.html' title='PyQt, usando interfases creadas con Designer'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/RkeNWLSGGKI/AAAAAAAAAIE/ARJgyqdG6_4/s72-c/qtdes3.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8638756267606281900</id><published>2007-05-13T14:15:00.000-07:00</published><updated>2007-05-13T19:16:17.137-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>PyQt un poco más allá</title><content type='html'>Bueno, seguiré explicando lo que he ido aprendiendo sobre &lt;b&gt;PyQt&lt;/b&gt;.&lt;br /&gt;Existe un editor de interfases para Qt, se llama QtDesigner, aunque el binario suele llamarse simplemente &lt;i&gt;designer&lt;/i&gt; (ojo si tienen las dos versiones de 3 y 4, pueden tener más de uno).&lt;br /&gt;Así es como se ve:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RkeAtbSGGHI/AAAAAAAAAHs/7-AsHp-5P10/s1600-h/qtdes.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RkeAtbSGGHI/AAAAAAAAAHs/7-AsHp-5P10/s320/qtdes.jpg" alt="" id="BLOGGER_PHOTO_ID_5064157823907534962" border="0" /&gt;&lt;/a&gt;y lo que nos permite es diagramar visualmente nuestras ventanas en el modo edito de ventanas:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RkeEhrSGGII/AAAAAAAAAH0/hw9TfAC6pgQ/s1600-h/qtdes1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RkeEhrSGGII/AAAAAAAAAH0/hw9TfAC6pgQ/s320/qtdes1.jpg" alt="" id="BLOGGER_PHOTO_ID_5064162020090583170" border="0" /&gt;&lt;/a&gt;y nos permite conectar eventos entre elementos de la GUI en el modo señales y zóclos:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RkeFBLSGGJI/AAAAAAAAAH8/VeAXKX3KaIM/s1600-h/qtdes2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RkeFBLSGGJI/AAAAAAAAAH8/VeAXKX3KaIM/s320/qtdes2.jpg" alt="" id="BLOGGER_PHOTO_ID_5064162561256462482" border="0" /&gt;&lt;/a&gt;En este modo podemos conectar una evento de un componente visual (widget) con un zócalo de  otro (por ejemplo, que al pulsar un botón se cierre la ventana).&lt;br /&gt;Les recomiendo &lt;a href="http://www.trolltech.com/products/qt/learnmore/video/demos/browser" target="_blank"&gt;este video para que vean &lt;b&gt;visualmente&lt;/b&gt;&lt;/a&gt; el tema de la conexión de eventos.&lt;br /&gt;No teman a que escriben un poco de código en C++, al final, esto no se aplica a PyQt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8638756267606281900?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8638756267606281900/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8638756267606281900' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8638756267606281900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8638756267606281900'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/pyqt-un-poco-ms-all.html' title='PyQt un poco más allá'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/RkeAtbSGGHI/AAAAAAAAAHs/7-AsHp-5P10/s72-c/qtdes.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2996973779658081715</id><published>2007-05-13T13:25:00.000-07:00</published><updated>2007-05-13T14:14:28.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='pyqt'/><title type='text'>Python y Qt, primeros pasos</title><content type='html'>Luego de la charla del Lug sobre Desarrollo derápido de aplicaciones web con Python/Django, he tenido un poco de tiempo para incursionar el el terreno de las GUIs y Python, a raíz de que las GUIs en Java con SWING y SWT han sido un buen fiasco, al menos para mi.&lt;br /&gt;Hay muchos toolkits para generar GUIs, pero me decanté por PyQt debido principalmente a que tenía un poquito de experiencia con C++ y Qt (la cual me parece muy buena por su velocidad y facilidad de aprendizaje).&lt;br /&gt;PyQt no goza de tanta documentación (específica de Python) como otros toolkits para ventanas como PyGTK o wxPython, pero en principio no es un problema ya que PyQt es es si un wrapper(envoltura) de Qt/C++ (es decir, para una clase QWidget en C++ tenemos un QWidget en Python, etc.).&lt;br /&gt;Antes de seguir, tengo que advertirles que PyQt3 es ligeramente distinto a PyQt4, recomiendo este último en lo posible debido a las nuevas características que se han añadido en Qt4, sobre todo en la versión 4.2.&lt;br /&gt;&lt;br /&gt;Bueno, ahora vamos con un ejemplo sencillo:&lt;br /&gt;&lt;pre style='font-size=10pt; font-weight: bold;'&gt;&lt;br /&gt;[nahuel@valhalla ~]$ python&lt;br /&gt;Python 2.4.4 (#2, Jan 13 2007, 17:50:26)&lt;br /&gt;[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2&lt;br /&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;br /&gt;&gt;&gt;&gt; from PyQt4.QtCore import *&lt;br /&gt;&gt;&gt;&gt; from PyQt4.QtGui import *&lt;br /&gt;&gt;&gt;&gt; import sys&lt;br /&gt;&gt;&gt;&gt; # los dos primeros imports son de Qt y este ultimo es para obtener los argumentos&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; # Ahora creamos la apliacion&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; app = QApplication(sys.argv)&lt;br /&gt;&gt;&gt;&gt; ventana = QWidget()&lt;br /&gt;&gt;&gt;&gt; ventana.show()&lt;br /&gt;&gt;&gt;&gt; # Ahora le damos las riendas a Qt&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; app.exec_()&lt;br /&gt;0&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/20311093-2996973779658081715?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2996973779658081715/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2996973779658081715' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2996973779658081715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2996973779658081715'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/05/python-y-qt-primeros-pasos.html' title='Python y Qt, primeros pasos'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-1936609209777170169</id><published>2007-04-07T18:48:00.000-07:00</published><updated>2007-04-07T19:21:36.188-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inner blur'/><category scheme='http://www.blogger.com/atom/ns#' term='inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='effect'/><title type='text'>Sombra Interior en Inkscape (aka Inner Shadow )</title><content type='html'>La aparición de las máscaras y el desenfoque (blur) en Inkscape ya permiten varias cosas bastante avanzadas, como en este caso la sombra interior.&lt;br /&gt;Veamos paso a paso como realizar este efecto.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RhhKjt14MFI/AAAAAAAAAGc/SA4WhfBeiBA/s1600-h/inkscape_1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RhhKjt14MFI/AAAAAAAAAGc/SA4WhfBeiBA/s320/inkscape_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5050868959557464146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El primer paso es iniciar Inkscape, en este caso estoy utilizando la version &lt;span style="font-weight: bold;"&gt;0.45.1&lt;/span&gt; compilada por mi sobre mi Debian Sid.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RhhK8N14MGI/AAAAAAAAAGk/5OZdD0dAyrA/s1600-h/inkscape_2.jpg"&gt;&lt;img style="border: 1px solid rgb(0, 0, 0); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RhhK8N14MGI/AAAAAAAAAGk/5OZdD0dAyrA/s320/inkscape_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5050869380464259170" border="0" /&gt;&lt;/a&gt;Vamos a realizar el efecto sobre una simple círculo, pero puede ser realizado sobre cualquier figura.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhLZ914MHI/AAAAAAAAAGs/f5hIhtN4Q5I/s1600-h/inkscape_3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhLZ914MHI/AAAAAAAAAGs/f5hIhtN4Q5I/s320/inkscape_3.jpg" alt="" id="BLOGGER_PHOTO_ID_5050869891565367410" border="0" /&gt;&lt;/a&gt;Bien, ya tenemos la figura, ahora vamos a crear una copia de esta mediante el atajo &lt;span style="font-weight: bold;"&gt;Control + D&lt;/span&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhLr914MII/AAAAAAAAAG0/Dx24kiS7Q0Y/s1600-h/inkscape_4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhLr914MII/AAAAAAAAAG0/Dx24kiS7Q0Y/s320/inkscape_4.jpg" alt="" id="BLOGGER_PHOTO_ID_5050870200803012738" border="0" /&gt;&lt;/a&gt;A esta copia, vamos a ajustarle los valores del borde. En este caso ajusto el color a negro. Una forma rápida de traer el dialogo de relleno y contorno es utilizar el atajo &lt;span style="font-weight: bold;"&gt;Control + Shift + F&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RhhL9t14MJI/AAAAAAAAAG8/AP3KHdrX47k/s1600-h/inkscape_5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RhhL9t14MJI/AAAAAAAAAG8/AP3KHdrX47k/s320/inkscape_5.jpg" alt="" id="BLOGGER_PHOTO_ID_5050870505745690770" border="0" /&gt;&lt;/a&gt;Además subo el grosor a 2 pixels.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhMO914MKI/AAAAAAAAAHE/aplMdPA0g_U/s1600-h/inkscape_6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhMO914MKI/AAAAAAAAAHE/aplMdPA0g_U/s320/inkscape_6.jpg" alt="" id="BLOGGER_PHOTO_ID_5050870802098434210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego, utilizando el control de desenfoque aplicamos un poco de este efecto sobre la figura. Esto se puede realizar recien a partir de la versión 0.45 de Inkscape. Si no tienen esta versión no tendrán el control de desenfoque.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhM8914MLI/AAAAAAAAAHM/Ypo9y7V5hxc/s1600-h/inkscape_7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhM8914MLI/AAAAAAAAAHM/Ypo9y7V5hxc/s320/inkscape_7.jpg" alt="" id="BLOGGER_PHOTO_ID_5050871592372416690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora crearé una copia, mediante el atajo &lt;span style="font-weight: bold;"&gt;Control + D&lt;/span&gt;, y a esta le ajustaré los valores de relleno a blanco y eliminaré el borde.&lt;br /&gt;Una vez realizado esto seleccionaré la figura blanca que acabo de crear y la inmediata Inferior, mediante el atajo &lt;span style="font-weight: bold;"&gt;Shift + Control + Alt + Click&lt;/span&gt;. Si no se sienten a gusto, pueden hacerlo manualmente, recuerden que con &lt;span style="font-weight: bold;"&gt;Shift&lt;/span&gt; corren de a 10px, y con &lt;span style="font-weight: bold;"&gt;Control&lt;/span&gt; lo hacen en linea recta.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RhhOCt14MMI/AAAAAAAAAHU/KGqeP54We7I/s1600-h/inkscape_8.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RhhOCt14MMI/AAAAAAAAAHU/KGqeP54We7I/s320/inkscape_8.jpg" alt="" id="BLOGGER_PHOTO_ID_5050872790668292290" border="0" /&gt;&lt;/a&gt;Ahora desde el menú &lt;span style="font-weight: bold;"&gt;Objeto&lt;/span&gt;, utilizaré el submenñu &lt;span style="font-weight: bold;"&gt;Mascara-&gt;Aplicar&lt;/span&gt; para lograr que el circulo blanco, haga de máscara sobre el borde borroso, creando el efecto de borde interior.&lt;br /&gt;Es importante que tengamos seleccionados estos dos objetos, y solo estos dos objetos antes de aplicar la mascara. De todas formas el efecto es reversible.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RhhOxN14MNI/AAAAAAAAAHc/Jc9SYmyhQTg/s1600-h/inkscape_9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RhhOxN14MNI/AAAAAAAAAHc/Jc9SYmyhQTg/s320/inkscape_9.jpg" alt="" id="BLOGGER_PHOTO_ID_5050873589532209362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Finalmente, el efecto está logrado, en al figura le quite el relleno a la figura resultante de aplicar la máscara.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhQJ914MOI/AAAAAAAAAHk/RCr_vFoQuT0/s1600-h/inkscape_10.jpg"&gt;&lt;img style="border: 1px solid rgb(0, 0, 0); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RhhQJ914MOI/AAAAAAAAAHk/RCr_vFoQuT0/s320/inkscape_10.jpg" alt="" id="BLOGGER_PHOTO_ID_5050875114245599458" border="0" /&gt;&lt;/a&gt;Con ayuda de los gradientes podemos lograr efectos como los de estos ojitos.&lt;br /&gt;Espero que les halla servido!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-1936609209777170169?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/1936609209777170169/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=1936609209777170169' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1936609209777170169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/1936609209777170169'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/sombra-interior-en-inkscape-aka-inner.html' title='Sombra Interior en Inkscape (aka Inner Shadow )'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/RhhKjt14MFI/AAAAAAAAAGc/SA4WhfBeiBA/s72-c/inkscape_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8780471681329640092</id><published>2007-04-07T01:50:00.001-07:00</published><updated>2007-04-07T19:22:04.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='captcha'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Capthca de Django</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Una nota interesante sobre las conocidas imágenes &lt;a href="http://es.wikipedia.com/wiki/Captcha"&gt;Captcha&lt;/a&gt; en Django utilizando la librería de imágenes de Python (pil, en Debian y Ubuntu &lt;span style="font-weight: bold;font-size:small;color:violet;"  &gt;python-imaging&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rkblog.rk.edu.pl/w/p/django-and-captcha-images/#1"&gt;Captcha en Django&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8780471681329640092?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8780471681329640092/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8780471681329640092' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8780471681329640092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8780471681329640092'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/capthca-de-django.html' title='Capthca de Django'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6582666550355350684</id><published>2007-04-07T01:31:00.001-07:00</published><updated>2007-04-07T19:22:22.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='snippets'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Snippets para Django</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Buscando información sobre fixtures para django, encontré este sitio lleno de bocaditos, muy útil!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.djangosnippets.org/"&gt;DjangoSnippets&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-6582666550355350684?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6582666550355350684/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6582666550355350684' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6582666550355350684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6582666550355350684'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/snippets-para-django.html' title='Snippets para Django'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6488645885040809885</id><published>2007-04-06T18:00:00.001-07:00</published><updated>2007-04-07T19:22:55.697-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='googlevideo'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='techtalk'/><title type='text'>Diseño de lenguajes de domnio espcifico en Ruby</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Un DSL es un lenguaje de alto nivel, no necesariamente un lenguaje de programación completo, que permite al usuario no programador (gentilmente reverenciado como Bussiness User) ;-) realizar tareas especificas. Ejemplos son SQL, Excel, leguajes para presentaciones, etc.&lt;br /&gt;Hay un interesante ejemplo sobre un lenguaje de definición de dominos (URL's y su gerarquía).&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;embed flashvars="" src="http://video.google.com/googleplayer.swf?docId=-8103284744220333344&amp;hl=en" type="application/x-shockwave-flash" id="VideoPlayback" style="width: 400px; height: 326px;"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-6488645885040809885?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6488645885040809885/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6488645885040809885' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6488645885040809885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6488645885040809885'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/diseo-de-lenguajes-de-domnio-espcifico.html' title='Diseño de lenguajes de domnio espcifico en Ruby'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-6325180744070986648</id><published>2007-04-06T17:30:00.001-07:00</published><updated>2007-04-07T19:21:16.114-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='googlevideo'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Presentación de Django</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Esta es la presentación del &lt;a href="http://www.djangoproject.com/"&gt;framework Django&lt;/a&gt; por parte de uno de uno de sus autores.&lt;br /&gt;Es un poco vieja, pero no por eso menos interesante.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;embed flashvars="&amp;subtitle=on" src="http://video.google.com/googleplayer.swf?docId=-70449010942275062&amp;amp;hl=en" type="application/x-shockwave-flash" id="VideoPlayback" style="width: 400px; height: 326px;"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Como el video anterior, es un poco largo, así que les recomiendo que se lo bajen al disco.&lt;br /&gt;&lt;br /&gt;Estaba pensando, sería bueno tener estos videos, tageados con sus propias marcas, como una especie de DVD, con tags como "Introducción", "Background del proyecto", "Bla", "Bla", etc. Quizas se podría hacer con Matroska... Sería muy comodo, no? Cuantas veces pasa uno buscando una parte de un video, moviendo el slider de un lado para otro para encontrar una parte que vio y quiere mostrar...&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-6325180744070986648?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/6325180744070986648/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=6325180744070986648' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6325180744070986648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/6325180744070986648'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/presentacin-de-django.html' title='Presentación de Django'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4874336181220995228</id><published>2007-04-06T17:19:00.001-07:00</published><updated>2007-04-07T19:23:38.737-07: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='googlevideo'/><title type='text'>El cambio</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Luego de ver este video, me di cuenta que me estaba perdiendo de mucho al pensar que &lt;a title="flamewar.start() :P"&gt;todavía&lt;/a&gt; se pueden desarrollar aplicaciones web en PHP o J2EE de manera _rápida_ y _mantenible_&lt;br /&gt;&lt;br /&gt;Django captó mi atención, y es ahora mi principal motivación para aprender Python y no quedar rezagado en el mundo de los lenguajes dinámicos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed style="width: 400px; height: 326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=2939556954580527226&amp;amp;hl=en" flashvars=""&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si quieren bajar el video, y que pese unos pocos MBs menos, &lt;small&gt;(diagmos como 60% menos)&lt;/small&gt;, pueden usar &lt;a href="https://addons.mozilla.org/es-ES/firefox/addon/2254"&gt;UnPlug&lt;/a&gt; en conjunto con &lt;a href="https://addons.mozilla.org/es-ES/firefox/addon/201"&gt;DTA!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4874336181220995228?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4874336181220995228/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4874336181220995228' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4874336181220995228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4874336181220995228'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/el-cambio.html' title='El cambio'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7576461274075064794</id><published>2007-04-06T13:28:00.001-07:00</published><updated>2007-04-07T19:24:20.621-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='j2ee'/><category scheme='http://www.blogger.com/atom/ns#' term='turbogears'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Desarrollo de mejores aplicaciones Web</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;En estos días me he dado un paseo por Django, el framework de aplicaciones web que considero será una Killer App, ni bien llege a su version 1.0.&lt;br /&gt;&lt;br /&gt;Pero no quería hablarles de eso aún, sin antes un video de la evolución de los frameworks, que me ha pasado pablo y que me parece muy bueno, aunque lo notaran un tanto amarillista.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;embed style="width: 400px; height: 326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=6297126166376226181&amp;amp;hl=en" flashvars=""&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7576461274075064794?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7576461274075064794/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7576461274075064794' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7576461274075064794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7576461274075064794'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/desarrollo-de-mejores-aplicaciones-web_06.html' title='Desarrollo de mejores aplicaciones Web'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-520952528775200393</id><published>2007-04-05T23:38:00.001-07:00</published><updated>2007-04-07T19:24:50.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3 actos'/><category scheme='http://www.blogger.com/atom/ns#' term='steve jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='colacion'/><title type='text'>Stay Hungy! Stay Foolish!</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Quizas un poco viejo (si, ya son como dos años que han pasado), este es el magnífico discurso de Steve Jobs hacia la colación 2005 de la universidad de Stanford.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;embed style="width: 400px; height: 326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=3014637678488153340&amp;amp;hl=en" flashvars=""&gt;&lt;/embed&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Aquí las palabras del discurso &lt;a href="http://news-service.stanford.edu/news/2005/june15/jobs-061505.html"&gt;[Link]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-520952528775200393?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/520952528775200393/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=520952528775200393' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/520952528775200393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/520952528775200393'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/04/stay-hungy-stay-foolish.html' title='Stay Hungy! Stay Foolish!'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3290481470410866868</id><published>2007-03-17T20:38:00.000-07:00</published><updated>2007-03-17T20:52:20.975-07:00</updated><title type='text'>K3B llega a al version 1.0</title><content type='html'>K3b ha sido mi aplicación de grabación preferida, durante varios años. Debo admitir que a veces me ha dejado a pata, pero nada siempre a vuelto a funcionar, sin más, en este ya este longevo Debian, que tantas puñaladas se ha aguantado :P&lt;br /&gt;Finalmente, con un nuevo splash, como pueden ver en este shot&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/Rfy16NoKjkI/AAAAAAAAAGI/Ga7GIL-qqLg/s1600-h/k3b_kompile_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/Rfy16NoKjkI/AAAAAAAAAGI/Ga7GIL-qqLg/s320/k3b_kompile_1.png" alt="" id="BLOGGER_PHOTO_ID_5043105694443277890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora otro shot donde muestro su compilación en el comodísimo &lt;a href="http://www.kde-apps.org/content/show.php?content=30223"&gt;Kompile&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/Rfy2tNoKjlI/AAAAAAAAAGQ/w3jFICnSjXU/s1600-h/k3b_kompile.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/Rfy2tNoKjlI/AAAAAAAAAGQ/w3jFICnSjXU/s320/k3b_kompile.png" alt="" id="BLOGGER_PHOTO_ID_5043106570616606290" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3290481470410866868?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3290481470410866868/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3290481470410866868' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3290481470410866868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3290481470410866868'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/03/k3b-llega-al-version-10.html' title='K3B llega a al version 1.0'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/Rfy16NoKjkI/AAAAAAAAAGI/Ga7GIL-qqLg/s72-c/k3b_kompile_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8980352555318530158</id><published>2007-03-10T05:14:00.001-08:00</published><updated>2007-03-10T10:38:45.111-08:00</updated><title type='text'>Trackers en el sistema del Pinguino</title><content type='html'>Los trackers son programas de composición musical que aparecieron hace mucho mucho tiempo con los ordenadores &lt;a href="http://es.wikipedia.org/wiki/Commodore_Amiga"&gt;Amiga&lt;/a&gt;. A diferencia de los tradicionales compositores MIDI, o los estudios multitracks como CoolEdit, Audacity o Ardour, en estos programas se utiliza una matriz donde se van insertando las notas. Utilizan samples para producir los sonidos, o arreglos de samples denominados Instrumentos en algunos trackers sofisticados.&lt;br /&gt;&lt;br /&gt;Estos programas tuvieron su furor en las gloriosas épocas de DOS.&lt;br /&gt;&lt;br /&gt;Hoy existen nuevas versiones, como Renoise y MadTracker (desafortunadamente solo para Windows).&lt;br /&gt;&lt;br /&gt;Ahora les voy a mostrar las que existen para el sistema operativo Linux.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RfLvyUT_txI/AAAAAAAAAGA/MLjOB0J49eA/s1600-h/skale.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RfLvyUT_txI/AAAAAAAAAGA/MLjOB0J49eA/s320/skale.png" alt="" id="BLOGGER_PHOTO_ID_5040354580706080530" border="0" /&gt;&lt;/a&gt;Skale Treacker, muy FT2, muy bonito también. La version de GNU no tiene los equivalentes a los chches de la version de Windows (como seria salida JACK, o plugins LADSPA), pero es muy cómodo para editar. Eso si, es algo pesadito, no menos de 900Mhz para correr este tracker. Vale la pena.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RfLvp0T_twI/AAAAAAAAAF4/lvzeyrCkygw/s1600-h/milky_tracker.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RfLvp0T_twI/AAAAAAAAAF4/lvzeyrCkygw/s320/milky_tracker.png" alt="" id="BLOGGER_PHOTO_ID_5040354434677192450" border="0" /&gt;&lt;/a&gt;Milky Tacker, bastante activo, llegué a el por &lt;a href="http://modulez.org"&gt;&lt;span style="font-weight: bold;"&gt;modulez.org&lt;/span&gt;&lt;/a&gt;. Para quienes usaron FT2, la interfase esta excelente. Tiene algunos chiches para musica chip como editor de samples (al estilo lápiz!). Vale la pena probarlo. Como los otros, está basado en SDL, asi que se puede correr en Windows sin problemas.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RfLvhkT_tvI/AAAAAAAAAFw/VnmG0y_L6uo/s1600-h/chibi.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RfLvhkT_tvI/AAAAAAAAAFw/VnmG0y_L6uo/s320/chibi.png" alt="" id="BLOGGER_PHOTO_ID_5040354292943271666" border="0" /&gt;&lt;/a&gt;Chibi Tracker, el segundo tracker de Juan Linietsky (aka Reduz). Aunque he prbado una de las primeras betas, fucniona muy bien. Interfase bien al estilo Impulse  Ttracker. Quizas necesita que algún diseñador le otorgue la vida mediante algún Skin a este excelente tracker.&lt;br /&gt;&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RfK1jkT_ttI/AAAAAAAAAFg/ExHpnVG3X1Q/s1600-h/cheesetracker.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RfK1jkT_ttI/AAAAAAAAAFg/ExHpnVG3X1Q/s320/cheesetracker.png" alt="" id="BLOGGER_PHOTO_ID_5040290555628598994" border="0" /&gt;&lt;/a&gt;Ceesetracker es el más avanzado de los trackers para GNU, con soporte de efectos LADSPA y salida JACK para baja latencia (y rutear tus tracks a jagim/ardour :) ).&lt;br /&gt;&lt;br /&gt;Existen otro trackers, muy buenos como sound tracker, pero no me puedo acostumbrar a usarlos :S.&lt;br /&gt;¿Quieren escuchar algo de musisca realizada con trackers?&lt;br /&gt;Bueno, si jugaron alguna vez a Frozen Bubble, entonces ya han escuchado musica hecha con trackers!&lt;br /&gt;&lt;br /&gt;Una asignauta pendiente para mi es ver la interacción vía MIDI con un teclado...&lt;br /&gt;&lt;br /&gt;Aquí está el articulo de la &lt;a href="http://en.wikipedia.org/wiki/Tracker"&gt;Wikipedia&lt;/a&gt; si quieren saber más.&lt;br /&gt;&lt;br /&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tag/Trackers%20IT%20FT2" class="performancingtags"&gt;Trackers IT FT2&lt;/a&gt;&lt;br /&gt;powered by &lt;a href="http://performancing.com/firefox"&gt;performancing firefox&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/20311093-8980352555318530158?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8980352555318530158/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8980352555318530158' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8980352555318530158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8980352555318530158'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/03/trackers-en-el-sistema-del-pinguino.html' title='Trackers en el sistema del Pinguino'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_CICZrYFdH1w/RfLvyUT_txI/AAAAAAAAAGA/MLjOB0J49eA/s72-c/skale.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-368889804919725539</id><published>2007-01-26T12:50:00.000-08:00</published><updated>2007-01-26T13:23:59.431-08:00</updated><title type='text'>Una radio para nuestros gustos</title><content type='html'>De eso se trata Last.FM, &lt;small&gt;(que se cuenta con cierta integracion de sus servicios en Amarok 1.3+)&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Una vez que nos registramos bajamos el binario que nos servirá para sintonizar la radio. Pero a diferencia de los streams normales, como los que podemos escuchar con &lt;small&gt;&lt;strike&gt;&lt;a href="http://www.xmms.org/"&gt;XMMS&lt;/a&gt;&lt;/strike&gt;&lt;/small&gt;&lt;u&gt; &lt;a href="http://audacious-media-player.org/Main_Page"&gt;Audacious&lt;/a&gt;&lt;/u&gt; en &lt;a href="http://www.shoutcast.com/"&gt;Shoutcast&lt;/a&gt; &lt;small&gt;o mejor &lt;/small&gt;&lt;a href="http://dir.xiph.org/index.php"&gt;Icecast&lt;/a&gt;; ésta rádio se genera dinamicamente con nuestros gustos!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RbptG69arUI/AAAAAAAAAFE/Wd3J0HSaEJ0/s1600-h/last.fm0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RbptG69arUI/AAAAAAAAAFE/Wd3J0HSaEJ0/s320/last.fm0.png" alt="" id="BLOGGER_PHOTO_ID_5024448299958709570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Podemos seleccionar las radios por artistas o mediante el ya popular sistema de Tags.&lt;br /&gt;Cuando el reproductor se encuentra en reproducción, nos muestra el track, con el cover y la ya acostumbrada info del artista (solo que esta vez se enucentra en la web de last.fm en vez de la Wikipedia).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RbpvHK9arVI/AAAAAAAAAFM/uaztTZWIyKs/s1600-h/last.fm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RbpvHK9arVI/AAAAAAAAAFM/uaztTZWIyKs/s320/last.fm.png" alt="" id="BLOGGER_PHOTO_ID_5024450503276932434" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-368889804919725539?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/368889804919725539/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=368889804919725539' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/368889804919725539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/368889804919725539'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/una-radio-para-nuestros-gustos.html' title='Una radio para nuestros gustos'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/RbptG69arUI/AAAAAAAAAFE/Wd3J0HSaEJ0/s72-c/last.fm0.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8693344428479315965</id><published>2007-01-19T02:38:00.000-08:00</published><updated>2007-01-19T03:59:00.716-08:00</updated><title type='text'>Hardware funcionando al 100%</title><content type='html'>Finalmente, luego de haber testeado exhaustivamente que el segundo slot PCI de Bragi solo está de adorno, decidí probar con una placa de red ISA.&lt;br /&gt;Hoy en día, hardware tan viejo es difícil de conseguir, pero por suerte, Anibal me facilitó una placa, para salir del paso.&lt;br /&gt;La placa requirió reservar una IRQ en la BIOS, y cargar el modulo con parametros de Interrupcion (irq) y puerto de E/S.&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;modprobe ne irq=11 io=0x340&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para esto en /etc/modprobe.d/ se crea un archivo de texto con el nombre del modulo, en mi caso "ne" y añadí los parametros, para que se usen automáticamente cuando modprobe cargue el modulo (ya sea de forma manual o al arranque).&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;options ne io=0x340 irq=11&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Una vez Bragi, totalmente funcional me decidí buscar información sobre como dejar procesos en ejecución cuando las consolas remotas se cierran. Vale recalcar que Bragi no tiene teclado ni monitor, solo un modem y dos plcas de red. Toda la administración se hace por ssh.&lt;br /&gt;Según los comentarios de &lt;a href="http://www.nuestroborges.com.ar/rusod/"&gt;Rusod&lt;/a&gt; screen parecía la solución.&lt;br /&gt;Luego de un&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;apt-get install screen&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;...ejecuté en la consola donde quería dejar tareas &lt;k&gt;vivas&lt;/k&gt; luego de la muerte de la terminal:&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;screen&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ttras el mensaje de bienvenida inicié un top&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;top&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;cerré la consola ssh.&lt;br /&gt;Luego, volví ejecuté&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;screen -ls&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Y para recuperar la sesión "detachada", es decir re-atacharla :-S&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;screen -r&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Listo!!!&lt;br /&gt;Pero quiero mas, mas consolas, bueno&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;&lt;b&gt;Ctrl+a, c&lt;/b&gt; Crea consolas&lt;br /&gt;&lt;b&gt;Ctrl+a, "&lt;/b&gt; Muestra la lista&lt;br /&gt;&lt;b&gt;exit&lt;/b&gt; Cierra una sesión&lt;br /&gt;&lt;b&gt;Ctrl + a, n &lt;/b&gt; Salta  a la siguiente&lt;br /&gt;&lt;b&gt;Ctrl + a, l &lt;/b&gt; Salta  a la anterior&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Realmente una utilidad de esas super útiles, como el netcat, el vim o el mc.&lt;br /&gt;Para todas esas perosnas que se resistan a tener las 6 tty's, es una muy buena opción ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8693344428479315965?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8693344428479315965/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8693344428479315965' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8693344428479315965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8693344428479315965'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/hardware-funcionando-al-100.html' title='Hardware funcionando al 100%'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-121814849639648905</id><published>2007-01-15T22:05:00.000-08:00</published><updated>2007-01-15T22:26:34.871-08:00</updated><title type='text'>Desastroso Hardware</title><content type='html'>Lamentablemente la ranura PCI de Bragi ha dejado de funcionar, si es que alguna vez funcionó.&lt;br /&gt;No me sorprende ya que todos conocemos la calidad de los chipsets y dispositivos SiS, sobre todo los que ya llevan varios años de existencia. &lt;span style="font-size:85%;"&gt;(De hecho, estoy reconsdireando el titulo de mi blog :p)&lt;/span&gt;&lt;br /&gt;Lamentablemente tendré que conseguir una placa ISA para llevar internet hasta la PC de mi hermano.&lt;br /&gt;Bueno, aqui va la primer parte de la configuración del router, la conexión a internet.&lt;br /&gt;El modem es un Speedtouch 330 USB, que requiere &lt;a href="http://linux-usb.sourceforge.net/SpeedTouch/index.html"&gt;drivers externos&lt;/a&gt;.&lt;br /&gt;Una vez instalados, y debido a que el router no posee teclado ni pantalla para activar manualmente la conexion, es necesario crear un script de arranque.&lt;br /&gt;Para esto con vi o su editor favorito creamos &lt;span style="font-family:trebuchet ms;"&gt;/etc/init.d/adsl&lt;/span&gt;&lt;br /&gt;y ponemos los siguiente:&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;#! /bin/sh&lt;br /&gt;# /etc/init.d/adsl&lt;br /&gt;# Conexion a internet&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Some things that run always&lt;br /&gt;touch /var/lock/adsl&lt;br /&gt;&lt;br /&gt;# Hacer las funciones generales&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;echo "Inciando conexion a internet "&lt;br /&gt;    /usr/sbin/br2684ctl -b -c 0 -a 8.35 &amp;&amp;amp; /sbin/ifconfig nas0 192.168.100.254 netmask 255.255.0.0&lt;br /&gt;    /usr/sbin/pppd call taller &amp;&lt;br /&gt;echo "Fin de conexion a internet"&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;echo "Deteniendo conexion a internet"&lt;br /&gt;    killall -9 pppd&lt;br /&gt;echo "Conexion a internet finalizada"&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "Usage: /etc/init.d/adsl {start|stop}"&lt;br /&gt;exit 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Luego para añadir la conexion a internet en el arranque:&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;pdate-rc.d blah defaults&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Voilá, ya tenemos internet.&lt;br /&gt;Como vamos a necesitar compartir internet, de hecho, no tiene mucho sentido que esta maquina se conecte sola, vamos a activar en las reglas de iptables lo siguiente (nota: es un extracto de mi firewall que se lanza en /etc/init.d/bootmisc.sh, ya voy a arreglar eso, y lo posteo.)&lt;br /&gt;&lt;br /&gt;&lt;div class="my_comment"&gt;&lt;br /&gt;IPT=/sbin/iptables&lt;br /&gt;&lt;br /&gt;$IPT -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -j MASQUERADE&lt;br /&gt;$IPT -t nat -A POSTROUTING -o ppp0 -s 192.168.2.0/24 -j MASQUERADE&lt;br /&gt;&lt;br /&gt;$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;# Evitar que vengan y salgan a internet ( :p )&lt;br /&gt;$IPT -A FORWARD -i ppp0 -o ppp0 -j DROP&lt;br /&gt;&lt;br /&gt;$IPT -A FORWARD -i ppp0 -o eth0 -j ACCEPT&lt;br /&gt;$IPT -A FORWARD -i eth0 -o ppp0 -j ACCEPT&lt;br /&gt;&lt;br /&gt;$IPT -A FORWARD -i ppp0 -o eth1 -j ACCEPT&lt;br /&gt;$IPT -A FORWARD -i eth1 -o ppp0 -j ACCEPT&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/20311093-121814849639648905?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/121814849639648905/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=121814849639648905' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/121814849639648905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/121814849639648905'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/desastroso-hardware.html' title='Desastroso Hardware'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5383948083636531234</id><published>2007-01-12T21:25:00.000-08:00</published><updated>2007-01-12T21:36:00.930-08:00</updated><title type='text'>Avance en la red local</title><content type='html'>El router ya tiene los servicios que va a correr (los que no son de reouter configurados como Apache 2 y MySQL). El firewall está casi listo.&lt;br /&gt;El esquema es más o menos el siguiente:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RahtoCnLbGI/AAAAAAAAAEA/hL0doYcze2s/s1600-h/red_local.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RahtoCnLbGI/AAAAAAAAAEA/hL0doYcze2s/s320/red_local.png" alt="" id="BLOGGER_PHOTO_ID_5019382319367810146" border="0" /&gt;&lt;/a&gt;Bueno, y ahora unas fotos, sacadas durante el proceso de reducción de ruidos.&lt;br /&gt;Un primer plano del ventilado ruidoso que fue amputado en favor de uno sin regulación de velocidad ( y conectado a 7V):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RahumCnLbHI/AAAAAAAAAEI/us7uc_WbMCc/s1600-h/screenshot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RahumCnLbHI/AAAAAAAAAEI/us7uc_WbMCc/s320/screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5019383384519699570" border="0" /&gt;&lt;/a&gt;Un primer plano de los excesivos 256MB de RAM:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RahumSnLbJI/AAAAAAAAAEY/IG2qkaon7cw/s1600-h/screenshot2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RahumSnLbJI/AAAAAAAAAEY/IG2qkaon7cw/s320/screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5019383388814666898" border="0" /&gt;&lt;/a&gt;Y finalmente una vista trasera de las dos placas de red, que gracias al modulo de Cesar Barros funcionan perfectamente en Linux 2.6.18 (Gracias Cesar!!!).&lt;br /&gt;Una de las placas de red se encuentra desconectada en el momento de la foto.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RahumynLbKI/AAAAAAAAAEg/HhmleWwcN0c/s1600-h/screenshot3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RahumynLbKI/AAAAAAAAAEg/HhmleWwcN0c/s320/screenshot3.png" alt="" id="BLOGGER_PHOTO_ID_5019383397404601506" border="0" /&gt;&lt;/a&gt;Bueno, ya casi llegando a la parte final, ya tengo más o menos elaborado el detalle, que en breve espero tener en el blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5383948083636531234?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5383948083636531234/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5383948083636531234' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5383948083636531234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5383948083636531234'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/avance-en-la-red-local.html' title='Avance en la red local'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/RahtoCnLbGI/AAAAAAAAAEA/hL0doYcze2s/s72-c/red_local.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3813079311031438647</id><published>2007-01-10T16:32:00.000-08:00</published><updated>2007-01-10T17:08:37.518-08:00</updated><title type='text'></title><content type='html'>&lt;a href="http://unplug.mozdev.org/"&gt;Unplug&lt;/a&gt; es un plug-in para Firefox (o Swiftfox, Seamonkey, Iceweasel) que utilizo muy a menudo conjuntamente con Download Them All!&lt;br /&gt;Generalmente tengo mi Swiftfox con algún theme, con iconos que lo integren más con KDE. El icono original de Unpplug desentonaba con la barra de tareas, así que me decidí a hacer una mi versión como contribución a tan buen proyecto.&lt;br /&gt;Todo comenzó con un dibujo a mano alzada sobre uno del los tantos borradores de los esquemas que habían quedado de mi cursada de Sistemas Distribuidos.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RaWF0ynLbCI/AAAAAAAAADM/SzufTqq22d8/s1600-h/unplug_con_cable.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RaWF0ynLbCI/AAAAAAAAADM/SzufTqq22d8/s320/unplug_con_cable.png" alt="" id="BLOGGER_PHOTO_ID_5018564501760076834" border="0" /&gt;&lt;/a&gt;Luego arrancamos Inkscape y comenzamos a tirar el modelo vectorial, que difiere un poco del pescadito original.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RaWIBCnLbDI/AAAAAAAAADU/nDHA9ntl9LE/s1600-h/initial.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RaWIBCnLbDI/AAAAAAAAADU/nDHA9ntl9LE/s320/initial.png" alt="" id="BLOGGER_PHOTO_ID_5018566911236729906" border="0" /&gt;&lt;/a&gt;Lamentablemente, tenía el probelma del "resizeado", en resoluciones pequeñas las lineas del contorno se pierden, asi que vectorizamos los trazos y la cosa mejoró, y le dio aspecto más toon.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RaWKUCnLbEI/AAAAAAAAADc/xV-1ped0wgE/s1600-h/grandote.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RaWKUCnLbEI/AAAAAAAAADc/xV-1ped0wgE/s320/grandote.png" alt="" id="BLOGGER_PHOTO_ID_5018569436677499970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El desarrollador (David Batley) lo aceptó y hoy felizmente entra a ser parte de Swiftfox/Firefox :D&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RaWK5inLbFI/AAAAAAAAADk/-903RZycd9g/s1600-h/unplug.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RaWK5inLbFI/AAAAAAAAADk/-903RZycd9g/s320/unplug.png" alt="" id="BLOGGER_PHOTO_ID_5018570080922594386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Así que ya saben, si quieren bajar vídeos de YouTube (entre muchos más sitios) usen Unplug y si quieren administrar medianamente la descarga, usen &lt;a href="https://addons.mozilla.org/firefox/201/"&gt;DTA&lt;/a&gt; (Download Them All), el cual no necesita ícono, ya que posee uno muy bueno e intuitivo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3813079311031438647?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3813079311031438647/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3813079311031438647' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3813079311031438647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3813079311031438647'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/unplug-es-un-plug-in-para-firefox-o.html' title=''/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_CICZrYFdH1w/RaWF0ynLbCI/AAAAAAAAADM/SzufTqq22d8/s72-c/unplug_con_cable.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3733065887005593411</id><published>2007-01-09T21:43:00.000-08:00</published><updated>2007-01-09T21:50:02.090-08:00</updated><title type='text'>Legacy soft (aka como convivir con win en tu red)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RaR-VinLa_I/AAAAAAAAACw/t8gp-FBSW_E/s1600-h/antivirus.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RaR-VinLa_I/AAAAAAAAACw/t8gp-FBSW_E/s320/antivirus.png" alt="" id="BLOGGER_PHOTO_ID_5018274793331059698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aunque mi máquina ya no posee más copias de Windows, la maquina de mi hermano si utiliza el sistema de las ventanas. Y como ya me ha dado bastantes dolores de cabeza los bichitos, instalé KlamAV.&lt;br /&gt;La interfase está bastante bien acabada, (algo que es una asignatura pendiente en muchos utilitarios de GNU). Paradojicamente, la interfase basada en Qt me ha paredcido mucho mejor que la de Windows, como si se hubiesen intercambiado los desarroladores :P&lt;br /&gt;Acá va un screenshot del Klamav en acción.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3733065887005593411?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3733065887005593411/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3733065887005593411' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3733065887005593411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3733065887005593411'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/legacy-soft-aka-como-convivir-con-win.html' title='Legacy soft (aka como convivir con win en tu red)'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/RaR-VinLa_I/AAAAAAAAACw/t8gp-FBSW_E/s72-c/antivirus.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7309576313171425499</id><published>2007-01-03T14:14:00.000-08:00</published><updated>2007-01-03T15:23:53.572-08:00</updated><title type='text'>Eclipse problemático (o mi reino por un editor de CSS)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RZw60ODwB-I/AAAAAAAAACA/FhVxPw0m320/s1600-h/eclipse.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RZw60ODwB-I/AAAAAAAAACA/FhVxPw0m320/s400/eclipse.png" alt="" id="BLOGGER_PHOTO_ID_5015948753785325538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Luego de llegar a un eclipse de &lt;span style="font-weight: bold;"&gt;900MB&lt;/span&gt;(!) con muchos problemas, decidí probar el sistema de instalación de Yoxos. En la pagina, tras registrarse se puede armar uno el eclipse a medida, en una bonita interfase en Ajax (muy sospechosa tanta amabilidad).&lt;br /&gt;Una vez terminada la selección de los componentes que queremos en Eclipse procedemos a bajar un tar.gz con todo el paquetón (200MB, Linux GTK+). En mi caso seleccioné: Desarrollo Java, PHPEclipse, Idioma Castellano (&lt;span style="font-style: italic;"&gt;language pack1&lt;/span&gt;), Visual Editor, herramientas de mapeo Objeto/Relacional, Visual Editor y algunas cosas más, (chiches, como un visor de imágenes).&lt;br /&gt;Una vez descomprimido; el splash cambio un poco:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RZwvxODwB4I/AAAAAAAAABQ/DL_k7eLk0Q0/s1600-h/yoxo-launch.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RZwvxODwB4I/AAAAAAAAABQ/DL_k7eLk0Q0/s320/yoxo-launch.png" alt="" id="BLOGGER_PHOTO_ID_5015936607617812354" border="0" /&gt;&lt;/a&gt;El arranque había recuperado su velocidad inicial, o al menos la que mi memoria conservaba desde que borré íntegramente eclipse 3.1 para pasar al 3.2.&lt;br /&gt;Con una vista rápida, uno advierte que algo tiene este Eclipse, iconitos nuevos por aquí y por allí. Finalmente, lo que más captura la atención es el menú ayuda, justo antes del administrador de actualizaciones:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RZwxdeDwB6I/AAAAAAAAABg/D-F0xkRRz9o/s1600-h/yoxo-update.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RZwxdeDwB6I/AAAAAAAAABg/D-F0xkRRz9o/s320/yoxo-update.png" alt="" id="BLOGGER_PHOTO_ID_5015938467338651554" border="0" /&gt;&lt;/a&gt;Aparece un instalador muy bonito, en el cual advertimos que necesitamos la membresía de Yoxos para poder utilizarlo...&lt;span style="font-size:85%;"&gt;(con registrarte te dan 3 meses gratis, &lt;span style="font-style: italic;"&gt;me parece una herramienta que vale la pena&lt;/span&gt;, pero para mis finalidades actuales busco &lt;span style="font-weight: bold;"&gt;costo cero&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_CICZrYFdH1w/RZwxOuDwB5I/AAAAAAAAABY/agA3dr5CVbk/s1600-h/yoxo-install.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_CICZrYFdH1w/RZwxOuDwB5I/AAAAAAAAABY/agA3dr5CVbk/s320/yoxo-install.png" alt="" id="BLOGGER_PHOTO_ID_5015938213935581074" border="0" /&gt;&lt;/a&gt;Finalmente, se puede seguir utilizando el mecanismo de actualización tradicional, de esta forma instalé PyDev, que funcionó sin más.&lt;br /&gt;Pero Aptana seguía sin funcionar. La version StandAlone genera errores con libxpcom.so que son dificiles de solucionar en Debian, y en algún momento me ocuparé de ellos, pero mi interés se centra más en este momento en eclipse.&lt;br /&gt;Por suerte en el archivo &lt;span style="font-style: italic;"&gt;.log&lt;/span&gt; del directorio &lt;span style="font-style: italic;"&gt;.metadata &lt;/span&gt;del workspace aparece que el error es generado por que la variable MOZILLA_FIVE_HOME no está definida en el sistema.&lt;br /&gt;A esto tomamos en kate y rápidamente...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RZw2qeDwB8I/AAAAAAAAABw/66LJqGpegoM/s1600-h/script_arranque_aptana.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RZw2qeDwB8I/AAAAAAAAABw/66LJqGpegoM/s400/script_arranque_aptana.png" alt="" id="BLOGGER_PHOTO_ID_5015944188235089858" border="0" /&gt;&lt;/a&gt;Y finalmente....&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_CICZrYFdH1w/RZw2-ODwB9I/AAAAAAAAAB4/-8m_5KsnT8k/s1600-h/aptana.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_CICZrYFdH1w/RZw2-ODwB9I/AAAAAAAAAB4/-8m_5KsnT8k/s400/aptana.png" alt="" id="BLOGGER_PHOTO_ID_5015944527537506258" border="0" /&gt;&lt;/a&gt;Funciona!&lt;br /&gt;Al menos lo más importante funciona, queda por resolver, como se puede apreciar en la figura, el tema de las fuentes en el panel Project sobre la derecha.&lt;br /&gt;Ya puedo editar css y htc (javascript) desde la comodidad del eclipse.&lt;br /&gt;Próximo paso: Probar &lt;a href="http://www.eclipse.org/pde/"&gt;PDE&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7309576313171425499?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7309576313171425499/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7309576313171425499' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7309576313171425499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7309576313171425499'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/eclipse-problemtico-o-mi-reino-por-un.html' title='Eclipse problemático (o mi reino por un editor de CSS)'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_CICZrYFdH1w/RZw60ODwB-I/AAAAAAAAACA/FhVxPw0m320/s72-c/eclipse.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-7836849631145037589</id><published>2007-01-02T20:44:00.000-08:00</published><updated>2007-01-02T21:05:04.110-08:00</updated><title type='text'>Noisy Fans!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RZs4_uDwB2I/AAAAAAAAAA8/f-QXqsdxFCg/s1600-h/noisy-cooler.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RZs4_uDwB2I/AAAAAAAAAA8/f-QXqsdxFCg/s200/noisy-cooler.png" alt="" id="BLOGGER_PHOTO_ID_5015665277353854818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Con todo listo en Bragi(K6-2 @475Mhz) para convertirse en router, aparece un factor que no se arregla con  apt :'(&lt;br /&gt;Son los &lt;span style="font-weight: bold;"&gt;molestos&lt;/span&gt; ventiladores de las &lt;span style="font-weight: bold;"&gt;fuente&lt;/span&gt; y el &lt;span style="font-weight: bold;"&gt;CPU.&lt;/span&gt; Generan un ruido &lt;span style="font-style: italic;"&gt;muy&lt;/span&gt; perceptible y superior a sus primos mallores Valqueria (K8 3000+ @ 1800MHz) y Valhalla (idem).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-7836849631145037589?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/7836849631145037589/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=7836849631145037589' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7836849631145037589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/7836849631145037589'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2007/01/noisy-fans.html' title='Noisy Fans!'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/RZs4_uDwB2I/AAAAAAAAAA8/f-QXqsdxFCg/s72-c/noisy-cooler.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4465620515829160515</id><published>2006-12-31T01:22:00.000-08:00</published><updated>2006-12-31T01:26:17.453-08:00</updated><title type='text'>Con paciencia y "vim"...</title><content type='html'>Finalmente todas las placas de red funcionan perfectamente. Hasta la encore donde hubo que hacer unas modificaciones. Gracias a &lt;a href="http://www.ubuntu-es.org/index.php?q=node/15332"&gt;unos ajustes en el modulo...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Solo resta configurar el firewall con MASQUERADE para las dos placas de red, ver el tema de las politicas de ancho de banda, y listo...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4465620515829160515?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4465620515829160515/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4465620515829160515' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4465620515829160515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4465620515829160515'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/12/con-paciencia-y-vim.html' title='Con paciencia y &quot;vim&quot;...'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2409554134825570929</id><published>2006-12-28T21:35:00.000-08:00</published><updated>2006-12-28T23:21:38.268-08:00</updated><title type='text'>Driver Scilan</title><content type='html'>He tenido varios problemas últimamente el le tema de poner en marcha la red de casa.&lt;br /&gt;El primer problema fue tener la placa de red de la Asus A8V quemada, por un accidental introducción de una ficha Firewire :·$&lt;br /&gt;Problema solucionado con una placa de red PCI, marca NogaNET, la cual tenia felizmente inscripto 8139D sobre su integrado, a lo cual supuse que sería compatible con 8139D o mejor dicho que funcionaría con el modulo de las realtek. No funcionó, pero con un lspci&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;00:0c.0 Ethernet controller: ADMtek NC100 Network Everywhere Fast Ethernet 10/100 (rev 11)&lt;/span&gt;&lt;br /&gt;...y Googleando un poco, con el modulo de Tulip funcionó perfectamente.&lt;br /&gt;Ahora el tema eran las placas de red del nuevo Router (aun si  terminar).&lt;br /&gt;Las placas son muy económicas, marca SolTech(!).&lt;br /&gt;Compradas por tener una hermosa etiqueta que dice "Realtek Chipset" y además del RTL8139D en el chip, junto al cangrejito.&lt;br /&gt;&lt;br /&gt;Esta placa venía acompañada de un driver en un MiniCD, el cual solo funciona en el núcleo 2.4, la versión 2.6 del módulo está en desarrollo por  Cesar Eduardo Barros. Por suerte fue muy gentíl al facilitarmelos en formato "fuera del kernel".&lt;br /&gt;Han compilado sin problemas pero no he tenido oportunidad de probarlos aún.&lt;br /&gt;&lt;br /&gt;Veremos que pasa mañana...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-2409554134825570929?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2409554134825570929/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2409554134825570929' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2409554134825570929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2409554134825570929'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/12/driver-scilan.html' title='Driver Scilan'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-3215990742637048985</id><published>2006-12-21T14:07:00.000-08:00</published><updated>2006-12-21T14:13:32.197-08:00</updated><title type='text'>Armando la Home LAN</title><content type='html'>Con la adquisición de un nuevo ordenador en el hogar destinado para  mi hermano, Taro, me vi en necesidad de compartir la conexión a internet. Cuento con un MODEM(?) USB y una máquina vieja que va a hacer de router (un viejo k6-2, con 256MB de ram, y disco de 40Gb).&lt;br /&gt;Este K6-2 pasará a ser &lt;a href="http://es.wikipedia.org/wiki/Bragi"&gt;Bragi&lt;/a&gt;, y será el router de la casa. Tiene, por ahora Sarge, con el kernel 2.4 que no soporta al modem, asi que tendremos que hacerle un kernel más nuevo.&lt;br /&gt;Bueno, me voy a compar los implementos de rigor i.e.: + Cable, uns RJ45 y a pedirle la pinza a Rodrigo&lt;br /&gt;Cuando esté todo funcionando, postearé una guía detallada&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-3215990742637048985?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/3215990742637048985/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=3215990742637048985' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3215990742637048985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/3215990742637048985'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/12/armando-la-home-lan.html' title='Armando la Home LAN'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-5450985754773359585</id><published>2006-12-16T13:08:00.000-08:00</published><updated>2006-12-16T13:23:57.278-08:00</updated><title type='text'>Inkscape</title><content type='html'>Mi editor vectorial predilecto se está por adquirir dos características importantes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://inkscape.org/screenshots/gallery/inkscape-0.45-gradient-mesh-experimental.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px;" src="http://inkscape.org/screenshots/gallery/inkscape-0.45-gradient-mesh-experimental.png" alt="" border="0" /&gt;&lt;/a&gt;Filtro de Blur y malla para los gradientes :D :D :D&lt;br /&gt;No puedo esperar para probarlo....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-5450985754773359585?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/5450985754773359585/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=5450985754773359585' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5450985754773359585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/5450985754773359585'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/12/inkscape.html' title='Inkscape'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-8198177116785309747</id><published>2006-12-04T21:35:00.000-08:00</published><updated>2006-12-04T22:13:59.717-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>Sorpresas en Debian</title><content type='html'>Hoy actualizando 1400MB de soft en mi debian encontré varias sorpresas.&lt;br /&gt;La primera , es esta:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RXUKLgjKo4I/AAAAAAAAAAM/McW6g_tj5X4/s1600-h/debian_automontaje_"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RXUKLgjKo4I/AAAAAAAAAAM/McW6g_tj5X4/s400/debian_automontaje_" alt="" id="BLOGGER_PHOTO_ID_5004917753724445570" border="0" /&gt;&lt;/a&gt;Bueno, el supermontaje y todo su mundo (hal, udev, etc.) ya no usa los puntos de montaje definidos en el fstab, sino que toma la etiqueta del CD, y crea en Media un directorio temporal de montaje (!).&lt;br /&gt;Esto parece dejar de andar bruscamente si tenemos supermontaje y forzamos las cosas, sacando el CD sin desmontar.&lt;br /&gt;también sucede con los pendrives.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una captura desde el super útil Yakuake (Razón por la que no me movere de KDE :P)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RXUK0gjKo5I/AAAAAAAAAAU/rZUCI2ZwAg8/s1600-h/debian_automontaje_"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 521px; height: 31px;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RXUK0gjKo5I/AAAAAAAAAAU/rZUCI2ZwAg8/s400/debian_automontaje_" alt="" id="BLOGGER_PHOTO_ID_5004918458099082130" border="0" /&gt;&lt;/a&gt;Y ahora quizas la más feliz, y es que el modo rescate del CD ahora es gráfico.&lt;br /&gt;SI!!! Al fin!!! Muy bueno, para todos los que practiquen la "clonacion" de Distribuiciones, y luego necesiten instalar GRUB, para los que necesitan hacer mantenimiento en el sistema, solo nos falta un debian de Pendrive al estilo Slax y el mundo es nuestro :P&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_CICZrYFdH1w/RXUL6gjKo6I/AAAAAAAAAAk/Em7GLoCBLlc/s1600-h/debina_etch_rescate.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_CICZrYFdH1w/RXUL6gjKo6I/AAAAAAAAAAk/Em7GLoCBLlc/s400/debina_etch_rescate.png" alt="" id="BLOGGER_PHOTO_ID_5004919660689925026" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_CICZrYFdH1w/RXUMKAjKo7I/AAAAAAAAAAs/PhSaDmDWVJE/s1600-h/debian_sarge_rescate2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_CICZrYFdH1w/RXUMKAjKo7I/AAAAAAAAAAs/PhSaDmDWVJE/s400/debian_sarge_rescate2.png" alt="" id="BLOGGER_PHOTO_ID_5004919926977897394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Por ultimo, las etiquetas de las particiones son los verdaderos LABELS! en las particiones FAT32.&lt;br /&gt;Nada más que decir, un gran paso en la usabilidad, :D.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-8198177116785309747?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/8198177116785309747/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=8198177116785309747' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8198177116785309747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/8198177116785309747'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/12/sorpresas-en-debian.html' title='Sorpresas en Debian'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CICZrYFdH1w/RXUKLgjKo4I/AAAAAAAAAAM/McW6g_tj5X4/s72-c/debian_automontaje_' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-9081838219556653057</id><published>2006-11-29T07:58:00.000-08:00</published><updated>2006-11-29T08:01:10.285-08:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/3125/2479/1600/915509/muy%20fuerte.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/3125/2479/400/394258/muy%20fuerte.png" alt="" border="0" /&gt;&lt;/a&gt;Muy Fuerte!!!&lt;br /&gt;1369147dB (&lt;a href="http://en.wikipedia.org/wiki/Decibel"&gt;http://en.wikipedia.org/wiki/Decibel&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-9081838219556653057?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/9081838219556653057/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=9081838219556653057' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9081838219556653057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/9081838219556653057'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/11/muy-fuerte-1369147db-httpen.html' title=''/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-2835390248317984358</id><published>2006-11-19T09:55:00.000-08:00</published><updated>2006-11-19T10:01:34.020-08:00</updated><title type='text'>El arte de un maestro</title><content type='html'>Algunos ya conocen el iconset llamado Nuvola ( No Ovula para algunos :P )&lt;br /&gt;Es hora de que echen un vistazo a las excelente creaciones de David Vignoni (aka Icon King)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/3125/2479/1600/552257/41.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/3125/2479/400/426306/41.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.icon-king.com/"&gt; Icon King &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-2835390248317984358?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/2835390248317984358/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=2835390248317984358' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2835390248317984358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/2835390248317984358'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/11/el-arte-de-un-maestro.html' title='El arte de un maestro'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-4081048200409919288</id><published>2006-11-15T06:29:00.000-08:00</published><updated>2006-11-15T16:11:17.008-08:00</updated><title type='text'>Clases de Java</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/3125/2479/1600/patrones.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger2/3125/2479/400/patrones.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Probando QuiteInsane como plugin de Sane para el GIMP, funciona muy bien exceptuando el hecho de que la selección se realiza mediante Sliders en vez de utilizar la clásica selección con mouse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-4081048200409919288?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/4081048200409919288/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=4081048200409919288' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4081048200409919288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/4081048200409919288'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/11/patrones-de-diseo.html' title='Clases de Java'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20311093.post-115971795123828917</id><published>2006-10-01T12:43:00.000-07:00</published><updated>2006-10-01T08:52:31.270-07:00</updated><title type='text'>Swiftfox</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger2/3125/2479/1600/mozicon128.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger2/3125/2479/320/mozicon128.0.png" alt="" border="0" /&gt;&lt;/a&gt; Firefox extraido de los repositorios originales de Debian deja bastante que desar en cuanto a performance (y ni hablar de no tener el simático zorrito como icono).&lt;br /&gt;Si bien nos podemos acostrumbrar a una estética distinta, cuando las aplicaciones no tiene una performance usable, y son parte de nuestra vida driaria, es MUY incómodo.&lt;br /&gt;Empezé por quitar plugins a firefox, en un intento deseperado de no hacer cambios radicales, sacrificando la usabilidad. Si llegó a haber un cambio realmente no pude apreciarlo.&lt;br /&gt;Afortunadamente el oráculo (aka Google) tenía la solucion a pocos clicks.&lt;br /&gt;En &lt;a href="http://getswiftfox.com/%20"&gt;http://getswiftfox.com/ &lt;/a&gt; existen versiones optimizadas para casi cualquier microprocesador y la diferencia se aprecia MUCHO. No quiero pecar de exagerado&lt;small&gt;&lt;strike&gt;(muy probable)&lt;/strike&gt;&lt;/small&gt;, pero incluso se siente mas suave que en Gentoo.&lt;br /&gt;Ahora ya saben, o quizas ya sabian y yo me entero tarde, la custión es que nuevamente tengo un navegador veloz y poderoso. Larga vida a Swiftfox o debería decir Firefox?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20311093-115971795123828917?l=d3f0.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://d3f0.blogspot.com/feeds/115971795123828917/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20311093&amp;postID=115971795123828917' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/115971795123828917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20311093/posts/default/115971795123828917'/><link rel='alternate' type='text/html' href='http://d3f0.blogspot.com/2006/10/swiftfox.html' title='Swiftfox'/><author><name>Nahuel</name><uri>http://www.blogger.com/profile/14878793336284827781</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/-oNQqK1j7hrg/Thc_BCqDcwI/AAAAAAAABWI/kn9itopTBAs/s220/avatar.jpg'/></author><thr:total>5</thr:total></entry></feed>
