<?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-7426898488372542781</id><updated>2011-12-29T19:28:26.664-08:00</updated><category term='Gtk#'/><category term='como actualizar tablas en django'/><category term='Expresiones regulares con C sharp.'/><category term='red'/><category term='C language'/><category term='django_evolution example'/><category term='sincronizar tablas'/><category term='midp-2.0'/><category term='wsdl'/><category term='C programming'/><category term='c#'/><category term='HWAddr'/><category term='Expresiones regulares con mono'/><category term='webserver'/><category term='awk'/><category term='lsof'/><category term='ioctl'/><category term='shell'/><category term='mono installer bug'/><category term='python'/><category term='tc'/><category term='programing'/><category term='seguridad informática'/><category term='linux network programming'/><category term='urllib'/><category term='c sharp en linux'/><category term='get'/><category term='monodevelop'/><category term='urllib2'/><category term='linux'/><category term='scripting'/><category term='conectividad j2me - soappy'/><category term='c sharp'/><category term='soap'/><category term='netstat'/><category term='mysql'/><category term='java'/><category term='j2me ws stub generation'/><category term='desarrollo web'/><category term='webservices'/><category term='wtk'/><category term='programming'/><category term='firma digital'/><category term='bsd'/><category term='ListStore'/><category term='programacion'/><category term='openssl'/><category term='bases de datos'/><category term='django tables update'/><category term='pk7 sign'/><category term='post'/><category term='bash'/><category term='django'/><category term='Gtk sharp'/><category term='conectividad j2me - python'/><category term='ListView con Gtk sharp'/><category term='django models update'/><category term='C programing'/><category term='socket'/><category term='j2me'/><category term='programación'/><category term='bandwidth'/><category term='linux network programing'/><category term='TreeView'/><category term='html'/><category term='tlslite'/><category term='soappy'/><category term='kernel'/><category term='ssl'/><category term='https'/><category term='network'/><category term='certificados x509'/><category term='ubuntu'/><category term='mono'/><category term='iptables'/><category term='maosx'/><title type='text'>xuniL noc sasoC</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-3428143764088826295</id><published>2011-12-29T18:31:00.000-08:00</published><updated>2011-12-29T19:24:46.201-08:00</updated><title type='text'>Vim Word Fuzzy Completion.</title><content type='html'>&lt;div&gt;El último tiempo estuve probando un editor de texto que para mi es bastante nuevo: &lt;a href="http://www.sublimetext.com/"&gt;sublime2&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esta &lt;b&gt;genial&lt;/b&gt; aplicación tiene muchísimas características interesantes como es un minimap del texto, a la derecha sobre el que se puede navegar, apertura de archivos utilizando fuzzy search sobre el path actual, auto completado 'fuzzy' con la tecla &amp;lt;Tab&amp;gt;, búsqueda por símbolos con el caracter @, indentado de texto muy inteligente, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Inmediatamente me despertó la curiosidad sobre algunas funcionalidades que  vim no trae de cajón,  y que muy tranquilamente podría tener:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1- Apertura de archivos utilizando fuzzy search.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2- Completado 'fuzzy' de palabras (ej: si en mi archivo tengo la palabra futurama, yo escribo frutur, presiono &amp;lt;Tab&amp;gt; o alguna combinación, y el editor de texto debería sugerirme 'futurama').&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El caso &lt;b&gt;(1)&lt;/b&gt; lo resolví con el excelente complemento 'CommandT' para vim: &lt;a href="http://www.vim.org/scripts/script.php?script_id=3025"&gt;enlace&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sin embargo, me llamó la atención que no pude encontrar una solución para el caso &lt;b&gt;(2)&lt;/b&gt;, ya que es una funcionalidad relativamente fácil de implementar en un plugin. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dado lo anterior, me senté unas horas de una tarde y lo resolví creando el plugin 'Word Fuzzy Completion': &lt;a href="http://www.vim.org/scripts/script.php?script_id=3857"&gt;enlace&lt;/a&gt; (mi primer aporte a la comunidad de usuarios vim), el código fuente del plugin está alojado en github: &lt;a href="https://github.com/jaanauati/vim-wordfuzzycompletion-plugin/"&gt;enlace&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El funcionamiento del plugin es sencillo, existen dos combinaciones de teclas para utilizarlo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"&amp;lt;Ctrl-X&amp;gt;&amp;lt;Ctrl-U&amp;gt;"  o uno mas corto "&amp;lt;Ctrl-K&amp;gt;".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Suponiendo que estamos editando un buffer que contiene lo siguiente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-------- buffer ----------&lt;/div&gt;&lt;div&gt;The simpsons&lt;/div&gt;&lt;div&gt;Futurama&lt;/div&gt;&lt;div&gt;Back to the future&lt;/div&gt;&lt;div&gt;Features&lt;/div&gt;&lt;div&gt;-------- buffer ----------&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: medium; text-align: -webkit-auto; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: medium; text-align: -webkit-auto; "&gt;Si escribimos:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: medium; text-align: -webkit-auto; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;1) &lt;/span&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;sminsons&lt;/span&gt;&amp;lt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;Ctrl-k&lt;/span&gt;&amp;gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt; &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  La palabra será cambiada a:&lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  simpsons &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  2) &lt;/span&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;smi&lt;/span&gt;&amp;lt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;Ctrl-k&lt;/span&gt;&amp;gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt; &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  La palabra cambiará nuevamente a:&lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  simpsons &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  3) &lt;/span&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;furure&lt;/span&gt;&amp;lt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;Ctrl-k&lt;/span&gt;&amp;gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt; &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  La palabra cambiará a:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  future &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  4)  &lt;/span&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;Furu&lt;/span&gt;&amp;lt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;Ctrl-k&lt;/span&gt;&amp;gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt; &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  Se mostrará el listado de palabras similares:&lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  Fururama &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  Future &lt;/span&gt;&lt;br style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;&lt;span style="font-family: arial, helvetica, sans-serif; text-align: -webkit-auto; background-color: rgb(255, 255, 255); font-size: medium; "&gt;  Features &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;La implementación del plugin está escrita en python, y utiliza el algoritmo de &lt;a href="http://es.wikipedia.org/wiki/Distancia_de_Levenshtein"&gt;Distancia de Levenshtein&lt;/a&gt; para medir distancias entre las palabras del buffer actual.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;Se que hay muchas cosas para mejorarle, la primera es cambiar la combinación de teclas '&lt;/span&gt;&lt;span style="text-align: left; "&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Ctrl-K&lt;/span&gt;&lt;span style="text-align: left; "&gt;&amp;gt;'&lt;/span&gt;&lt;span&gt; ya que está pisando una funcionalidad de vim, y la segunda es el buscado de palabras en todos los buffers abiertos. Cuando esté con un poco de tiempo libre lo implementaré.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;&lt;b&gt;Enlaces:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;Sublime2: &lt;/span&gt;&lt;a href="http://www.sublimetext.com/"&gt;&lt;span style="text-align: left;"&gt;e&lt;/span&gt;nlace&lt;/a&gt;&lt;span style="text-align: left; "&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;Vim: &lt;a href="http://www.vim.org/"&gt;enlace&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;WordFuzzyCompletion Plugin: &lt;/span&gt;&lt;a href="http://www.vim.org/scripts/script.php?script_id=3857" style="text-align: left; "&gt;enlace&lt;/a&gt; (fuentes: &lt;a href="https://github.com/jaanauati/vim-wordfuzzycompletion-plugin/" style="text-align: left; "&gt;enlace&lt;/a&gt;).&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span&gt;CommandT Plugin: &lt;/span&gt;&lt;a href="http://www.vim.org/scripts/script.php?script_id=3025" style="text-align: left; "&gt;enlace&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Distancia de Levenshtein: &lt;a href="http://es.wikipedia.org/wiki/Distancia_de_Levenshtein"&gt;enlace&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/7426898488372542781-3428143764088826295?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/3428143764088826295/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=3428143764088826295&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/3428143764088826295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/3428143764088826295'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2011/12/vim-word-fuzzy-completion.html' title='Vim Word Fuzzy Completion.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-2805568486408633762</id><published>2011-08-23T18:08:00.000-07:00</published><updated>2011-08-25T18:32:18.077-07:00</updated><title type='text'></title><content type='html'>&lt;div style="text-align: justify;"&gt;Es muy habitual en c++ o en c, manejar archivos en parejas, por ejemplo al editar un archivo llamado "archivo.cc" es muy probable que editemos también a un archivo "archivo.hh" para reflejar cambios de interface y viceversa. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este mapeo para &lt;span style="font-weight:bold;"&gt;vim&lt;/span&gt; define una forma fácil de abrir fichero compañero en un split vertical con solo presionar la combinación Ctrl+h. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Simplemente debe agregarse la siguiente línea al archivo ~/.vimrc:&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Identifier"&gt;has&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="String"&gt;'python'&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;br /&gt;   &lt;span class="Statement"&gt;map&lt;/span&gt; &lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;C-h&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt; :py import vim; vim.command("vsplit %s.%s" % ("".join(vim.current.buffer.name.split(".")[0:-1]), {"cpp":"hpp","cc":"hh","hpp":"cpp","hh":"cc","c":"h","h":"c"}[vim.current.buffer.name.split(".")[-1]]))&lt;span class="Special"&gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="Special"&gt;CR&lt;/span&gt;&lt;span class="Special"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Statement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Este es uno de los maps para vim que uso con mas frecuencia. Por ello le he definido varias parejas. Lo siguiente significa que si editamos el primero de cada línea que sigue, y presionamos ctrl+h, entonces se abrirá el segundo en un split vertical.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;cc    -&amp;gt;  hh&lt;br /&gt;hh   -&amp;gt;  cc&lt;br /&gt;hpp  -&amp;gt;  cpp&lt;br /&gt;cpp  -&amp;gt;  hpp&lt;br /&gt;h      -&amp;gt; c&lt;br /&gt;c      -&amp;gt; h&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Ejemplo&lt;/b&gt;: Cuando se está editando un archivo "archivo.hh", presionar la tecla Escape, y luego utilizar la abreviatura Ctrl+H.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-2805568486408633762?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/2805568486408633762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=2805568486408633762&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/2805568486408633762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/2805568486408633762'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2011/08/es-muy-habitual-en-c-o-en-c-manejar.html' title=''/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-6200167408606020303</id><published>2010-02-19T13:29:00.000-08:00</published><updated>2010-02-19T13:59:45.886-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maosx'/><category scheme='http://www.blogger.com/atom/ns#' term='lsof'/><category scheme='http://www.blogger.com/atom/ns#' term='bsd'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='netstat'/><title type='text'>Como ver conexiones de red por proceso en MacOSX.</title><content type='html'>Cuando uno quiere ver cuales son las conexiones de red asociadas a sus respectivas PID en el sistema, en linux podemos utilizar:&lt;br /&gt;&lt;br /&gt;my_linux_box $ netstat -pn&lt;br /&gt;&lt;br /&gt;el cual nos arrojará un lindo listado de conexiones asociadas a las respectivas PIDs del sistema. &lt;br /&gt;&lt;br /&gt;Quien hace esto posible es el switch 'p', pero, al parecer, este no es un standard, y para colmo, no está disponible en la versión de netstat disponible para MacOSX.&lt;br /&gt;&lt;br /&gt;Esto además significa que los scripts que (con tanto amor) generemos no serían portables a otros sistemas Unix, ya que por lo que pude averiguar, hay varios UNIXs mas que sufren esto.&lt;br /&gt;&lt;br /&gt;Por lo tanto una alternativa (en teoría &lt;b&gt;100% compatible con todos los unix&lt;/b&gt;) es utilizar el viejo y conocido &lt;b&gt;lsof&lt;/b&gt;, de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;snake-island:/Us*/jo*/Do*/data-integration: jonatan$ lsof -i -n&lt;br /&gt;COMMAND    PID                 USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME&lt;br /&gt;SystemUIS  170 jonatanalexisanauati   10u  IPv4 0x3d69d90      0t0  UDP *:*&lt;br /&gt;firefox-b  771 jonatanalexisanauati   67u  IPv4 0xa966a68      0t0  TCP 186.13.221.96:49801-&gt;74.125.47.83:https (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   69u  IPv4 0x9e50270      0t0  TCP 186.13.221.96:49816-&gt;74.125.47.83:https (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   72u  IPv4 0xa964a68      0t0  TCP 186.13.221.96:49758-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   82u  IPv4 0x85b7270      0t0  TCP 186.12.227.84:54534-&gt;17.149.160.21:http (CLOSED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   89u  IPv4 0xa96866c      0t0  TCP 186.13.221.96:49732-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;NewsFire  8831 jonatanalexisanauati    7u  IPv4 0xa964270      0t0  TCP 186.13.221.96:49761-&gt;74.125.47.133:http (CLOSE_WAIT)&lt;br /&gt;NewsFire  8831 jonatanalexisanauati   10u  IPv4 0xa968a68      0t0  TCP 186.13.221.96:49762-&gt;74.125.47.191:http (CLOSE_WAIT)&lt;br /&gt;NewsFire  8831 jonatanalexisanauati   11u  IPv4 0xa966e64      0t0  TCP 186.13.221.96:49810-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;el switch 'i' hace la magia, y hasta se puede ser un poco mas específico, &lt;br /&gt;por ejemplo si lo que se quiere es ver todas las conexiones tcp:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;snake-island:/Us*/jo*/taller: jonatan$ lsof -itcp -n&lt;br /&gt;COMMAND    PID                 USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME&lt;br /&gt;firefox-b  771 jonatanalexisanauati   67u  IPv4 0xa964e64      0t0  TCP 186.13.221.96:49769-&gt;74.125.47.17:https (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   69u  IPv4 0xa966a68      0t0  TCP 186.13.221.96:49755-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   71u  IPv4 0x9e50270      0t0  TCP 186.13.221.96:49757-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   72u  IPv4 0xa964a68      0t0  TCP 186.13.221.96:49758-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   74u  IPv4 0x9e5066c      0t0  TCP 186.13.221.96:49760-&gt;74.125.47.83:https (ESTABLISHED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   82u  IPv4 0x85b7270      0t0  TCP 186.12.227.84:54534-&gt;17.149.160.21:http (CLOSED)&lt;br /&gt;firefox-b  771 jonatanalexisanauati   89u  IPv4 0xa96866c      0t0  TCP 186.13.221.96:49732-&gt;74.125.47.191:http (ESTABLISHED)&lt;br /&gt;NewsFire  8831 jonatanalexisanauati    7u  IPv4 0xa964270      0t0  TCP 186.13.221.96:49761-&gt;74.125.47.133:http (CLOSE_WAIT)&lt;br /&gt;NewsFire  8831 jonatanalexisanauati   10u  IPv4 0xa968a68      0t0  TCP 186.13.221.96:49762-&gt;74.125.47.191:http (CLOSE_WAIT)&lt;br /&gt;NewsFire  8831 jonatanalexisanauati   11u  IPv4 0xa966e64      0t0  TCP 186.13.221.96:49763-&gt;74.208.86.247:http (CLOSE_WAIT)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este switch ('i') acepta el siguiente formato (según el man):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;                [46][protocol][@hostname|hostaddr][:service|port]&lt;br /&gt;&lt;br /&gt;                where:&lt;br /&gt;                     46 specifies the IP version, IPv4 or IPv6&lt;br /&gt;                          that applies to the following address.&lt;br /&gt;                          '6' may be be specified only if the UNIX&lt;br /&gt;                          dialect supports IPv6.  If neither '4' nor&lt;br /&gt;                          '6' is specified, the following address&lt;br /&gt;                          applies to all IP versions.&lt;br /&gt;                     protocol is a protocol name - TCP or UDP.&lt;br /&gt;                     hostname is an Internet host name.  Unless a&lt;br /&gt;                          specific IP version is specified, open&lt;br /&gt;                          network files associated with host names&lt;br /&gt;                          of all versions will be selected.&lt;br /&gt;                     hostaddr is a numeric Internet IPv4 address in&lt;br /&gt;                          dot form; or an IPv6 numeric address in&lt;br /&gt;                          colon form, enclosed in brackets, if the&lt;br /&gt;                          UNIX dialect supports IPv6.  When an IP&lt;br /&gt;                          version is selected, only its numeric&lt;br /&gt;                          addresses may be specified.&lt;br /&gt;                     service is an /etc/services name - e.g., smtp -&lt;br /&gt;                          or a list of them.&lt;br /&gt;                     port is a port number, or a list of them.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por lo que si queremos ver todas las conexiones tcp sobre ipv4, que se relacionen con google, se puede hacer algo como sigue:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;snake-island:/Us*/jo*/Do*/data-integration: jonatan$ lsof -i4tcp@www.google.com -n&lt;br /&gt;COMMAND   PID                 USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME&lt;br /&gt;firefox-b 771 jonatanalexisanauati   70u  IPv4 0xa96566c      0t0  TCP 186.13.221.96:49805-&gt;74.125.47.106:http (ESTABLISHED)&lt;br /&gt;firefox-b 771 jonatanalexisanauati   71u  IPv4 0xa965e64      0t0  TCP 186.13.221.96:49806-&gt;74.125.47.103:http (ESTABLISHED)&lt;br /&gt;firefox-b 771 jonatanalexisanauati   73u  IPv4 0xa964e64      0t0  TCP 186.13.221.96:49807-&gt;74.125.47.103:http (ESTABLISHED)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Referencias: &lt;br /&gt;&lt;b&gt;&lt;pre&gt;    lsof(8).&lt;/pre&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-6200167408606020303?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/6200167408606020303/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=6200167408606020303&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/6200167408606020303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/6200167408606020303'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2010/02/como-ver-conexiones-de-red-por-proceso.html' title='Como ver conexiones de red por proceso en MacOSX.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-5057652590224239271</id><published>2009-11-07T08:15:00.000-08:00</published><updated>2009-11-07T09:39:27.728-08:00</updated><title type='text'>Expresiones regulares en C.</title><content type='html'>El siguiente es un ejemplo de como utilizar expresiones regulares (POSIX RegEx) en C.&lt;br /&gt;&lt;br /&gt;Para windows, existe una implementación del módulo regex &lt;a href="http://gnuwin32.sourceforge.net/packages/regex.html"&gt; aquí&lt;/a&gt;. Con este sería posible compilar la aplicación (yo lo probé y funcionó), basta con agregar los directorios de includes y librerías, y decirle al compilador que enlace con la librería de regex.&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;1 &lt;/font&gt;&lt;font color="#80a0ff"&gt;/*&lt;/font&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;Ejemplo simple de expresiones regulares en C.&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;2 &lt;/font&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;* Para compilar:&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;3 &lt;/font&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;* linux:&amp;nbsp;&amp;nbsp; $ gcc ejemplo_regex.c -o ejemplo_regex -D_GNU_SOURCE -D__LINUX__&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;4 &lt;/font&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;* macosx:&amp;nbsp;&amp;nbsp;$ gcc ejemplo_regex.c -o ejemplo_regex -D__BSD__ &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;6 &lt;/font&gt;&lt;font color="#80a0ff"&gt;*/&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;7 &lt;/font&gt;&lt;font color="#80a0ff"&gt;//#define _GNU_SOURCE&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;8 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#include &lt;/font&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;9 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#include &lt;/font&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;10 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#include &lt;/font&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;11 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;12 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#ifndef _POSIX_C_SOURCE&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;13 &lt;/font&gt;&lt;font color="#ff80ff"&gt;# define _POSIX_C_SOURCE&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;14 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#endif&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;15 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#include &lt;/font&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;lt;regex.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;16 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;17 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#ifndef __LINUX__&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;18 &lt;/font&gt;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* strndup (&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* from, &lt;font color="#60ff60"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;len)&lt;br&gt;&lt;font color="#fbf204"&gt;19 &lt;/font&gt;{&lt;br&gt;&lt;font color="#fbf204"&gt;20 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* ret_str = &lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;NULL&lt;/font&gt;&lt;/span&gt;;&lt;br&gt;&lt;font color="#fbf204"&gt;21 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&lt;font color="#fbf204"&gt;22 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret_str= (&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;*)malloc ((len+&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;&lt;/span&gt;)*&lt;font color="#ffff60"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;));&lt;br&gt;&lt;font color="#fbf204"&gt;23 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(ret_str)&lt;br&gt;&lt;font color="#fbf204"&gt;24 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;&lt;font color="#fbf204"&gt;25 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strncpy (ret_str,from, len);&lt;br&gt;&lt;font color="#fbf204"&gt;26 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret_str[len]=&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;'\0'&lt;/font&gt;&lt;/span&gt;;&lt;br&gt;&lt;font color="#fbf204"&gt;27 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#fbf204"&gt;28 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;ret_str;&lt;br&gt;&lt;font color="#fbf204"&gt;29 &lt;/font&gt;}&lt;br&gt;&lt;font color="#fbf204"&gt;30 &lt;/font&gt;&lt;font color="#ff80ff"&gt;#endif&lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;31 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;32 &lt;/font&gt;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* get_string (&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* str, regmatch_t m)&lt;br&gt;&lt;font color="#fbf204"&gt;33 &lt;/font&gt;{&lt;br&gt;&lt;font color="#fbf204"&gt;34 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* dup = &lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;NULL&lt;/font&gt;&lt;/span&gt;;&lt;br&gt;&lt;font color="#fbf204"&gt;35 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;from = m.rm_so;&lt;br&gt;&lt;font color="#fbf204"&gt;36 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;to&amp;nbsp;&amp;nbsp; = m.rm_eo; &lt;br&gt;&lt;font color="#fbf204"&gt;37 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;38 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(from != -&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;&lt;/span&gt;)&lt;br&gt;&lt;font color="#fbf204"&gt;39 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;&lt;font color="#fbf204"&gt;40 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dup = strndup(str+from, (&lt;font color="#60ff60"&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt;)to-from);&lt;br&gt;&lt;font color="#fbf204"&gt;41 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#fbf204"&gt;42 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;dup;&lt;br&gt;&lt;font color="#fbf204"&gt;43 &lt;/font&gt;}&lt;br&gt;&lt;font color="#fbf204"&gt;44 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;45 &lt;/font&gt;main ()&lt;br&gt;&lt;font color="#fbf204"&gt;46 &lt;/font&gt;{&lt;br&gt;&lt;font color="#fbf204"&gt;47 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regex_t regex;&lt;br&gt;&lt;font color="#fbf204"&gt;48 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regmatch_t m[&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;4&lt;/font&gt;&lt;/span&gt;];&lt;br&gt;&lt;font color="#fbf204"&gt;49 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;i=&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;&lt;/span&gt;;&lt;br&gt;&lt;font color="#fbf204"&gt;50 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* pattern =&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;(^[^&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;\t&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;]+)(&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;\t&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;)([^&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;\t&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;]+$)&amp;quot;&lt;/font&gt;&lt;/span&gt;;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;font color="#fbf204"&gt;51 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* target = &lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;hola&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;\t&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;chau&amp;quot;&lt;/font&gt;&lt;/span&gt;;&lt;br&gt;&lt;font color="#fbf204"&gt;52 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;53 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* temp;&lt;br&gt;&lt;font color="#fbf204"&gt;54 &lt;/font&gt;&lt;br&gt;&lt;font color="#fbf204"&gt;55 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regcomp (&amp;amp;regex, pattern, REG_EXTENDED);&lt;br&gt;&lt;font color="#fbf204"&gt;56 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regexec (&amp;amp;regex, target, &lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;4&lt;/font&gt;&lt;/span&gt;, m, &lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;&lt;/span&gt;);&lt;br&gt;&lt;font color="#fbf204"&gt;57 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regfree (&amp;amp;regex);&lt;br&gt;&lt;font color="#fbf204"&gt;58 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(i=&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;&lt;/span&gt;; i&amp;lt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;4&lt;/font&gt;&lt;/span&gt;; i++)&lt;br&gt;&lt;font color="#fbf204"&gt;59 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;&lt;font color="#fbf204"&gt;60 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = get_string (target, m[i]);&lt;br&gt;&lt;font color="#fbf204"&gt;61 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(temp)&lt;br&gt;&lt;font color="#fbf204"&gt;62 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;&lt;font color="#fbf204"&gt;63 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;match: --&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;%s&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;--&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#fb8000"&gt;\n&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #0d0d0d"&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;, temp);&lt;br&gt;&lt;font color="#fbf204"&gt;64 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (temp);&lt;br&gt;&lt;font color="#fbf204"&gt;65 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;font color="#fbf204"&gt;66 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br&gt;&lt;font color="#fbf204"&gt;67 &lt;/font&gt;}&lt;br&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-5057652590224239271?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/5057652590224239271/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=5057652590224239271&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/5057652590224239271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/5057652590224239271'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2009/11/expresiones-regulares-en-c.html' title='Expresiones regulares en C.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-4770866272549522199</id><published>2009-07-03T18:03:00.000-07:00</published><updated>2009-07-03T18:18:49.710-07:00</updated><title type='text'>Django strftime template filter.</title><content type='html'>&lt;span style="font-family: arial;"&gt;A continuación el filtro, que vale aclarar que es muuuuy sencillo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;b&gt;strftime_filter.py:&lt;/b&gt;&lt;/span&gt;&lt;br/&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#a020f0"&gt;from&lt;/font&gt;&amp;nbsp;django.template &lt;font color="#a020f0"&gt;import&lt;/font&gt;&amp;nbsp;Library&lt;br&gt;register = Library()&lt;br&gt;&lt;br&gt;&lt;font color="#a020f0"&gt;@&lt;/font&gt;&lt;font color="#008b8b"&gt;register&lt;/font&gt;.filter&lt;br&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;strftime&lt;/font&gt;&amp;nbsp;(source,format_string):&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;source.strftime(str(format_string))&lt;br&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;y el caso práctico de uso:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#a020f0"&gt;{% &lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;load&lt;/b&gt;&lt;/font&gt;&lt;font color="#a020f0"&gt;&amp;nbsp;strftime_filter %}&lt;/font&gt;&lt;br&gt;&lt;font color="#008b8b"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;html&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;body&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;span&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#a020f0"&gt;{{myDate|strftime:&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;%d/%m/%Y&amp;quot;&lt;/font&gt;&lt;font color="#a020f0"&gt;}}&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;span&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;body&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#008b8b"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;html&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Y debería imprimir la fecha con el formato dd/mm/aaaa.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-4770866272549522199?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/4770866272549522199/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=4770866272549522199&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/4770866272549522199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/4770866272549522199'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2009/07/django-strftime-template-filter.html' title='Django strftime template filter.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-541874316758900109</id><published>2009-05-24T01:15:00.000-07:00</published><updated>2009-05-25T09:39:03.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firma digital'/><category scheme='http://www.blogger.com/atom/ns#' term='pk7 sign'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='C language'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Pkcs7 en C con OpenSSL.</title><content type='html'>En esta entrada muestro código de ejemplo para poder firmar un mensaje según la especificación Pkcs 7. Para hacerlo aprovecho el api que brinda el proyecto OpenSSL. Por razones obvias el lenguaje de programación es C.&lt;br /&gt;&lt;br /&gt;Una vez generado el binario ejecutable del siguiente código, tendremos una aplicación de terminal, que recibe tres parámetros:&lt;br /&gt;- ruta del archivo del certificado X509. Dicho archivo puede estar en formato PEM o DER.&lt;br /&gt;- ruta del archivo de la clave privada. También el formato puede ser PEM o DER.&lt;br /&gt;- mensaje para firmar.&lt;br /&gt;Para finalizar se imprime por stdout el resultado.&lt;br /&gt;&lt;br /&gt;Para compilar:&lt;br /&gt;&lt;pre&gt;jaa@dino-thunder_ng ~/taller $ gcc pkcs7_sign.c -o pkcs7_sign -lssl&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente deben estar instalados OpenSSL y sus headers de desarrollo para poder compilar.&lt;br /&gt;&lt;br /&gt;A continuación el ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#a020f0"&gt;#include &lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;lt;openssl/x509.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;extern&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;FILE&lt;/b&gt;&lt;/font&gt;&amp;nbsp;*&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* pkcs7_sign &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* certfile,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* keyfile,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* message,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* cert_passwd,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* key_passwd);&lt;br /&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;main (&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&amp;nbsp;argc, &lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;** argv)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* pk7sm= &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(argc != &lt;font color="#ff00ff"&gt;4&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&lt;font color="#ff00ff"&gt;&amp;quot;MODO DE USO: &lt;/font&gt;&lt;font color="#6a5acd"&gt;%s&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;nbsp;cert_file key_file, message&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;,argv[&lt;font color="#ff00ff"&gt;0&lt;/font&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit (&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pk7sm=pkcs7_sign (argv[&lt;font color="#ff00ff"&gt;1&lt;/font&gt;],argv[&lt;font color="#ff00ff"&gt;2&lt;/font&gt;],argv[&lt;font color="#ff00ff"&gt;3&lt;/font&gt;],&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;,&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(pk7sm != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf (&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;%s&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;,pk7sm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Error inesperado.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit (&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit (&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;X509 * load_file (&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* fname)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;FILE&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* fp&amp;nbsp;&amp;nbsp; = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509 * cert = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp = fopen ((&lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;*)fname, &lt;font color="#ff00ff"&gt;&amp;quot;r&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(fp == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror (&lt;font color="#ff00ff"&gt;&amp;quot;fopen()&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cert = d2i_X509_fp(fp, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(cert != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;success;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(cert == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rewind (fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cert = (X509 *)PEM_read_X509 (fp, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;success&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose (fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;cert;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;EVP_PKEY * load_key_file (&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* fname)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;FILE&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* fp&amp;nbsp;&amp;nbsp; = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EVP_PKEY * pkey = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp = fopen ((&lt;font color="#2e8b57"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;*)fname, &lt;font color="#ff00ff"&gt;&amp;quot;r&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(fp == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror (&lt;font color="#ff00ff"&gt;&amp;quot;fopen()&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pkey = d2i_PrivateKey_fp (fp, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(pkey != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;success;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(pkey == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rewind (fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pkey = (EVP_PKEY *) PEM_read_PrivateKey (fp, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;success&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose (fp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;pkey;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* pkcs7_sign &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* certfile,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* keyfile,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* message,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* cert_passwd,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* key_passwd)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PKCS7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * scms&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cert&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EVP_PKEY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* pkey&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * message_bio&amp;nbsp;&amp;nbsp; = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * signed_message= &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* bio_data_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* smessage&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp; bio_data_len&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cert = load_file (certfile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(cert == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Formato de certificado no valido: DER o PEM&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pkey = load_key_file (keyfile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(pkey == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Formato de clave no valido: DER o PEM&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message_bio = BIO_new_mem_buf (message, strlen(message));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(message_bio == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Error creando buffer.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSL_library_init();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scms = PKCS7_sign (cert, pkey, &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;, message_bio, PKCS7_DETACHED);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(scms == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/font&gt;&amp;nbsp;err= ERR_get_error ();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;* err_txt = (&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;*)ERR_error_string (err);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Error firmando pkcs7 (&lt;/font&gt;&lt;font color="#6a5acd"&gt;%i&lt;/font&gt;&lt;font color="#ff00ff"&gt;): &lt;/font&gt;&lt;font color="#6a5acd"&gt;%s&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;,\\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;)err,((err_txt==&lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)?&lt;font color="#ff00ff"&gt;&amp;quot; &amp;quot;&lt;/font&gt;:err_txt));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signed_message = BIO_new (BIO_s_mem());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(signed_message == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Error creando buffer.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(PEM_write_bio_PKCS7 (signed_message, scms) &amp;lt;= &lt;font color="#ff00ff"&gt;0&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf (&lt;font color="#ff00ff"&gt;stderr&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Error transportando a PEM.&lt;/font&gt;&lt;font color="#6a5acd"&gt;\\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bio_data_len =BIO_get_mem_data (signed_message, &amp;amp;bio_data_ptr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;smessage = (&lt;font color="#2e8b57"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;&amp;nbsp;*)malloc (bio_data_len + &lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(smessage == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror (&lt;font color="#ff00ff"&gt;&amp;quot;malloc ()&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt;&amp;nbsp;finally;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy (smessage, bio_data_ptr, bio_data_len);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*(smessage+bio_data_len)=&lt;font color="#6a5acd"&gt;\'\\0\'&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;finally&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(message_bio != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO_free(message_bio);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(signed_message != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIO_free(signed_message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(cert != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509_free(cert);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(pkey != &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EVP_PKEY_free(pkey);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;smessage;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-541874316758900109?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/541874316758900109/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=541874316758900109&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/541874316758900109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/541874316758900109'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2009/02/pkcs7-en-c-con-openssl.html' title='Pkcs7 en C con OpenSSL.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-8103668413986521034</id><published>2009-02-28T17:12:00.000-08:00</published><updated>2009-02-28T18:05:27.906-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo web'/><category scheme='http://www.blogger.com/atom/ns#' term='django tables update'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='django_evolution example'/><category scheme='http://www.blogger.com/atom/ns#' term='como actualizar tablas en django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='django models update'/><category scheme='http://www.blogger.com/atom/ns#' term='sincronizar tablas'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Actualización de modelos con Django Evolution.</title><content type='html'>Últimamente, es estado jugando bastante con &lt;a href="http://www.djangoproject.com/" target="_blank"&gt;Django&lt;/a&gt;, la y la verdad es fantástico. &lt;br /&gt;&lt;br /&gt;Lo único que le encuentro un poco engorroso es el hecho de que una vez creado un modelo de datos, django no permite la modificación del mismo. Busqué sin cesar opciones para probar hasta que desistí y dije, ok, con cada modificación que haga, tendré que actualizar las tablas en bd a mano, o resignarme a perder mis datos de prueba (con un sqlreset).&lt;br /&gt;&lt;br /&gt;Hasta que hace un rato, sin querer me encontré con una opcion: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://code.google.com/p/django-evolution/" target="_blank"&gt;Django Evolution&lt;/a&gt;&lt;/span&gt;. Este corresponde con un proyecto independiente a Django (o por lo menos eso creo), se instala como un paquete python más, y luego puede usarse desde el aplicativo manage.py para sincronizar nuestras tablas.&lt;br /&gt;&lt;br /&gt;Descarga e instalación:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ svn co http://django-evolution.googlecode.com/svn/trunk/ django-evolution&lt;br /&gt;$ cd django-evolution &amp;&amp; sudo python setup.py install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;luego para poder utilizarlo en nuestro proyecto solo basta con agregar django_evolution a nuestro INSTALLED_APPS:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$cd /path/a/nuestro/proyecto/django&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;editar settings.py y agregar la linea 'django_evolution' a nuestras aplicaciones:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;INSTALLED_APPS = (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;django.contrib.auth&lt;/font&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;django.contrib.contenttypes&lt;/font&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;django.contrib.sessions&lt;/font&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;django.contrib.sites&lt;/font&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;django.contrib.admin&lt;/font&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;django_evolution&lt;/font&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&lt;font color="#ff00ff"&gt;miweb.miaplicacion&lt;/font&gt;'&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;y ya está listo para usarse, para hacerlo en primer lugar hay que hacer un syncdb normal, de esta forma, django_evolution generá unas tablas extra en nuestra base de datos, en estas tablas guardará toda la meta información de nuestro proyecto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder_ng ~/taller/miweb $ python manage.py syncdb&lt;br /&gt;Creating table django_project_version&lt;br /&gt;Creating table django_evolution&lt;br /&gt;Installing baseline version&lt;br /&gt;Installing index for django_evolution.Evolution model&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;y después de esto podemos ir modificando modelos al vuelo, y luego para actualizar las tablas haremos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder_ng ~/taller/miweb $ python manage.py  evolve --hint --execute&lt;br /&gt;&lt;br /&gt;You have requested a database evolution. This will alter tables&lt;br /&gt;and data currently in the 'django_miweb' database, and may result in&lt;br /&gt;IRREVERSABLE DATA LOSS. Evolutions should be *thoroughly* reviewed&lt;br /&gt;prior to execution.&lt;br /&gt;&lt;br /&gt;Are you sure you want to execute the evolutions?&lt;br /&gt;&lt;br /&gt;Type 'yes' to continue, or 'no' to cancel: yes&lt;br /&gt;Evolution successful.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;y luego con cada cambio podemos repetir nuestro último comando, dejando atrás syncdb.&lt;br /&gt;&lt;br /&gt;Agrego un ejemplo, supongamos que generé mi proyecto, y tengo el archivo models.py con el siguiente contenido:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;DireccionFields&lt;/font&gt;&amp;nbsp;(models.Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;font color="#ff00ff"&gt;&amp;nbsp;Objeto que simplemente guarda la direccion de una entidad/persona/...&lt;/font&gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calle = models.CharField (max_length=100, blank=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;altura= models.IntegerField (blank=True, null=True)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Entonces hago:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder_ng ~/nueva_web $ python manage.py syncdb&lt;br /&gt;Creating table auth_permission&lt;br /&gt;Creating table auth_group&lt;br /&gt;Creating table auth_user&lt;br /&gt;Creating table auth_message&lt;br /&gt;Creating table django_content_type&lt;br /&gt;Creating table django_session&lt;br /&gt;Creating table django_site&lt;br /&gt;Creating table django_admin_log&lt;br /&gt;Creating table django_project_version&lt;br /&gt;Creating table django_evolution&lt;br /&gt;Creating table prueba_direccionfields&lt;br /&gt;&lt;br /&gt;You just installed Django's auth system, which means you don't have any superusers defined.&lt;br /&gt;Would you like to create one now? (yes/no): yes&lt;br /&gt;Username (Leave blank to use 'jaa'): JAA   &lt;br /&gt;E-mail address: barakawins@gmail.com&lt;br /&gt;Password: &lt;br /&gt;Password (again): &lt;br /&gt;Superuser created successfully.&lt;br /&gt;Installing baseline version&lt;br /&gt;Installing index for auth.Permission model&lt;br /&gt;Installing index for auth.Message model&lt;br /&gt;Installing index for admin.LogEntry model&lt;br /&gt;Installing index for django_evolution.Evolution model&lt;br /&gt;&lt;br /&gt;Installing index for django_evolution.Evolution model&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Luego, cambio el modelo anterior:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;DireccionFields&lt;/font&gt;&amp;nbsp;(models.Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;font color="#ff00ff"&gt;&amp;nbsp;Objeto que simplemente guarda la direccion de una entidad/persona/...&lt;/font&gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calle = models.CharField (max_length=100, blank=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;altura= models.IntegerField (blank=True, null=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;depto&amp;nbsp;&amp;nbsp; = models.CharField (max_length=25, blank=True)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Invoco la actualizacion de la tabla:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder_ng ~/nueva_web $ python manage.py  evolve --hint --execute&lt;br /&gt;&lt;br /&gt;You have requested a database evolution. This will alter tables&lt;br /&gt;and data currently in the 'django_miweb_p' database, and may result in&lt;br /&gt;IRREVERSABLE DATA LOSS. Evolutions should be *thoroughly* reviewed&lt;br /&gt;prior to execution.&lt;br /&gt;&lt;br /&gt;Are you sure you want to execute the evolutions?&lt;br /&gt;&lt;br /&gt;Type 'yes' to continue, or 'no' to cancel: yes&lt;br /&gt;Evolution successful.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder_ng ~/nueva_web $ mysql mi_base&lt;br /&gt;mysql&gt; describe prueba_direccionfields;&lt;br /&gt;+--------+--------------+------+-----+---------+----------------+&lt;br /&gt;| Field  | Type         | Null | Key | Default | Extra          |&lt;br /&gt;+--------+--------------+------+-----+---------+----------------+&lt;br /&gt;| id     | int(11)      | NO   | PRI | NULL    | auto_increment | &lt;br /&gt;| calle  | varchar(100) | NO   |     | NULL    |                | &lt;br /&gt;| altura | int(11)      | YES  |     | NULL    |                | &lt;br /&gt;| depto  | varchar(25)  | NO   |     | NULL    |                | &lt;br /&gt;+--------+--------------+------+-----+---------+----------------+&lt;br /&gt;4 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;y apareció nuestro nuevo campo!.&lt;br /&gt;&lt;br /&gt;Otra cosa importante, es que django-evolution puede agregarse a cualquier proyecto existente previamente, pero siempre hay que recordar ejecutar el syncdb la primera vez.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-8103668413986521034?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/8103668413986521034/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=8103668413986521034&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/8103668413986521034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/8103668413986521034'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2009/02/actualizacion-de-modelos-en-django-con.html' title='Actualización de modelos con Django Evolution.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-3760899329954209884</id><published>2008-11-07T13:03:00.000-08:00</published><updated>2008-11-07T13:33:46.727-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Descarga de módulos sin utilizar.</title><content type='html'>&lt;span style="font-family:arial;"&gt;En muchas oportunidades hay distros linux que nos dejan por defecto el sistema configurado para que al arranque se carguen gran cantidad de módulos que no tienen sentido para nuestro sistema particular.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;En general podemos identificarlos porque su contador de referencias esta en 0 (cero) cuando vemos el listado con el comando "lsmod".  Pero también puede que halla módulos cuyo contador de refencias sea cero y sin embargo, estén siendo utilizados de todas formas, por ejemplo módulos cuya función es la del monitoreo de alguna característica del sistema e informarla por algún fichero virtual dentro de /proc por ejemplo (o tal vez /sys), o módulos para controladoras usb (ohci, ehci...), módulos para controlar placas de red, etc.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;El script que presento mas abajo lo que hace es descargar todos los módulos cuyo contador de refenrencias sea 0 (cero) para alivianar un poco el sistema. La idea es ejecutar este, y luego cargar solo los módulos que son necesarios de alguna otra forma (tal vez otro script).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo de uso:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder_ng ~ $ lsmod | wc -l   &lt;br /&gt;111&lt;br /&gt;jaa@dino-thunder_ng ~ $ sudo ./modules_unload&lt;br /&gt;Removiendo bsd_comp............ok&lt;br /&gt;Removiendo ppp_synctty.........ok&lt;br /&gt;Removiendo snd_pcm_oss.........ok&lt;br /&gt;Removiendo snd_seq_oss.........ok&lt;br /&gt;Removiendo snd_hda_intel.......ok&lt;br /&gt;Removiendo wlan_scan_sta.......ok&lt;br /&gt;Removiendo ath_pci.............ok&lt;br /&gt;Removiendo 8139too.............ok&lt;br /&gt;Removiendo battery.............ok&lt;br /&gt;Removiendo tg3.................ok&lt;br /&gt;Removiendo e1000...............ok&lt;br /&gt;Removiendo raid10..............ok&lt;br /&gt;Removiendo raid456.............ok&lt;br /&gt;Removiendo raid1...............ok&lt;br /&gt;Removiendo raid0...............ok&lt;br /&gt;Removiendo dm_bbr..............ok&lt;br /&gt;Removiendo dm_snapshot.........ok&lt;br /&gt;Removiendo dm_mirror...........ok&lt;br /&gt;Removiendo sbp2................ok&lt;br /&gt;Removiendo ohci1394............ok&lt;br /&gt;Removiendo sl811_hcd...........ok&lt;br /&gt;Removiendo usbhid..............ok&lt;br /&gt;Removiendo ohci_hcd............ok&lt;br /&gt;Removiendo uhci_hcd............ok&lt;br /&gt;Removiendo usb_storage.........ok&lt;br /&gt;Removiendo ehci_hcd............ok&lt;br /&gt;Removiendo lpfc................ok&lt;br /&gt;Removiendo qla2xxx.............ok&lt;br /&gt;Removiendo megaraid_sas........ok&lt;br /&gt;Removiendo megaraid_mbox.......ok&lt;br /&gt;Removiendo megaraid............ok&lt;br /&gt;Removiendo aacraid.............ok&lt;br /&gt;Removiendo sx8.................ok&lt;br /&gt;Removiendo DAC960..............ok&lt;br /&gt;Removiendo cciss...............ok&lt;br /&gt;Removiendo cpqarray............ok&lt;br /&gt;Removiendo 3w_9xxx.............ok&lt;br /&gt;Removiendo 3w_xxxx.............ok&lt;br /&gt;Removiendo mptsas..............ok&lt;br /&gt;Removiendo mptfc...............ok&lt;br /&gt;Removiendo mptspi..............ok&lt;br /&gt;Removiendo atp870u.............ok&lt;br /&gt;Removiendo dc395x..............ok&lt;br /&gt;Removiendo qla1280.............ok&lt;br /&gt;Removiendo dmx3191d............ok&lt;br /&gt;Removiendo sym53c8xx...........ok&lt;br /&gt;Removiendo qlogicfas408........ok&lt;br /&gt;Removiendo advansys............ok&lt;br /&gt;Removiendo initio..............ok&lt;br /&gt;Removiendo BusLogic............ok&lt;br /&gt;Removiendo arcmsr..............ok&lt;br /&gt;Removiendo aic7xxx.............ok&lt;br /&gt;Removiendo aic79xx.............ok&lt;br /&gt;Removiendo sg..................ok&lt;br /&gt;Removiendo pdc_adma............ok&lt;br /&gt;Removiendo sata_inic162x.......ok&lt;br /&gt;Removiendo sata_mv.............ok&lt;br /&gt;Removiendo ahci................ok&lt;br /&gt;Removiendo sata_qstor..........ok&lt;br /&gt;Removiendo sata_vsc............ok&lt;br /&gt;Removiendo sata_uli............ok&lt;br /&gt;Removiendo sata_sis............ok&lt;br /&gt;Removiendo sata_sx4............ok&lt;br /&gt;Removiendo sata_nv.............ok&lt;br /&gt;Removiendo sata_via............ok&lt;br /&gt;Removiendo sata_svw............ok&lt;br /&gt;Removiendo sata_sil24..........ok&lt;br /&gt;Removiendo sata_promise........ok&lt;br /&gt;Removiendo scsi_wait_scan......ok&lt;br /&gt;Removiendo pata_pcmcia.........ok&lt;br /&gt;Removiendo b1..................ok&lt;br /&gt;jaa@dino-thunder_ng ~ $ lsmod | wc -l&lt;br /&gt;40&lt;br /&gt;jaa@dino-thunder_ng ~ $ sudo modprobe 8139too&lt;br /&gt;jaa@dino-thunder_ng ~ $ sudo modprobe ohci_hcd&lt;br /&gt;jaa@dino-thunder_ng ~ $ sudo modprobe battery&lt;br /&gt;jaa@dino-thunder_ng ~ $ sudo pppoe-start&lt;br /&gt;jaa@dino-thunder_ng ~ $ lsmod | wc -l&lt;br /&gt;46&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;como se ve al correr el script se eliminaron unos 71 módulos inmediatamente, pero luego yo me quedé sin placa de red, sin usb, y sin monitoreo de batería, entonces cargo los tres módulos que a mi sirven:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;8139too para la paca de red&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ohci_hcd para la controladora usb.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;battery para el monitoreo de la batería.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;y rearranco mi conexion pppoe:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;sudo pppoe-start&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Luego vuelvo a ver la cantidad de módulos cargados y subió solo a 46! un gran número!!.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El script es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Autor: Jonatan Anauati.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Licencia: LGPL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Descarga los modulos "sin utilizar" (contador de refencias a 0).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;function&lt;/span&gt; &lt;span style="color: rgb(0, 139, 139);"&gt;print_space ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;r&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;$1&lt;/span&gt;-&lt;span style="color: rgb(160, 32, 240);"&gt;$2&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;while &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;$r&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;-gt&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;-n&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;";&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;r&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;$r&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;-1&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;done&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 139, 139);"&gt;ret&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;for &lt;/b&gt;&lt;/span&gt;modname &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;$(&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;lsmod &lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;|&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt; &lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;awk&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt; --posix &lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;'&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;/.+[ ]{2}0[ ]?$/ {print $1;}&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;'&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;)&lt;/span&gt; ; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;let&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 139, 139);"&gt;ret&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;-n&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;Removiendo &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;$modname&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;     print_space &lt;span style="color: rgb(255, 0, 255);"&gt;20&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;${#&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;modname&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;}&lt;/span&gt;&lt;br /&gt;     rmmod &lt;span style="color: rgb(160, 32, 240);"&gt;$modname&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt; /dev/null &lt;span style="color: rgb(255, 0, 255);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt; /dev/null&lt;br /&gt;     &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;[&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;$?&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;-eq&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;0&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;]&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;&amp;amp;&amp;amp;&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt; ok &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;||&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;echo&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;fallo (&lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;$?&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;done&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(160, 32, 240);"&gt;$ret&lt;/span&gt;;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se me ocurren algunas modificaciones, tal vez sería una buena idea hacer que reciba como parámetro los módulos que no quisiéramos que se descarguen, ya que para algún caso particular podría dejar el sistema inutilizable.&lt;br /&gt;&lt;br /&gt;Esto es todo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-3760899329954209884?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/3760899329954209884/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=3760899329954209884&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/3760899329954209884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/3760899329954209884'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/11/descarga-de-mdulos-sin-utilizar.html' title='Descarga de módulos sin utilizar.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-1490496365887898562</id><published>2008-10-04T16:20:00.000-07:00</published><updated>2008-10-04T20:05:16.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programing'/><category scheme='http://www.blogger.com/atom/ns#' term='linux network programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C programming'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='socket'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ioctl'/><category scheme='http://www.blogger.com/atom/ns#' term='C language'/><category scheme='http://www.blogger.com/atom/ns#' term='linux network programing'/><category scheme='http://www.blogger.com/atom/ns#' term='C programing'/><category scheme='http://www.blogger.com/atom/ns#' term='HWAddr'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Obteniendo información de la interfaz de red desde C.</title><content type='html'>Bueno, en el siguiente ejemplo muestro como puede obtenerse la Hardware address (dirección MAC)de una placa de red ethernet en un sistema linux.&lt;br /&gt;&lt;br /&gt;Si bien el código parece algo intimidante al principio, conforme la pelea avanza uno se va amigando, hasta finalmente entenderlo.&lt;br /&gt;&lt;br /&gt;La idea es sencilla: se levanta un socket (uso "socket ()"), sobre el cual utilizamos "ioctl()" para preguntar la dirección de hardware. ioctl no sirve solo para esta función, esta es una genérica del sistema operativo, que nos permite interactuar con los ficheros especiales (dispositivos) para obtener y setear paramétros específicos de configuración. por ejemplo lo que hacemos aquí es preguntar por la dirección hardware; otro ejemplo pordría ser abrir la lectora de dvd, etc.&lt;br /&gt;&lt;br /&gt;Dejando de lado las palabras, pongo el código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;net/if.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;net/ethernet.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SUCCESS &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;/*&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; La siguiente macro recibe como parametros:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt; *  struct sockaddr * sockaddr_ptr;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt; *  char * char_ptr;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt; * Retorna la direccion MAC, formateada de a dos valores hexadecimales&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt; * separados por putos: 00:AF:...&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define GET_HW_ADDR_STRING(sockaddr_ptr, charptr)               \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;    snprintf (charptr, &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;18&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;, &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%02X&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;:&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%02X&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;:&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%02X&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;:&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%02X&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;:&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%02X&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;:&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%02X&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;,     \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;        (&lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;) sockaddr_ptr-&amp;gt;sa_data[&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;],               \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;        (&lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;) sockaddr_ptr-&amp;gt;sa_data[&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;],               \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;        (&lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;) sockaddr_ptr-&amp;gt;sa_data[&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;2&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;],               \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;        (&lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;) sockaddr_ptr-&amp;gt;sa_data[&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;3&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;],               \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;        (&lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;) sockaddr_ptr-&amp;gt;sa_data[&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;4&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;],               \&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;        (&lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;) sockaddr_ptr-&amp;gt;sa_data[&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;5&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;long&lt;/b&gt;&lt;/span&gt; get_hw_addr (&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt; ifreq * ifdata);&lt;br /&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; main (&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; argc, &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; ** argv)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt; ifreq request;&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt; sockaddr * addr;&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; string_addr[&lt;span style="color:#ff00ff;"&gt;18&lt;/span&gt;];&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; fd=&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;, query_result=&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;   &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; (argc != &lt;span style="color:#ff00ff;"&gt;2&lt;/span&gt;)&lt;br /&gt;   {&lt;br /&gt;       printf (&lt;span style="color:#ff00ff;"&gt;"MODO DE USO: &lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%s&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt; interfaz ethernet.&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;\n&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;,argv[&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;]);&lt;br /&gt;       printf (&lt;span style="color:#ff00ff;"&gt;"Imprime la direccion de hardware de la interfaz seleccionada.&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;\n&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;);&lt;br /&gt;       printf (&lt;span style="color:#ff00ff;"&gt;"Ej: &lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%s&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt; eth0&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;\n&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;,argv[&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;]);&lt;br /&gt;       &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   fd = socket (PF_INET, SOCK_STREAM, &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;);&lt;br /&gt;   &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; (fd == -&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;)&lt;br /&gt;   {&lt;br /&gt;       perror (&lt;span style="color:#ff00ff;"&gt;"No puedo abrir socket."&lt;/span&gt;);&lt;br /&gt;       &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   strncpy((&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;*)request.ifr_name,(&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;*)argv[&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;],IFNAMSIZ);&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;/*&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; La siguiente llamada hace la magia negra.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;     * Para ver todos los ioctls: man netdevice.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;     * De esta forma se pueden realizar muchas operaciones con nuestra&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;     * interfaz (seteo de mac addr, get de metrica,...).&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;     &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;*/&lt;/span&gt;&lt;br /&gt;   query_result = ioctl (fd, SIOCGIFHWADDR, &amp;amp;request);&lt;br /&gt;   &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; (query_result !=&lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;)&lt;br /&gt;   {&lt;br /&gt;       perror (&lt;span style="color:#ff00ff;"&gt;"No puedo obtener la informacion de la interfaz seleccionada"&lt;/span&gt;);&lt;br /&gt;       &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   close (fd);&lt;br /&gt;   addr= &amp;amp;(request.ifr_hwaddr);&lt;br /&gt;   GET_HW_ADDR_STRING (addr, string_addr);&lt;br /&gt;   printf(&lt;span style="color:#ff00ff;"&gt;"HWAddr: &lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;%s&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;\n&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;, string_addr);&lt;br /&gt;   &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;para compilar simplemente poner el codigo en "ethaddr.c" y luego:&lt;br /&gt;$ gcc ethaddr.c -o ethaddr&lt;br /&gt;&lt;br /&gt;Bueno, espero que le sea de utilidad a alguien.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;man socket (2)&lt;br /&gt;man ioctl (2)&lt;br /&gt;man netdevice (7)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-1490496365887898562?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/1490496365887898562/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=1490496365887898562&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/1490496365887898562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/1490496365887898562'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/10/obteniendo-informacin-de-la-interfaz-de.html' title='Obteniendo información de la interfaz de red desde C.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-8303757110809330884</id><published>2008-08-29T12:04:00.000-07:00</published><updated>2008-08-29T16:56:08.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seguridad informática'/><category scheme='http://www.blogger.com/atom/ns#' term='bases de datos'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='openssl'/><category scheme='http://www.blogger.com/atom/ns#' term='certificados x509'/><category scheme='http://www.blogger.com/atom/ns#' term='red'/><title type='text'>Mysql con SSL. Reforzando la seguridad.</title><content type='html'>&lt;span style="font-weight: bold;font-family:arial;" &gt;&lt;span style="font-weight: bold;"&gt;En esta entrada muestro configurar un servidor mysql y uno (o varios) clientes para realizar las conexiones mediante ssl.&lt;br /&gt;&lt;br /&gt;NOTA: Aclaro que toda la información necesaria la saqué directamente de la documentación oficial de mysql.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;REQUERIMIENTOS:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Para hacer todo necesitaremos:&lt;br /&gt;1. Servidor mysql (compilado con soporte a yaSSL).&lt;br /&gt;2. Cliente mysql (compilado con soporte a yaSSL).&lt;br /&gt;3. OpenSSL.&lt;br /&gt;4. Ganas de intentar.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;MANOS A LA OBRA:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:arial;"&gt;Básicamente son 3 pasos:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    1. Crear los cerficados y claves privadas para:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             - El CA (servidor mismo en este caso), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             - Servidor.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;             - Cliente(s).    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    2. Ejecutar el servidor, indicandole los parámetros indicados.&lt;/span&gt;&lt;br /&gt;3. Verificar y corregir bug que nos impediría la conexion con ssl.&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    4. Añadir las restricciones de seguridad por usuario:&lt;br /&gt;- Nivel 1: Solo asegura la identidad del servidor.&lt;br /&gt;- Nivel 2: Obliga al cliente a validar la identidad del servidor.&lt;br /&gt;- Nivel 3: Asegura que cada usuario está certificado por el CA (sin importar quien sea), además de hacer lo que hace el nivel 1.&lt;br /&gt;- Nivel 4: Asegura lo mismo que 1, y añade que cada usuario debe si o sí obtener su certificado y clave privada para poder conectar con el servidor.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;    5. Conectar el cliente al servidor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Paso 1:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt; Crear los cerficados y claves privadas.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Creando certificados:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    CA&lt;/span&gt;,&lt;br /&gt;&lt;pre&gt;mysqladmin@gaspar:~/mysql_certs$ openssl genrsa 2048 &gt; ca-key.pem&lt;br /&gt;mysqladmin@gaspar:~/mysql_certs$ openssl req -new -x509 -nodes -days 1000 -key ca-key.pem &gt; ca-cert.pem&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y respondemos a todas las preguntas...&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Con eso generamos la clave privada y el certificado del CA (entidad de certificación) que este caso seremos nosotros mismos. Todo esto se podría haber hecho en un solo paso como se muestra a continuación con el primer comando invocado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    -SERVER&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;mysqladmin@gaspar:~/mysql_certs$ openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server key.pem &gt; server-req.pem&lt;br /&gt;mysqladmin@gaspar:~/mysql_certs$ openssl x509 -req -in server-req.pem -days 1000  -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 &gt; server-cert.pem&lt;br /&gt;&lt;/pre&gt;Es importante entender que en el primer paso generamos la clave privada y el archivo con los datos de identidad del servidor (req), y que en el seguno paso lo que hacemos es firmar este archivo req con la clave privada del CA (y además agregamos el certificado de este), generando el certificado del servidor:&lt;br /&gt;"server-cert.pem".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-CLIENTE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un primer cliente.&lt;br /&gt;&lt;pre&gt;mysqladmin@gaspar:~/mysql_certs$ openssl req -newkey rsa:2048 -days 1000  -nodes -keyout jaa-key.pem &gt; jaa-req.pem&lt;br /&gt;mysqladmin@gaspar:~/mysql_certs$ openssl x509 -req -in jaa-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 &gt; jaa-cert.pem&lt;br /&gt;&lt;/pre&gt;Un segundo cliente.&lt;br /&gt;&lt;pre&gt;mysqladmin@gaspar:~/mysql_certs$ openssl req -newkey rsa:2048 -days 1000 -nodes -keyout pepe-key.pem &gt; pepe-req.pem&lt;br /&gt;mysqladmin@gaspar:~/mysql_certs$ openssl x509 -req -in pepe-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 &gt; pepe-cert.pem&lt;br /&gt;&lt;/pre&gt;Con esto generamos la clave privada y el certificado para dos clientes: jaa y pepe. Si necesitamos generar más simplemente volvemos a ejecutar estos dos pasos (pero obviamente cambiando los nombres de los archivos de salida!).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Paso 2: &lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Ejecutar el servidor, indicandole los parámetros necesarios&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;Este paso es sencillo, simplemente invocamos al servidor, pero debemos indicarle los parámetros necesarios para que este use su clave privada y certificado, además del certificado del CA para que pueda luego validar a los demás usuarios.&lt;br /&gt;&lt;pre&gt;mysqladmin@gaspar:~/mysql_certs$ mysqld --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Paso 3:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt; Verificar y corregir bug que nos impedirá la conexión con ssl.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;Bueno este bug a mi me ocurre en linux, y SOLO CON EL CLIENTE MYSQL, para la siguiente version:&lt;br /&gt;&lt;pre&gt;jaa@dino-thunder:~$ mysql --version&lt;br /&gt;mysql  Ver 14.12 Distrib 5.0.38, for pc-linux-gnu (i486) using readline 5.2&lt;br /&gt;&lt;/pre&gt;el tema es que cuando intentemos conectar utilizando las opciones avanzadas de ssl no podremos conectar por un supuesto error de SSL:&lt;br /&gt;"ERROR 2026 (HY000): SSL connection error"&lt;br /&gt;entonces hacemos:&lt;br /&gt;&lt;pre&gt;root@Patrulla-Delta:/home/jaa/mysql-cert/2# echo "192.168.1.1" &gt;&gt; /etc/hosts&lt;br /&gt;&lt;/pre&gt;Obviamente hay que reemplazar la direccion ip con la del servidor real.&lt;br /&gt;Supongo que obteniendo las fuentes del último mysql client, y compilando el error debería desaparecer, una alternativa es compilar utilizando openssl ya que por defecto en mysql se usa yaSSL, esto por temas de compativilidad entre licencias.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resalto que  en windows no he tenido ningún problema al respecto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Paso 4:&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt; Añadir las restricciones de seguridad por usuario&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;MySql ofrece 4 niveles de seguridad configurables, para la mayor seguridad, debe aplicarse el nivel 4.&lt;br /&gt;&lt;br /&gt;Antes de continuar informo algunas cosas simples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ip del servidor: 192.168.1.1&lt;/li&gt;&lt;li&gt;host cliente: Patrulla-Delta.local&lt;/li&gt;&lt;li&gt;Todos los certificados fueron generados en el servidor pero deben copiarse al host cliente en algún lugar (en lo posible al hacer transferencias por red siempre utilizar scp!).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Nivel 1-&lt;/span&gt; Este nivel se aplica solo del lado cliente, y consiste que al conectar contra el servidor hagamos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ mysql --ssl-ca=ca-cert.pem -u usuario ...&lt;br /&gt;&lt;/pre&gt;con esto aseguramos que ningún host intermedio robe la identidad del host servidor, es decir aseguramos la identidad del servidor, ya que este está corriendo (según lo que hicimos en 2) utilizando su certificado y clave privada, por lo tanto ahora nuestro cliente validará la firma del certificado servidor con el certificado del CA que indicamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nivel 2 &lt;/span&gt;- Este nivel lo que hace es obligar al cliente a que cumpla uno de los dos requerimientos:&lt;br /&gt;1. Presentar el certificado del CA (con este el cliente valida al servidor).&lt;br /&gt;2. Validar con un certificado firmado por el CA (y obviamente utilizando su clave privada).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; create user pepe@'%' identified by 'lalala';&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON *.* TO 'jaa'@'%' REQUIRE SSL;&lt;br /&gt;mysql&gt; flush privileges;&lt;br /&gt;&lt;/pre&gt;Entonces para conectar&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ mysql --ssl-ca=ca-cert.pem -u pepe -p&lt;br /&gt;Enter password:&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 71&lt;br /&gt;Server version: xxxxx&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;Y uno se pregunta: pero cual es la diferencia con el nivel anterior?&lt;br /&gt;Bueno, la diferencia está en que ahora el servidor nos obliga a presentar el certificado del CA.&lt;br /&gt;&lt;pre&gt;jaa@Patrulla-Delta:~/mysql-cert/2$ mysql -u pepe -p -h 192.168.1.1&lt;br /&gt;Enter password:&lt;br /&gt;ERROR 1045 (28000): Access denied for user 'pepe'@'Patrulla-Delta.local' (using password: YES)&lt;br /&gt;jaa@Patrulla-Delta:~/mysql-cert/2$ mysql --ssl-ca=jaa-cert.pem -u pepe -p -h 192.168.1.1&lt;br /&gt;Enter password:&lt;br /&gt;ERROR 2026 (HY000): SSL connection error&lt;br /&gt;jaa@Patrulla-Delta:~/mysql-cert/2$ mysql --ssl-cert=pepe-cert.pem --ssl-key=pepe-key.pem -u pepe -p -h 192.168.1.1&lt;br /&gt;Enter password:&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 77&lt;br /&gt;Server version: xxxxx&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;En el primer caso intento ingresar sin presentar el certificado del CA, entonces el servidor nos niega el acceso.&lt;br /&gt;En el segundo caso intento ingresar presentando un certificado de CA erroneo, por lo cual también nos da una patada.&lt;br /&gt;En el Tercer caso, presento un certificado firmado por el CA y logro el acceso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nivel 3 -&lt;/span&gt; Este se aplica del lado servidor. Lo que haremos será decirle al servidor que solo acepte al usuario "jaa" si presenta un certificado firmado por el CA. Pero como hacemos esto?, bueno no es tan complicado:&lt;br /&gt;- En primer lugar obtenemos lo que se denomina issuer del certificado de uno de los clientes:&lt;br /&gt;&lt;pre&gt;jaa@Patrulla-Delta:~/mysql-cert/2/jaa$ openssl x509 -in client-cert.pem -noout -issuer&lt;br /&gt;issuer= /C=AR/ST=Capital Federal/L=Capital Federal/O=OpenOrange/OU=Programacion/CN=OpenOrange Dpto. Cert./emailAddress=info@openorange.com.ar&lt;br /&gt;&lt;/pre&gt;la linea que dice issuer= /C... corresponde con la información que necesitamos. Esta es la información acerca del CA, la cual para mi caso quedó como mostré.&lt;br /&gt;Es interesante notar que sea cual sea el certificado de cliente o el servidor al que apliquemos el comando siempre obtendremos el mismo contenido (siempre y cuando hallan sido firmados nuestro CA!), por ejemplo si hacemos:&lt;br /&gt;&lt;pre&gt;jaa@Patrulla-Delta:~/mysql-cert/2/jaa$ openssl x509 -in pepe-cert.pem -noout -issuer&lt;br /&gt;issuer= /C=AR/ST=Capital Federal/L=Capital Federal/O=OpenOrange/OU=Programacion/CN=OpenOrange Dpto. Cert./emailAddress=info@openorange.com.ar&lt;br /&gt;&lt;/pre&gt;Entonces nuestro issuer sera:&lt;br /&gt;&lt;pre&gt;issuer= /C=AR/ST=Capital Federal/L=Capital Federal/O=OpenOrange/OU=Programacion/CN=OpenOrange Dpto. Cert./emailAddress=info@openorange.com.ar&lt;br /&gt;&lt;/pre&gt;Ahora lo que hacemos es aplicar la restricción dentro del servidor mysql:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; create user jaa@'%' identified by 'lalala';&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON *.* TO 'jaa'@'%'&lt;br /&gt;-&gt; REQUIRE ISSUER '/C=AR/ST=Capital Federal/L=Capital Federal/O=OpenOrange/OU=Programacion/CN=OpenOrange Dpto. Cert./emailAddress=info@openorange.com.ar';&lt;br /&gt;mysql&gt; flush privileges;&lt;br /&gt;&lt;/pre&gt;En estas dos líneas cree el usuario, y seguido a esto le asigné la restricción.&lt;br /&gt;ahora para conectar:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@Patrulla-Delta:~/mysql-cert/2/jaa$ mysql --ssl-ca=ca-cert.pem --ssl-cert=jaa-cert.pem --ssl-key=jaa-key.pem -u jaa -h 192.168.1.1 -p&lt;br /&gt;Enter password:&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 71&lt;br /&gt;Server version: xxxxx&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;Y hacemos una prueba más, supongamos que como 'jaa' tenemos en nuestras manos la clave privada y certificado de 'pepe' (digamos que pepe confia en que no lo venderemos por ahí), entonces:&lt;br /&gt;&lt;pre&gt;jaa@Patrulla-Delta:~/mysql-cert/2/jaa$ mysql --ssl-ca=ca-cert.pem --ssl-cert=pepe-cert.pem --ssl-key=pepe-key.pem -u jaa -h 192.168.1.1 -p&lt;br /&gt;Enter password:&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 71&lt;br /&gt;Server version: xxxxx&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;vemos que podemos utilizar el certificado y clave de pepe sin ningún problema para conectarnos con nuestro usuario. Esto es debido a que todos los usuarios de clientes que generamos comparten el issuer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nivel 4-&lt;/span&gt; Este es el nivel más seguro; en este le decimos al servidor que un cliente solo puede conectarse si presenta su propio certificado. En este caso utilizamos el "SUBJECT", el cual tiene los datos del usuario (cliente) mismo.&lt;br /&gt;Primero obtenemos el subject del certificado:&lt;br /&gt;&lt;pre&gt;jaa@Patrulla-Delta:~/mysql-cert/2$ openssl x509 -in jaa-cert.pem -noout -subject&lt;br /&gt;subject= /C=AR/ST=Buenos Aires/L=Brandsen/O=JAATesting/OU=Programacion/CN=Jonatan Anauati/emailAddress=janauati@openorange.com.ar&lt;br /&gt;&lt;/pre&gt;Al igual que para el issuer, el subject es lo que viene despues de "subject= ".&lt;br /&gt;Entonces vamos a mysql:&lt;br /&gt;&lt;pre&gt;si el usuario no existía:&lt;br /&gt;mysql&gt; create user jaa@'%';&lt;br /&gt;Las siguientes dos son alternativas, si el usuario quedo del ejemplo anterior, en otro&lt;br /&gt;caso pueden ser saltadas.&lt;br /&gt;mysql&gt; revoke all privileges on *.* from test2@'%';&lt;br /&gt;mysql&gt; update mysql.user set password=NULL where User=jaa2@'%';&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON *.* TO 'jaa'@'%'&lt;br /&gt;-&gt; REQUIRE SUBJECT '/C=AR/ST=Buenos Aires/L=Brandsen/O=JAATesting/OU=Programacion/CN=Jonatan Anauati/emailAddress=janauati@openorange.com.ar';&lt;br /&gt;mysql&gt; flush privileges;&lt;br /&gt;&lt;/pre&gt;y ahora solo falta conectarnos:&lt;br /&gt;&lt;pre&gt;jaa@Patrulla-Delta:~/mysql-cert/2/jaa$ mysql --ssl-ca=ca-cert.pem --ssl-cert=jaa-cert.pem --ssl-key=jaa-key.pem -u jaa -h 192.168.1.1&lt;br /&gt;Enter password:&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 71&lt;br /&gt;Server version: xxxxx&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;mysql&gt;&lt;br /&gt;&lt;/pre&gt;Para este caso, al usuario le quité el password, ya que unicamente el puede conectarse ya que requiere siempre presentar su certificado y firmar (y desencriptar) con su clave privada ante el servidor.&lt;br /&gt;&lt;br /&gt;Si en este útimo caso intentamos conectar al servidor sin presentar nuestras credenciales estamos fritos, y además tampoco podemos usar el certificado y clave del usuario 'pepe'.&lt;br /&gt;&lt;br /&gt;Con todo esto el servidor debería quedar funcionando.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-8303757110809330884?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/8303757110809330884/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=8303757110809330884&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/8303757110809330884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/8303757110809330884'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/08/mysql-con-ssl-reforzando-la-seguridad.html' title='Mysql con SSL. Reforzando la seguridad.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-5636769756507735007</id><published>2008-08-23T13:24:00.000-07:00</published><updated>2008-08-23T13:34:36.242-07:00</updated><title type='text'>Instanciación e invocación dinámica en mono/.net</title><content type='html'>En esta entrada muestro un ejemplo de lo fácil que es crear una instancia de clase dinámicamente en mono/.net y además ejecutar métodos.&lt;br /&gt;&lt;br /&gt;Primero muestro un ensamblado (archivo.dll) que vamos a usar de prueba, el siguiente es entonces el archivo "&lt;span style="font-weight: bold; font-style: italic;"&gt;TestAssembly.cs&lt;/span&gt;":&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; TestAssemblyNs&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; TestClass&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; TestClass ()&lt;br /&gt;       {&lt;br /&gt;           System.Console.WriteLine (&lt;span style="color:#ff00ff;"&gt;"Constructor de {0}"&lt;/span&gt;, &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;.GetType().FullName);&lt;br /&gt;       }&lt;br /&gt;       &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; metodoTest (&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; param1, &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt; param2)&lt;br /&gt;       {&lt;br /&gt;           System.Console.WriteLine (&lt;span style="color:#ff00ff;"&gt;"metodoTest({0},{1})"&lt;/span&gt;,param1, param2);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;para compilarlo simplemente:&lt;br /&gt;&lt;br /&gt;$ &lt;span style="font-weight: bold;"&gt;mcs -target:library TestAssembly.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;lo cual generó un archivo: &lt;span style="font-style: italic; font-weight: bold;"&gt;TestAssembly.dll&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora el código del ejemplo, el cual lo guardamos en el archivo "&lt;span style="font-style: italic; font-weight: bold;"&gt;TestActivator.cs&lt;/span&gt;":&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/span&gt; TestActivator&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/span&gt; System;&lt;br /&gt;   &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/span&gt; System.Reflection;&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; ClaseEjemplo&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; ClaseEjemplo ()&lt;br /&gt;       {&lt;br /&gt;           System.Console.WriteLine(&lt;span style="color:#ff00ff;"&gt;"Constructor de {0}"&lt;/span&gt;,&lt;span style="color:#a52a2a;"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;.GetType().FullName);&lt;br /&gt;       }&lt;br /&gt;       &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; metodo ()&lt;br /&gt;       {&lt;br /&gt;           System.Console.WriteLine (&lt;span style="color:#ff00ff;"&gt;"metodo ()"&lt;/span&gt;);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; MainClass&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; Main (&lt;span style="color:#2e8b57;"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt;[] args)&lt;br /&gt;       {&lt;br /&gt;           ClaseEjemplo obj=&lt;span style="color:#ff00ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;           &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/span&gt; noRegistrado=&lt;span style="color:#ff00ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// EJEMPLO 1&lt;/span&gt;&lt;br /&gt;           Type t = &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt; (ClaseEjemplo);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// instancia el objeto&lt;/span&gt;&lt;br /&gt;           obj = (ClaseEjemplo)System.Activator.CreateInstance (t);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// llama el metodo&lt;/span&gt;&lt;br /&gt;           obj.metodo ();&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// EJEMPLO 2: la clase esta en una dll externa. Invoca el método &lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// dinámicamente.&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// carga el assembly (el archivo)&lt;/span&gt;&lt;br /&gt;           Assembly ass = Assembly.LoadFrom (&lt;span style="color:#ff00ff;"&gt;"TestAssembly.dll"&lt;/span&gt;);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// trae el tipo del ns.&lt;/span&gt;&lt;br /&gt;           Type ns = ass.GetType (&lt;span style="color:#ff00ff;"&gt;"TestAssemblyNs"&lt;/span&gt;);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// dentro del ns busca el tipo correspondiente a TestClass&lt;/span&gt;&lt;br /&gt;           Type ta =ns.GetNestedType(&lt;span style="color:#ff00ff;"&gt;"TestClass"&lt;/span&gt;,BindingFlags.Public);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// instancia el objeto.&lt;/span&gt;&lt;br /&gt;           noRegistrado = System.Activator.CreateInstance (ta);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// obtiene la metada del método.&lt;/span&gt;&lt;br /&gt;           MethodInfo minf  = noRegistrado.GetType ().GetMethod (&lt;span style="color:#ff00ff;"&gt;"metodoTest"&lt;/span&gt;);&lt;br /&gt;           &lt;span style="color:#0000ff;"&gt;// llama el metodo&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/span&gt;[] paramList= &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#2e8b57;"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/span&gt;[] {&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;,&lt;span style="color:#ff00ff;"&gt;"parametro de prueba"&lt;/span&gt;};&lt;br /&gt;           minf.Invoke (noRegistrado, paramList);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;para compilarlo:&lt;br /&gt;$ &lt;span style="font-weight: bold;"&gt;mcs TestActivator.cs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;entonces la cosa queda así:&lt;br /&gt;&lt;br /&gt;jaa@dino-thunder:/tmp/mono$ ls&lt;br /&gt;TestActivator.exe  TestAssembly.dll&lt;br /&gt;&lt;br /&gt;y podemos ejecutar el ejemplo:&lt;br /&gt;&lt;br /&gt;jaa@dino-thunder:/tmp/mono$ mono TestActivator.exe&lt;br /&gt;Constructor de TestActivator.ClaseEjemplo&lt;br /&gt;metodo ()&lt;br /&gt;Constructor de TestAssemblyNs+TestClass&lt;br /&gt;metodoTest(1,parametro de prueba)&lt;br /&gt;jaa@dino-thunder:/tmp/mono$&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-5636769756507735007?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/5636769756507735007/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=5636769756507735007&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/5636769756507735007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/5636769756507735007'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/08/instanciacin-e-invocacin-dinmica-en.html' title='Instanciación e invocación dinámica en mono/.net'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-2149327549572931824</id><published>2008-08-18T15:38:00.000-07:00</published><updated>2008-08-18T17:34:08.670-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='https'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='tlslite'/><title type='text'>Servidor Https en python</title><content type='html'>Bueno, la verdad que tenía que dejar el comentario, después de tanto buscar, al final encontré la forma de levantar un servidor web en python bajo https.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/tlslite/"&gt;tlslite&lt;/a&gt; es la distribución de código que nos ayuda con esta tarea. Trae codigo de ejemplo, y además un certificado x509 y un private key de prueba.&lt;br /&gt;&lt;br /&gt;Si vemos en el directorio test, ahi adentro encontraremos el archivo httpsserver.py, el cual trae un servidor https de ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 1 &lt;/span&gt;&lt;span style="color:#a020f0;"&gt;from&lt;/span&gt; SocketServer &lt;span style="color:#a020f0;"&gt;import&lt;/span&gt; *&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 2 &lt;/span&gt;&lt;span style="color:#a020f0;"&gt;from&lt;/span&gt; BaseHTTPServer &lt;span style="color:#a020f0;"&gt;import&lt;/span&gt; *&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 3 &lt;/span&gt;&lt;span style="color:#a020f0;"&gt;from&lt;/span&gt; SimpleHTTPServer &lt;span style="color:#a020f0;"&gt;import&lt;/span&gt; *&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 4 &lt;/span&gt;&lt;span style="color:#a020f0;"&gt;from&lt;/span&gt; tlslite.api &lt;span style="color:#a020f0;"&gt;import&lt;/span&gt; *&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 5 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 6 &lt;/span&gt;s = open("&lt;span style="color:#ff00ff;"&gt;./serverX509Cert.pem&lt;/span&gt;").read()&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 7 &lt;/span&gt;x509 = X509()&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 8 &lt;/span&gt;x509.parse(s)&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt; 9 &lt;/span&gt;certChain = X509CertChain([x509])&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;10 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;11 &lt;/span&gt;s = open("&lt;span style="color:#ff00ff;"&gt;./serverX509Key.pem&lt;/span&gt;").read()&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;12 &lt;/span&gt;privateKey = parsePEMKey(s, private=True)&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;13 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;14 &lt;/span&gt;sessionCache = SessionCache()&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;15 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;16 &lt;/span&gt;&lt;span style="color:#a52a2a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;MyHTTPServer&lt;/span&gt;(ThreadingMixIn, TLSSocketServerMixIn, HTTPServer):&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;17 &lt;/span&gt;    &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#008b8b;"&gt;handshake&lt;/span&gt;(self, tlsConnection):&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;18 &lt;/span&gt;        &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;19 &lt;/span&gt;            tlsConnection.handshakeServer(certChain=certChain,&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;20 &lt;/span&gt;                                          privateKey=privateKey,&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;21 &lt;/span&gt;                                          sessionCache=sessionCache)&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;22 &lt;/span&gt;            tlsConnection.ignoreAbruptClose = True&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;23 &lt;/span&gt;            &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; True&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;24 &lt;/span&gt;        &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;except&lt;/b&gt;&lt;/span&gt; TLSError, error:&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;25 &lt;/span&gt;            &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt; "&lt;span style="color:#ff00ff;"&gt;Handshake failure:&lt;/span&gt;", str(error)&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;26 &lt;/span&gt;            &lt;span style="color:#a52a2a;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; False&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;27 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;28 &lt;/span&gt;httpd = MyHTTPServer(('&lt;span style="color:#ff00ff;"&gt;localhost&lt;/span&gt;', 443), SimpleHTTPRequestHandler)&lt;br /&gt;&lt;span style="color:#a52a2a;"&gt;29 &lt;/span&gt;httpd.serve_forever()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo mejor de todo, es que la implementación está en python puro, así que todo funciona sin necesidad de compilaciones poco amigables.&lt;br /&gt;&lt;br /&gt;Para probarlo simplemente:&lt;br /&gt;jaa@dino-thunder:~/taller/tlslite-0.3.8$ cp test/httpsserver.py .&lt;br /&gt;jaa@dino-thunder:~/taller/tlslite-0.3.8$ cp test/serverX509Cert.pem .&lt;br /&gt;jaa@dino-thunder:~/taller/tlslite-0.3.8$ cp test/serverX509Key.pem .&lt;br /&gt;jaa@dino-thunder:~/taller/tlslite-0.3.8$ ls -l&lt;br /&gt;total 54&lt;br /&gt;drwx------ 4 jaa jaa   160 2005-02-21 23:44 docs&lt;br /&gt;-rwx------ 1 jaa jaa   950 2008-08-18 19:46 httpsserver.py&lt;br /&gt;drwx------ 2 jaa jaa   144 2005-02-21 23:44 installers&lt;br /&gt;-rwx------ 1 jaa jaa  1934 2005-02-21 22:53 make_release.py&lt;br /&gt;-rwx------ 1 jaa jaa 30268 2005-02-21 23:13 readme.txt&lt;br /&gt;drwx------ 2 jaa jaa    96 2005-02-21 23:44 scripts&lt;br /&gt;-rwx------ 1 jaa jaa   973 2008-08-18 19:46 serverX509Cert.pem&lt;br /&gt;-rwx------ 1 jaa jaa   887 2008-08-18 19:46 serverX509Key.pem&lt;br /&gt;-rwx------ 1 jaa jaa   824 2005-02-21 22:57 setup.py&lt;br /&gt;drwx------ 3 jaa jaa   656 2008-08-18 19:44 test&lt;br /&gt;drwx------ 4 jaa jaa  1272 2008-08-06 17:54 tlslite&lt;br /&gt;jaa@dino-thunder:~/taller/tlslite-0.3.8$ sudo python ./httpsserver.py&lt;br /&gt;&lt;br /&gt;obviamente, hay que ejecutar como root, ya que para levantar un servidor https (port 443) necesitamos ser root.&lt;br /&gt;&lt;br /&gt;Si vamos a nuestro browser, y hacemos https://localhost, entonces vamos a ver el listado del directorio donde ejecutamos httpsserver.py, y para empezar a jugar, podemos poner ahí un html e intentar verlo desde el browser.&lt;br /&gt;&lt;br /&gt;Despues agrego los comandos para generar nuestros propios certificados.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-2149327549572931824?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/2149327549572931824/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=2149327549572931824&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/2149327549572931824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/2149327549572931824'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/08/servidor-https-en-python.html' title='Servidor Https en python'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-6786477634887042490</id><published>2008-08-07T11:39:00.000-07:00</published><updated>2008-08-07T15:31:23.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gtk#'/><category scheme='http://www.blogger.com/atom/ns#' term='TreeView'/><category scheme='http://www.blogger.com/atom/ns#' term='ListView con Gtk sharp'/><category scheme='http://www.blogger.com/atom/ns#' term='c sharp'/><category scheme='http://www.blogger.com/atom/ns#' term='ListStore'/><category scheme='http://www.blogger.com/atom/ns#' term='Gtk sharp'/><category scheme='http://www.blogger.com/atom/ns#' term='Expresiones regulares con C sharp.'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='Expresiones regulares con mono'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Gtk.TreeView: Ejemplos útiles.</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Gtk.TreeView: Ejemplos útiles.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bueno, en este artículo voy a mostrar algunas de las capacidades ocultas del widget TreeView de Gtk#. El TreeView de Gtk es un componente muy util, si bien es un poco intimidante en los primeros pasos, con la práctica, podemos llegar a dominarlo de alguna forma, o por lo menos entenderlo un poco, de manera que nuestras próximas experiencias no sean tan complicadas.&lt;br /&gt;&lt;br /&gt;Hoy voy a mostrar un par de ejemplos de un TreeView, utilizando el modelo de lista de elementos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Teoría: &lt;/span&gt;la teoría no le gusta a nadie, pero en este caso es necesaria aunque sea un poco. Para poder generar un listado con el TreeView hay que tener presentes 3 puntos principales, los cuales están muy relacionados y son todos necesarios:&lt;br /&gt;&lt;br /&gt;1 - TreeView: el widget principal, actua como punto de conexion de los dos componentes que abajo describo para lograr una vista de la información directamente hacia el usuario.&lt;br /&gt;&lt;br /&gt;2 - TreeModel: el tree model, es el modelo de datos que vamos a utilizar. Define como se almacenan los datos, por ejemplo una Lista (ListStore) o un arbol (TreeStore).&lt;br /&gt;Al crear un TreeModel, debemos informarle que tipos de datos va a contener; Si creamos un ListStore, por ejemplo debemos informarle el tipo de cada uno de los campos. Abajo muestro el constructor:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; ListStore (&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;params&lt;/b&gt;&lt;/span&gt; Type [] types);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;entonces podemos hacer lo siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  ListStore ngine = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; ListStore (&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt;), &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;o&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Type[] tlist = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; Type[] {&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt; (&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt;), &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt; (&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;)};&lt;br /&gt;  ListStore ngine = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; ListStore (tlist);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3 - CellRenderer: como su nombre lo indica, es el encargado de dibujar cada  celda en el TreeView. Dependiendo de la naturaleza de los datos que vamos a mostrar debemos elegir entre uno de varios cell renderers: CellRendererText para texto, CellRendererPixbuf para imagenenes, etc. Es interesante saber que cada celda puede contener mas de un CellRenderer, permitiendo mostrar por ejemplo una imagen y texto a su lado, o las combinaciones que se requieran.&lt;br /&gt;&lt;br /&gt;Nombrados estos tres explico un poco como funcionan:&lt;br /&gt;El TreeView es el widget principal, el cual es el encargado de interactuar con el usuario. Cada TreeView debe tener asociado a el un TreeModel (2), si lo que se va a mostrar es un listado en forma de tabla, entonces será un ListStore. Además, el tree view, contiene un conjunto de columnas, cada columna definirá la configuración de las celdas que contiene, es decir a cada columna le diremos cuales cell renderers deben utilizar sus celdas entre otras cosas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Este es el esquema:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   TreeViewColumn &lt;----&gt; TreeView &lt;----&gt; TreeModel&lt;br /&gt;       | &lt;br /&gt;       | &lt;br /&gt;   CellRenrer, CellRenderer,...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bueno, hechas las aclaraciones teóricas principales, restan algunos puntos, que voy a aclarar con los ejemplos, porque va a ser mas facil de entender así.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Ejemplo 1. TreeView Con editor de fecha.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Este demostrará las siguientes características:&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Visualmente:&lt;/span&gt;&lt;br /&gt;En este ejemplo muestro la creacion de un treeview con dos columnas. La primera contiene solo un nombre, mientras que la segunda tiene la tarea de mostrar un campo de fecha. Ademas, ambas columnas van a permitir la edición de sus valores:&lt;br /&gt;- la primera permitirá la edición del nombre&lt;br /&gt;- la segunda permitirá la edición de la fecha, pero la gracia es que lo hara por partes __ / __ / ____, donde las "/" permanecerán fijas, y tendrá una  validación de la fecha editada, si es incorrecta, entonces revertirá la edición.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Internamente:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En el interior, este ejemplo muestra como añadir objetos de clases especificas al tree view. Por ejemplo supongamos que tenemos la siguiente clase:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; Persona&lt;br /&gt;  {&lt;br /&gt;      &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt; nombre;&lt;br /&gt;      &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; DateTime nacimiento;&lt;br /&gt;      &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; Persona (&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt; nombre, DateTime nacimiento)&lt;br /&gt;      {&lt;br /&gt;          &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;.nombre = nombre;&lt;br /&gt;          &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;.nacimiento = nacimiento;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Entonces lo que haremos será directamente instanciar estos objetos y meterlos&lt;br /&gt;directamente en nuestro tree model. Para esto tenemos que tener en claro varios&lt;br /&gt;puntos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;a) Creacion del ListStore:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  ListStore ngine = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; ListStore (&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt; (Persona), &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/span&gt; (Persona));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;b) Cada cell renderer deberá saber como mostrar su valor especifico al usuario,&lt;br /&gt;y además en caso de que se haga edición del valor contenido, también debe&lt;br /&gt;conocer como asignar el nuevo valor al objeto Persona correspondiente. Para ello tenemos las siguientes:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; SetCellDataFunc&lt;br /&gt;      (CellRenderer cell_renderer,&lt;br /&gt;      TreeCellDataFunc func);&lt;br /&gt;  &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;delegate&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; TreeCellDataFunc&lt;br /&gt;      (TreeViewColumn tree_column,&lt;br /&gt;      CellRenderer cell,&lt;br /&gt;      TreeModel tree_model,&lt;br /&gt;      TreeIter iter);&lt;br /&gt;  &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;event&lt;/b&gt;&lt;/span&gt; EditedHandler Edited; &lt;span style="color: rgb(0, 0, 255);"&gt;//(del CellRendererText);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La primeras dos sirven para decirle a cada celda en la columna, como debe obtener los datos a mostrar por el cell renderer. Es decir su función está en obtener el objeto Persona indicado de un lugar particular, tomar el atributo a mostrar (por ejemplo nombre), y entregárselo al cell renderer:&lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Persona p;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 255);"&gt;// obtengo y asigno el valor a p&lt;/span&gt;&lt;br /&gt;  ((CellRendererText)cell).Markup = p.nombre;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La última es para hacer el camino inverso, al editarse el valor en la celda del tree view (especificamente en el cell renderer), se lanza el evento, entonces actuamos en consecuencia tomando el nuevo valor, y asignándoselo a la instancia de Persona adecuada.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bueno, sin mas palabras vamos a ver el código:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Autor: Jonatan Anauati.&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Email: barakawins@gmail.com&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Licencia: LGPL.&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; *&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Descripcion:&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; *      Este ejemplo muestra un TreeView con el modelo de lista. En una de las&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * columnas de dicho TreeView se ven empaquetados mas de un CellRendererText,&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * para permitir el ingreso de una fecha parte por parte (dd / mm / yyyy).&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Ademas permite entender el uso del metodo SetCellDataFunc, el cual permite&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * definir una manejadora para poder utilizar tipos complejos en el almacen de&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * datos subyacente (ListStore).&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Otra cosa que agrego en este, es la capacidad de ordenar valores, que como&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * se están utilizando tipos complejos en el ListStore, se pierde inicialmente.&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * &lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; */&lt;/font&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/font&gt; TreeViewExample&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System;&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; Gtk;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; Persona&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; nombre;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; DateTime nacimiento;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; Persona (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; nombre, DateTime nacimiento)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.nombre = nombre;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.nacimiento = nacimiento;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; TreeViewExample&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#0000ff"&gt;// el widget treeview&lt;/font&gt;&lt;br /&gt;        TreeView tv;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// para contener los datos que el treeview muestra&lt;/font&gt;&lt;br /&gt;        ListStore ngine;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; TreeView BuildTreeView ()&lt;br /&gt;        {&lt;br /&gt;            CellRendererText    nameCrt, dayCrt, monthCrt, yearCrt,&lt;br /&gt;                                dateSep1Crt, dateSep2Crt;&lt;br /&gt;            TreeViewColumn nameCol, dateCol;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// los cellrenderers, estos son los encargadados de mostrar el &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// valor en la celda que se les asigna.&lt;/font&gt;&lt;br /&gt;            nameCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            nameCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            dayCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            dayCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            monthCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            monthCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            yearCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            yearCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            dateSep1Crt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Markup contiene el valor final a mostrar.&lt;/font&gt;&lt;br /&gt;            dateSep1Crt.Markup = &lt;font color="#ff00ff"&gt;&amp;quot;/&amp;quot;&lt;/font&gt;;&lt;br /&gt;            dateSep2Crt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            dateSep2Crt.Markup = &lt;font color="#ff00ff"&gt;&amp;quot;/&amp;quot;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora pueden inicializarse las columnas. Cada una de estas&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// va a recivir uno o mas cellRenderers, los cuales dibujaran&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// los valores en cada una de sus celdas.&lt;/font&gt;&lt;br /&gt;            nameCol = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewColumn ();&lt;br /&gt;            dateCol = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewColumn ();&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora todo lo importante.&lt;/font&gt;&lt;br /&gt;            nameCol.PackStart (nameCrt,&lt;font color="#ff00ff"&gt;true&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (dayCrt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (dateSep1Crt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (monthCrt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (dateSep2Crt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (yearCrt,&lt;font color="#ff00ff"&gt;true&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// contenedor de los datos en el bajo nivel. Esta sera la lista &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// que va a contener toda la informacion.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; ListStore (&lt;font color="#a52a2a"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/font&gt; (Persona),&lt;font color="#a52a2a"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/font&gt; (Persona));&lt;br /&gt;            &lt;font color="#0000ff"&gt;// contenedor principal.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeView (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.HeadersClickable = &lt;font color="#ff00ff"&gt;false&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.EnableSearch = &lt;font color="#ff00ff"&gt;false&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.RulesHint=&lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.HeadersVisible = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.AppendColumn (nameCol);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.AppendColumn (dateCol);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora le digo a cada columna como tiene rellenar cada celda de&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// el ListStore que le asignamos. Hace el parseo entre el Tipo &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Persona, y la columna correspondiente.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ListStore -&amp;gt; (Columna,cellrenderer)&lt;/font&gt;&lt;br /&gt;            nameCol.SetCellDataFunc (nameCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showNombrePersona));&lt;br /&gt;            dateCol.SetCellDataFunc (dayCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showDiaNacPersona));&lt;br /&gt;            dateCol.SetCellDataFunc (monthCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showMesNacPersona));&lt;br /&gt;            dateCol.SetCellDataFunc (yearCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showAnoNacPersona));&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora el proceso inverso, el usuario edita un cellrt dentro de un column,&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// y entonces se lanza el callback necesario para que verifique el valor, y&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ademas si este es valido, se lo asigne al objeto Persona en su atributo&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// indicado.&lt;/font&gt;&lt;br /&gt;            nameCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (nombreCellEdited);&lt;br /&gt;            yearCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (yearCellEdited);&lt;br /&gt;            monthCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (monthCellEdited);&lt;br /&gt;            dayCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (dayCellEdited);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora el toque que faltaba&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// propiedades y eventos visuales.&lt;/font&gt;&lt;br /&gt;            nameCol.Resizable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            nameCol.Title = &lt;font color="#ff00ff"&gt;&amp;quot;Nombre&amp;quot;&lt;/font&gt;;&lt;br /&gt;            dateCol.Resizable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            dateCol.Title = &lt;font color="#ff00ff"&gt;&amp;quot;Fecha de Nacimiento&amp;quot;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Genera datos de testing y los carga al treeview.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.LoadListStore ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// Cada TreeCellDataFunc, es encargada de:&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//  1 - Buscar el objeto correspondiente en el ListStore.&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//  2 - Tomar el valor indicado de dicho objeto (nombre o nacimiento).&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//  3 - Asignar el valor al CellRenderer, para que se vea dibujado en &lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//      la celda.&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showNombrePersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#0000ff"&gt;// 0 (cero) indica el numero de columna. Igualmente, creo que es&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// bastante claro que aquí puedo utilizar 0 o 1, de forma &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// indistinta, ya que nuestro ListStore contiene la misma &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// referencia a Persona en ambos cells.&lt;/font&gt;&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; nom = (p.nombre == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;)?&lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;:p.nombre;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Lo siguiente es mostrar el valor en la celda, Markup como ya &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// dije es el atributo cuyo valor se muestra directamente en la&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// celda.&lt;/font&gt;&lt;br /&gt;            ((CellRendererText) cell).Markup = nom;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showDiaNacPersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            DateTime d = p.nacimiento;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val = d.Day.ToString ().PadLeft (&lt;font color="#ff00ff"&gt;2&lt;/font&gt;,&lt;font color="#ff00ff"&gt;'0'&lt;/font&gt;);&lt;br /&gt;            ((CellRendererText) cell).Markup = val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showMesNacPersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            DateTime d = p.nacimiento;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val = d.Month.ToString ().PadLeft (&lt;font color="#ff00ff"&gt;2&lt;/font&gt;,&lt;font color="#ff00ff"&gt;'0'&lt;/font&gt;);&lt;br /&gt;            ((CellRendererText) cell).Markup = val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showAnoNacPersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            DateTime d = p.nacimiento;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val = d.Year.ToString ().PadLeft (&lt;font color="#ff00ff"&gt;4&lt;/font&gt;,&lt;font color="#ff00ff"&gt;'0'&lt;/font&gt;);&lt;br /&gt;            ((CellRendererText) cell).Markup = val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; nombreCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;            p.nombre = args.NewText;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; yearCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; y = &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;.Parse(args.NewText);&lt;br /&gt;                DateTime dt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (y,p.nacimiento.Month, p.nacimiento.Day);&lt;br /&gt;                p.nacimiento = dt;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (System.Exception ex)&lt;br /&gt;            { }&lt;br /&gt;        }&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; monthCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; m = &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;.Parse(args.NewText);&lt;br /&gt;                DateTime dt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (p.nacimiento.Year,m, p.nacimiento.Day);&lt;br /&gt;                p.nacimiento = dt;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (System.Exception ex)&lt;br /&gt;            { }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; dayCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; d = &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;.Parse(args.NewText);&lt;br /&gt;                DateTime dt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (p.nacimiento.Year,p.nacimiento.Month, d);&lt;br /&gt;                p.nacimiento = dt;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (System.Exception ex)&lt;br /&gt;            { }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;[,] TestDates = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;[,] { {&lt;font color="#ff00ff"&gt;2000&lt;/font&gt;,&lt;font color="#ff00ff"&gt;10&lt;/font&gt;,&lt;font color="#ff00ff"&gt;9&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1980&lt;/font&gt;,&lt;font color="#ff00ff"&gt;2&lt;/font&gt;, &lt;font color="#ff00ff"&gt;10&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1990&lt;/font&gt;,&lt;font color="#ff00ff"&gt;5&lt;/font&gt;,&lt;font color="#ff00ff"&gt;24&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1929&lt;/font&gt;, &lt;font color="#ff00ff"&gt;3&lt;/font&gt;, &lt;font color="#ff00ff"&gt;3&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1993&lt;/font&gt;, &lt;font color="#ff00ff"&gt;12&lt;/font&gt;, &lt;font color="#ff00ff"&gt;7&lt;/font&gt;}};&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;[] TestNombres= {&lt;font color="#ff00ff"&gt;&amp;quot;Juan Peres&amp;quot;&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Jorge Pindocha&amp;quot;&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Ernesto Rodrigues&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Adrian Dilori&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Clemente Tomas Taus&amp;quot;&lt;/font&gt;};&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; LoadListStore ()&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i &amp;lt; TestNombres.Length; i++)&lt;br /&gt;            {&lt;br /&gt;                DateTime nac = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (TestDates[i,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;], TestDates[i,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;],TestDates[i,&lt;font color="#ff00ff"&gt;2&lt;/font&gt;]);&lt;br /&gt;                Persona p = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Persona (TestNombres[i],nac);&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.AppendValues (p,p);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; MainClass&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; Main (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            Application.Init ();&lt;br /&gt;            Window main = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Window (&lt;font color="#ff00ff"&gt;&amp;quot;TreeView de Ejemplo&amp;quot;&lt;/font&gt;);&lt;br /&gt;            main.DeleteEvent +=  &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DeleteEventHandler (OnDeleteWindow);&lt;br /&gt;            TreeView tv = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewExample().BuildTreeView ();&lt;br /&gt;            main.Add (tv);&lt;br /&gt;            main.ShowAll();&lt;br /&gt;            Application.Run ();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; OnDeleteWindow (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, DeleteEventArgs args)&lt;br /&gt;        {&lt;br /&gt;            Application.Quit ();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;para compilar:&lt;br /&gt; mcs -pkg:gtk-sharp-2.0 TreeViewExample.cs&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Ejemplo 2. TreeView Con editor de fecha, ordenamiento y busquedas.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Bueno, el ejemplo anterior fué bonito, pero, al hacer todas estas achurías, perdimos dos capacidades muy útiles:&lt;br /&gt;&lt;/div&gt;a) capacidad de ordenamiento.&lt;br /&gt;b) capacidad de busqueda.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Pero todo tiene solucion, para ello al ejemplo anterior le incorporamos el uso de las siguientes:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt; SetSortFunc&lt;br /&gt;      (&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; sort_column_id, TreeIterCompareFunc sort_func)&lt;br /&gt;  &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;delegate&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; TreeIterCompareFunc&lt;br /&gt;      (TreeModel model, TreeIter a, TreeIter b)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;del ListStore, las que utilizamos para para permitir el ordenamiento de las celdas en una columna y además las siguientes:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;font &gt;&lt;b&gt;public&lt;/b&gt; TreeViewSearchEqualFunc SearchEqualFunc { set; get; }&lt;br /&gt;  &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;delegate&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/span&gt; TreeViewSearchEqualFunc&lt;br /&gt;      (TreeModel model, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; column, &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/span&gt; key, TreeIter iter)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;del TreeView, las cuales utilizamos para la búqueda de valores en el treeview por demanda.&lt;br /&gt;Para aprobechar el nivel de personalización que nos brinda el TreeView, a las búsquedas le vamos a agregar el uso de expresiones regulares.&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;/div&gt;"*eres", llegara a "Juan Peres", y todas los delirios que se quieran: "J.\+s", llegará a "Juan Peres", y todo lo que se quiera.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Por otra parte, también vamos a hacer una lectura mas o menos inteligente de las fechas a buscar&lt;br /&gt;&lt;/div&gt;dd-mm-aaaa llegará a dd/mm/aa&lt;br /&gt;dd /mm/aaaa llegará a dd/mm/aaaa&lt;br /&gt;&lt;/br&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;/*&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Autor: Jonatan Anauati.&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Email: barakawins@gmail.com&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Licencia: LGPL.&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; *&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Descripcion:&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; *      Este ejemplo muestra un TreeView con el modelo de lista. En una de las&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * columnas de dicho TreeView se ven empaquetados mas de un CellRendererText,&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * para permitir el ingreso de una fecha parte por parte (dd / mm / yyyy).&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Ademas permite entender el uso del metodo SetCellDataFunc, el cual permite&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * definir una manejadora para poder utilizar tipos complejos en el almacen de&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * datos subyacente (ListStore).&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * Otra cosa que agrego en este, es la capacidad de ordenar valores, que como&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * se están utilizando tipos complejos en el ListStore, se pierde inicialmente.&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; * &lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt; */&lt;/font&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/font&gt; TreeViewExample&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System;&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; Gtk;&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Text;&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Text.RegularExpressions;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; Persona&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; nombre;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; DateTime nacimiento;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; Persona (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; nombre, DateTime nacimiento)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.nombre = nombre;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.nacimiento = nacimiento;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; TreeViewExample&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#0000ff"&gt;// el widget treeview&lt;/font&gt;&lt;br /&gt;        TreeView tv;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// para contener los datos que el treeview muestra&lt;/font&gt;&lt;br /&gt;        ListStore ngine;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; TreeView BuildTreeView ()&lt;br /&gt;        {&lt;br /&gt;            CellRendererText    nameCrt, dayCrt, monthCrt, yearCrt,&lt;br /&gt;                                dateSep1Crt, dateSep2Crt;&lt;br /&gt;            TreeViewColumn nameCol, dateCol;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// los cellrenderers, estos son los encargadados de mostrar el &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// valor en la celda que se les asigna.&lt;/font&gt;&lt;br /&gt;            nameCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            nameCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            dayCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            dayCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            monthCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            monthCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            yearCrt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            yearCrt.Editable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            dateSep1Crt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Markup contiene el valor final a mostrar.&lt;/font&gt;&lt;br /&gt;            dateSep1Crt.Markup = &lt;font color="#ff00ff"&gt;&amp;quot;/&amp;quot;&lt;/font&gt;;&lt;br /&gt;            dateSep2Crt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; CellRendererText ();&lt;br /&gt;            dateSep2Crt.Markup = &lt;font color="#ff00ff"&gt;&amp;quot;/&amp;quot;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora pueden inicializarse las columnas. Cada una de estas&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// va a recivir uno o mas cellRenderers, los cuales dibujaran&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// los valores en cada una de sus celdas.&lt;/font&gt;&lt;br /&gt;            nameCol = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewColumn ();&lt;br /&gt;            dateCol = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewColumn ();&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora todo lo importante.&lt;/font&gt;&lt;br /&gt;            nameCol.PackStart (nameCrt,&lt;font color="#ff00ff"&gt;true&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (dayCrt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (dateSep1Crt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (monthCrt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (dateSep2Crt,&lt;font color="#ff00ff"&gt;false&lt;/font&gt;);&lt;br /&gt;            dateCol.PackStart (yearCrt,&lt;font color="#ff00ff"&gt;true&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// contenedor de los datos en el bajo nivel. Esta sera la lista &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// que va a contener toda la informacion.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; ListStore (&lt;font color="#a52a2a"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/font&gt; (Persona),&lt;font color="#a52a2a"&gt;&lt;b&gt;typeof&lt;/b&gt;&lt;/font&gt; (Persona));&lt;br /&gt;            &lt;font color="#0000ff"&gt;// contenedor principal.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeView (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.HeadersClickable = &lt;font color="#ff00ff"&gt;false&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.EnableSearch = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.RulesHint=&lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.HeadersVisible = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.AppendColumn (nameCol);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.AppendColumn (dateCol);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora le digo a cada columna como tiene rellenar cada celda de&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// el ListStore que le asignamos. Hace el parseo entre el Tipo &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Persona, y la columna correspondiente.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ListStore -&amp;gt; (Columna,cellrenderer)&lt;/font&gt;&lt;br /&gt;            nameCol.SetCellDataFunc (nameCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showNombrePersona));&lt;br /&gt;            dateCol.SetCellDataFunc (dayCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showDiaNacPersona));&lt;br /&gt;            dateCol.SetCellDataFunc (monthCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showMesNacPersona));&lt;br /&gt;            dateCol.SetCellDataFunc (yearCrt, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeCellDataFunc (showAnoNacPersona));&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ahora el proceso inverso, el usuario edita un cellrt dentro de un column,&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// y entonces se lanza el callback necesario para que verifique el valor, y&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// ademas si este es valido, se lo asigne al objeto Persona en su atributo&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// indicado.&lt;/font&gt;&lt;br /&gt;            nameCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (nombreCellEdited);&lt;br /&gt;            yearCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (yearCellEdited);&lt;br /&gt;            monthCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (monthCellEdited);&lt;br /&gt;            dayCrt.Edited += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.EditedHandler (dayCellEdited);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// propiedades y eventos visuales.&lt;/font&gt;&lt;br /&gt;            nameCol.Resizable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            nameCol.Title = &lt;font color="#ff00ff"&gt;&amp;quot;Nombre&amp;quot;&lt;/font&gt;;&lt;br /&gt;            dateCol.Resizable = &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            dateCol.Title = &lt;font color="#ff00ff"&gt;&amp;quot;Fecha de Nacimiento&amp;quot;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Activa el ordenamiento&lt;/font&gt;&lt;br /&gt;            ngine.SetSortFunc (&lt;font color="#ff00ff"&gt;0&lt;/font&gt;, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeIterCompareFunc(NombreCompareFunc));&lt;br /&gt;            ngine.SetSortFunc (&lt;font color="#ff00ff"&gt;1&lt;/font&gt;, &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeIterCompareFunc(DateCompareFunc));&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i &amp;lt; tv.Columns.Length; i++)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.Columns[i].SortColumnId = i;&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.Columns[i].SortColumnId = i;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Activa la busqueda !&lt;/font&gt;&lt;br /&gt;            tv.SearchEqualFunc =  &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewSearchEqualFunc (treeSearchFcn);&lt;br /&gt;            tv.SearchColumn = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/font&gt; (TreeViewColumn tvc &lt;font color="#a52a2a"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.Columns)&lt;br /&gt;                tvc.Clicked += &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; System.EventHandler&lt;br /&gt;                    (OnColumnClickedCallBack);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Genera datos de testing y los carga al treeview.&lt;/font&gt;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.LoadListStore ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// Cada TreeCellDataFunc, es encargada de:&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//  1 - Buscar el objeto correspondiente en el ListStore.&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//  2 - Tomar el valor indicado de dicho objeto (nombre o nacimiento).&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//  3 - Asignar el valor al CellRenderer, para que se vea dibujado en &lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;//      la celda.&lt;/font&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showNombrePersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#0000ff"&gt;// 0 (cero) indica el numero de columna. Igualmente, creo que es&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// bastante claro que aquí puedo utilizar 0 o 1, de forma &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// indistinta, ya que nuestro ListStore contiene la misma &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// referencia a Persona en ambos cells.&lt;/font&gt;&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; nom = (p.nombre == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;)?&lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;:p.nombre;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// Lo siguiente es mostrar el valor en la celda, Markup como ya &lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// dije es el atributo cuyo valor se muestra directamente en la&lt;/font&gt;&lt;br /&gt;            &lt;font color="#0000ff"&gt;// celda.&lt;/font&gt;&lt;br /&gt;            ((CellRendererText) cell).Markup = nom;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showDiaNacPersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            DateTime d = p.nacimiento;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val = d.Day.ToString ().PadLeft (&lt;font color="#ff00ff"&gt;2&lt;/font&gt;,&lt;font color="#ff00ff"&gt;'0'&lt;/font&gt;);&lt;br /&gt;            ((CellRendererText) cell).Markup = val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showMesNacPersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            DateTime d = p.nacimiento;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val = d.Month.ToString ().PadLeft (&lt;font color="#ff00ff"&gt;2&lt;/font&gt;,&lt;font color="#ff00ff"&gt;'0'&lt;/font&gt;);&lt;br /&gt;            ((CellRendererText) cell).Markup = val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; showAnoNacPersona (&lt;br /&gt;           Gtk.TreeViewColumn tree_column,&lt;br /&gt;           Gtk.CellRenderer cell,&lt;br /&gt;           Gtk.TreeModel tree_model,&lt;br /&gt;           Gtk.TreeIter iter )&lt;br /&gt;        {&lt;br /&gt;            Persona p =(Persona)&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (iter,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (p == &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;            DateTime d = p.nacimiento;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val = d.Year.ToString ().PadLeft (&lt;font color="#ff00ff"&gt;4&lt;/font&gt;,&lt;font color="#ff00ff"&gt;'0'&lt;/font&gt;);&lt;br /&gt;            ((CellRendererText) cell).Markup = val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; nombreCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;            p.nombre = args.NewText;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; yearCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; y = &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;.Parse(args.NewText);&lt;br /&gt;                DateTime dt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (y,p.nacimiento.Month, p.nacimiento.Day);&lt;br /&gt;                p.nacimiento = dt;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (System.Exception ex)&lt;br /&gt;            { }&lt;br /&gt;        }&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; monthCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; m = &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;.Parse(args.NewText);&lt;br /&gt;                DateTime dt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (p.nacimiento.Year,m, p.nacimiento.Day);&lt;br /&gt;                p.nacimiento = dt;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (System.Exception ex)&lt;br /&gt;            { }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; dayCellEdited (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EditedArgs args)&lt;br /&gt;        {&lt;br /&gt;            TreeIter rowPointer;&lt;br /&gt;            TreePath temp_path;&lt;br /&gt;            Persona p;&lt;br /&gt;            temp_path = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Gtk.TreePath (args.Path);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetIter (&lt;font color="#a52a2a"&gt;&lt;b&gt;out&lt;/b&gt;&lt;/font&gt; rowPointer, temp_path);&lt;br /&gt;            &lt;font color="#0000ff"&gt;// tree iter, columna&lt;/font&gt;&lt;br /&gt;            p = (Persona) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.GetValue (rowPointer,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; d = &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;.Parse(args.NewText);&lt;br /&gt;                DateTime dt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (p.nacimiento.Year,p.nacimiento.Month, d);&lt;br /&gt;                p.nacimiento = dt;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (System.Exception ex)&lt;br /&gt;            { }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;[,] TestDates = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;[,] { {&lt;font color="#ff00ff"&gt;2000&lt;/font&gt;,&lt;font color="#ff00ff"&gt;10&lt;/font&gt;,&lt;font color="#ff00ff"&gt;9&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1980&lt;/font&gt;,&lt;font color="#ff00ff"&gt;2&lt;/font&gt;, &lt;font color="#ff00ff"&gt;10&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1990&lt;/font&gt;,&lt;font color="#ff00ff"&gt;5&lt;/font&gt;,&lt;font color="#ff00ff"&gt;24&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1929&lt;/font&gt;, &lt;font color="#ff00ff"&gt;3&lt;/font&gt;, &lt;font color="#ff00ff"&gt;3&lt;/font&gt;}, {&lt;font color="#ff00ff"&gt;1993&lt;/font&gt;, &lt;font color="#ff00ff"&gt;12&lt;/font&gt;, &lt;font color="#ff00ff"&gt;7&lt;/font&gt;}};&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;[] TestNombres= {&lt;font color="#ff00ff"&gt;&amp;quot;Juan Peres&amp;quot;&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Jorge Pindocha&amp;quot;&lt;/font&gt;, &lt;font color="#ff00ff"&gt;&amp;quot;Ernesto Rodrigues&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Adrian Dilori&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;Clemente Tomas Taus&amp;quot;&lt;/font&gt;};&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; LoadListStore ()&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (&lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i = &lt;font color="#ff00ff"&gt;0&lt;/font&gt;; i &amp;lt; TestNombres.Length; i++)&lt;br /&gt;            {&lt;br /&gt;                DateTime nac = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DateTime (TestDates[i,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;], TestDates[i,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;],TestDates[i,&lt;font color="#ff00ff"&gt;2&lt;/font&gt;]);&lt;br /&gt;                Persona p = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Persona (TestNombres[i],nac);&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.ngine.AppendValues (p,p);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;virtual&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; NombreCompareFunc (TreeModel model, TreeIter src, TreeIter dst)&lt;br /&gt;        {&lt;br /&gt;            Persona srcObject=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;, dstObject=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            IComparable srcVal=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;, dstVal=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; ret=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;;&lt;br /&gt;            srcObject = (Persona)((ListStore)model).GetValue (src,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;            dstObject = (Persona)((ListStore)model).GetValue (dst,&lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                srcVal = (IComparable)srcObject.nombre;&lt;br /&gt;                dstVal = (IComparable)dstObject.nombre;&lt;br /&gt;                ret = srcVal.CompareTo (dstVal);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (InvalidCastException ex)&lt;br /&gt;            {&lt;br /&gt;                ;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ret;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;virtual&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; DateCompareFunc (TreeModel model, TreeIter src, TreeIter dst)&lt;br /&gt;        {&lt;br /&gt;            Persona srcObject=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;, dstObject=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            IComparable srcVal=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;, dstVal=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; ret=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;;&lt;br /&gt;            srcObject = (Persona)((ListStore)model).GetValue (src,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            dstObject = (Persona)((ListStore)model).GetValue (dst,&lt;font color="#ff00ff"&gt;1&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                srcVal = (IComparable)srcObject.nacimiento;&lt;br /&gt;                dstVal = (IComparable)dstObject.nacimiento;&lt;br /&gt;                ret = srcVal.CompareTo (dstVal);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (InvalidCastException ex)&lt;br /&gt;            {&lt;br /&gt;                ;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ret;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// busqueda con expresiones regulares !&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// lo hacemos de esta forma para no tener que recompilar cada expresion&lt;/font&gt;&lt;br /&gt;        &lt;font color="#0000ff"&gt;// en cada busqueda sobre la misma columna.&lt;/font&gt;&lt;br /&gt;        Regex searchEx= &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; regex = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/font&gt; treeSearchFcn&lt;br /&gt;            (TreeModel model, &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; columnNr, &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; key, TreeIter iter)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.regex == &lt;font color="#ff00ff"&gt;null&lt;/font&gt; || regex != key)&lt;br /&gt;                {&lt;br /&gt;                    StringBuilder sb = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StringBuilder (&lt;font color="#ff00ff"&gt;&amp;quot;^&amp;quot;&lt;/font&gt;);&lt;br /&gt;                    sb.Append(key);&lt;br /&gt;                    sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;*&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;.*&amp;quot;&lt;/font&gt;);&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (columnNr == &lt;font color="#ff00ff"&gt;1&lt;/font&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;/&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                        sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;-&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                        sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot; &amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                    }&lt;br /&gt;                    sb.Append(&lt;font color="#ff00ff"&gt;&amp;quot;.*&amp;quot;&lt;/font&gt;);&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.regex = key;&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.searchEx = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Regex (sb.ToString (),RegexOptions.IgnoreCase);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                ListStore ngine = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                Persona row=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; cellValue=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                ngine = (ListStore)model;&lt;br /&gt;                &lt;font color="#0000ff"&gt;// es indistinto si pongo 0 o 1 ya que ambos lugares guardan &lt;/font&gt;&lt;br /&gt;                &lt;font color="#0000ff"&gt;// la misma referencia.&lt;/font&gt;&lt;br /&gt;                row = (Persona) ngine.GetValue (iter, &lt;font color="#ff00ff"&gt;0&lt;/font&gt;);&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (columnNr == &lt;font color="#ff00ff"&gt;0&lt;/font&gt;)&lt;br /&gt;                    cellValue = row.nombre;&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;                    cellValue = row.nacimiento.ToString (&lt;font color="#ff00ff"&gt;&amp;quot;%dd%MM%yyyy&amp;quot;&lt;/font&gt;);&lt;br /&gt;                &lt;font color="#0000ff"&gt;//busqueda incremental seria algo así:&lt;/font&gt;&lt;br /&gt;                &lt;font color="#0000ff"&gt;//return !cellValue.StartsWith (key);&lt;/font&gt;&lt;br /&gt;                &lt;font color="#0000ff"&gt;//pero..., super busqueda con expresiones regulares !!!&lt;/font&gt;&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; !&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.searchEx.IsMatch (cellValue);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (ArgumentException argEx)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.regex = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;true&lt;/font&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; OnColumnClickedCallBack (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, EventArgs args)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; cnr=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/font&gt; (TreeViewColumn tvc &lt;font color="#a52a2a"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.Columns)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (sender == tvc) &lt;font color="#a52a2a"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;                cnr++;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.tv.SearchColumn = cnr;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; MainClass&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; Main (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            Application.Init ();&lt;br /&gt;            Window main = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Window (&lt;font color="#ff00ff"&gt;&amp;quot;TreeView de Ejemplo&amp;quot;&lt;/font&gt;);&lt;br /&gt;            main.DeleteEvent +=  &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; DeleteEventHandler (OnDeleteWindow);&lt;br /&gt;            TreeView tv = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; TreeViewExample().BuildTreeView ();&lt;br /&gt;            main.Add (tv);&lt;br /&gt;            main.ShowAll();&lt;br /&gt;            Application.Run ();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; OnDeleteWindow (&lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; sender, DeleteEventArgs args)&lt;br /&gt;        {&lt;br /&gt;            Application.Quit ();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bueno, espero que estos ejemplos le sean útiles a alguien, porque la verdad es que nunca pude encontrar ningún ejemplo mas o menos completo.&lt;br /&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/7426898488372542781-6786477634887042490?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/6786477634887042490/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=6786477634887042490&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/6786477634887042490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/6786477634887042490'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/08/gtktreeview-ejemplos-tiles.html' title='Gtk.TreeView: Ejemplos útiles.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-4154970204753420413</id><published>2008-07-27T11:38:00.000-07:00</published><updated>2008-07-27T11:48:37.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodevelop'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='mono installer bug'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='c sharp en linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Instalación de mono 1.9.1 en Ubuntu.</title><content type='html'>Si instalás la ultima version de mono desde el paquete binario (1.9.1), en ubuntu (y supongo cualquier otro linux), te vas a dar cuenta que no todo quedo bien. Cuando intentas ejecutar monodevelop, no va a funcionar por problemas con la mscorlib en primer lugar.&lt;br /&gt;&lt;br /&gt;Así que para quien lo quiera hacer, les comento cuales son las cosas que hay que reparar:&lt;br /&gt;- arreglar el problema de la mscorlib&lt;br /&gt;- arreglar problemas con la carga de monodevelop que surgen luego.&lt;br /&gt;&lt;br /&gt;Aclaro que todos los cambios que sugiero son sobre una instalación previa hecha  como root, (usando sudo), y el path de instalación fue: "/opt/mono-1.9.1"&lt;br /&gt;&lt;br /&gt;Pasos:&lt;br /&gt;1- Crear los enlaces a las dll para que monodevelop pueda cargar los  complementos en monodevelop.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder:~$ cd /opt/mono-1.9.1/lib/monodevelop/AddIns/&lt;br /&gt;jaa@dino-thunder:/opt/mono-1.9.1/lib/monodevelop/AddIns$ for f in */* ; do sudo ln -s $f . ; done&lt;br /&gt;&lt;/pre&gt; &lt;br/&gt;&lt;br /&gt;lo siguiente es para que cargue primero la dll con el soporte a C#. Sin esto no funcionarán muchos de los demas complementos como el Designer y tampoco permitirá compilar proyectos de C sharp (se que es un poco sucio, pero muy efectivo!).&lt;br /&gt;&lt;br/&gt;&lt;pre&gt;&lt;br /&gt;jaa@dino-thunder:/opt/mono-1.9.1/lib/monodevelop/AddIns$ cd /opt/mono-1.9.1/lib/monodevelop/bin/&lt;br /&gt;jaa@dino-thunder:/opt/mono-1.9.1/lib/monodevelop/bin$ sudo ln -s ../AddIns/MonoDevelop.CSharpBinding.* .&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2- Ahora resta editar el fichero que hace que arranque monodevelop, con esto arreglamos también el problema de la mscorlib que surje porque el script en realidad intenta utilizar una versión de mono incorrecta (el binario de /usr/bin/mono que para mi caso es el de la distro).&lt;br /&gt;&lt;br /&gt;jaa@dino-thunder:/opt/mono-1.9.1/lib/monodevelop/bin$ sudo vi /opt/mono-1.9.1/bin/monodevelop&lt;br /&gt;(si no te gusta vi! podes usar gedit!!) y cambiamos las siguientes lineas:&lt;br /&gt;-linea 56, ponemos un # al pricipio lo cual la invalida&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#MD_BIN_PATH=/usr/lib/monodevelop/bin&lt;br /&gt;- y debajo ponemos lo siguiente (quedaría en la linea 57):&lt;br /&gt;MD_BIN_PATH=/opt/mono-1.9.1/lib/monodevelop/bin&lt;br /&gt;-y al final del fichero, hacemos el siguiente cambio:&lt;br /&gt;#exec -a "monodevelop"  /usr/bin/mono ./MonoDevelop.exe "$@"&lt;br /&gt;exec -a "monodevelop"  /opt/mono-1.9.1/bin/mono ./MonoDevelop.exe "$@"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es importante ver que este ultimo cambio solo afecta a la invocación normal del script. Si queremos utilizar las opciones de debug, trace o profile, hay que modificar entre las lineas 82 y 99, y cambiar todas las ocurrencias de /usr/bin/mono con con /opt/mono-1.9.1/bin/mono&lt;br /&gt;&lt;br /&gt;Espero que le sirva a alguien, porque a mi me tomo unas dos o tres horas darme cuenta de que cambios realizar.&lt;br /&gt;&lt;br /&gt;NOTA: este post, también lo envié a la lista de correo de mono hispano.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-4154970204753420413?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/4154970204753420413/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=4154970204753420413&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/4154970204753420413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/4154970204753420413'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/07/instalacin-de-mono-191.html' title='Instalación de mono 1.9.1 en Ubuntu.'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-4454063922093512880</id><published>2008-07-02T14:53:00.000-07:00</published><updated>2008-08-18T07:47:05.122-07:00</updated><title type='text'>Consumir un Http Form con mono/.net</title><content type='html'>En esta entrada muestro algo muy similar a lo que hago en esta (), en la cual consumo un método de un form http. A diferencia del artículo anterior, en esta oportunidad lo voy a hacer con mono (.net también).&lt;br /&gt;&lt;br /&gt;En primer lugar presento una clase que generé, la cual es una abstracción de un http form:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; HttpForm&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/font&gt; HttpFormMethod : &lt;font color="#2e8b57"&gt;&lt;b&gt;uint&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        {&lt;br /&gt;            POST,&lt;br /&gt;            GET&lt;br /&gt;        }&lt;br /&gt;        HttpFormMethod method;&lt;br /&gt;        HttpWebRequest req;&lt;br /&gt;        HttpWebResponse resp;&lt;br /&gt;        Hashtable fields;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; EncodeData (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; paramName, &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/font&gt;+paramName+&lt;font color="#ff00ff"&gt;&amp;quot;=&amp;quot;&lt;/font&gt;+HttpUtility.UrlEncode (&lt;font color="#a52a2a"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/font&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url, HttpFormMethod method)&lt;br /&gt;        {&lt;br /&gt;            fields = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Hashtable ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.method = method;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.url = url;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm AddField (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; name, &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.fields[name]=val;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm RemoveField (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; name)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.fields.Remove(name);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (Exception ex)&lt;br /&gt;            { }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; getFieldsData ()&lt;br /&gt;        {&lt;br /&gt;            StringBuilder encodedData = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StringBuilder ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/font&gt; (DictionaryEntry de &lt;font color="#a52a2a"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.fields)&lt;br /&gt;                encodedData.Append (EncodeData (de.Key.ToString(), de.Value.ToString()));&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.method == HttpFormMethod.POST)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; System.Text.Encoding.Default.GetBytes (encodedData.ToString());&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; encodedData.ToString();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;virtual&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; Invoke ()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            Stream postDataWriter= &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            StreamReader reader = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; response = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.method == HttpFormMethod.POST)&lt;br /&gt;                {&lt;br /&gt;                    &lt;font color="#2e8b57"&gt;&lt;b&gt;byte&lt;/b&gt;&lt;/font&gt; [] buffer = (&lt;font color="#2e8b57"&gt;&lt;b&gt;byte&lt;/b&gt;&lt;/font&gt;[])&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.getFieldsData ();&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req = (HttpWebRequest)WebRequest.Create (url);&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.Method = method.ToString ();&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.ContentLength = buffer.Length;&lt;br /&gt;                    postDataWriter = &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.GetRequestStream ();&lt;br /&gt;                    postDataWriter.Write (buffer, &lt;font color="#ff00ff"&gt;0&lt;/font&gt;, buffer.Length);&lt;br /&gt;                    postDataWriter.Close ();&lt;br /&gt;                }&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req = (HttpWebRequest)WebRequest.Create (url+&lt;font color="#ff00ff"&gt;&amp;quot;?&amp;quot;&lt;/font&gt;+&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.getFieldsData ().ToString());&lt;br /&gt;                    System.Console.WriteLine (url+&lt;font color="#ff00ff"&gt;&amp;quot;?&amp;quot;&lt;/font&gt;+&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.getFieldsData ());&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;font color="#0000ff"&gt;// obtiene la respuesta&lt;/font&gt;&lt;br /&gt;                resp = (HttpWebResponse) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.GetResponse ();&lt;br /&gt;                reader = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StreamReader (resp.GetResponseStream ());&lt;br /&gt;                response = reader.ReadToEnd ();&lt;br /&gt;                reader.Close ();&lt;br /&gt;                resp.Close ();&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (reader != &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) reader.Close ();&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (resp != &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) resp.Close ();&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;throw&lt;/b&gt;&lt;/font&gt; ex;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; response;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sus métodos son:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-&lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url, HttpFormMethod method)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;el constructor, el primer parametro es la url de la accion, y el segundo es la forma en que se envian los parámetros, si vemos en la declaracion del formulario, nos daremos cuenta cual es el valor indicado aquí:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#008b8b"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;form&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt; &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;=&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;Consultar&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt; &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;action&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;=&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;../cgi-bin/ConsultaDisponibilidad.py&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt; &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;method&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;=&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;POST&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-&lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm AddField (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; name, &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;agrega un campo al formulario, es decir un parámetro con su correspondiente valor.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#008b8b"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;input&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt; &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;=&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;hidden&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt; &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;=&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;lang&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt; &lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;=&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;es&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-&lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm RemoveField (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; name)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;elimina un parámetro agregado con RemoveField ().&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-&lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;virtual&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; Invoke ()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;simplemente invoca el método y retorna la respuesta de este, por ejemplo código html.&lt;br /&gt;&lt;br /&gt;Bueno, ahora un ejemplo de su uso. En el siguiente, lo uso para buscar con google, y simplemente imprimo el codigo html resultante:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    HttpForm form = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; HttpForm (&lt;font color="#ff00ff"&gt;&amp;quot;&lt;a href="http://www.google.com.ar/search"&gt;http://www.google.com.ar/search&lt;/a&gt;&amp;quot;&lt;/font&gt;, HttpForm.HttpFormMethod.GET);&lt;br /&gt;    form.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;hl&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;es&amp;quot;&lt;/font&gt;);&lt;br /&gt;    form.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;q&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;river+plate&amp;quot;&lt;/font&gt;);&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ret = form.Invoke ();&lt;br /&gt;    System.Console.WriteLine (ret);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por lo que se ve es facil de utilizar. Ahora vamos a mostrar un ejemplo un poquitito mas complicado, el cual utiliza herencia, y expresiones regulares para analizar la respuesta del método. Además el método es invocado utilizando POST:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; GoogleTranslator&lt;br /&gt;    : HttpForm&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/font&gt; Lang: &lt;font color="#2e8b57"&gt;&lt;b&gt;uint&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        {&lt;br /&gt;            es,en&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url=&lt;font color="#ff00ff"&gt;&amp;quot;&lt;a href="http://translate.google.com/translate_t?langpair="&gt;http://translate.google.com/translate_t?langpair=&lt;/a&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ComposeLangPair (Lang fromLang, Lang toLang)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; fromLang.ToString()+&lt;font color="#ff00ff"&gt;&amp;quot;|&amp;quot;&lt;/font&gt;+toLang.ToString();&lt;br /&gt;        }&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; GoogleTranslator (Lang fromLang, Lang toLang)&lt;br /&gt;        : &lt;font color="#a52a2a"&gt;&lt;b&gt;base&lt;/b&gt;&lt;/font&gt; (url+ComposeLangPair (fromLang, toLang), HttpFormMethod.POST)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;hl&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;es&amp;quot;&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;ie&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;UTF-8&amp;quot;&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;langpair&amp;quot;&lt;/font&gt;,ComposeLangPair(fromLang, toLang));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ExtractTranslation (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; htmlCode)&lt;br /&gt;        {&lt;br /&gt;            Regex TradRegex;&lt;br /&gt;            Regex TradSubRegex;&lt;br /&gt;            Match m;&lt;br /&gt;            Group trad;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; str_regex = &lt;font color="#6a5acd"&gt;@&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;.*&amp;lt;div id=result_box dir=&amp;quot;&amp;quot;ltr&amp;quot;&amp;quot;&amp;gt;(([^&amp;lt;]+(&amp;lt;br&amp;gt;)*)*)&amp;lt;/div&amp;gt;.*&amp;quot;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; str_subregex = &lt;font color="#ff00ff"&gt;&amp;quot;[ ]?&amp;lt;br&amp;gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;            StringBuilder sb = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ret_val = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            TradRegex = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Regex (str_regex);&lt;br /&gt;            TradSubRegex = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Regex (str_subregex);&lt;br /&gt;            m = TradRegex.Match (htmlCode);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (m.Value != &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;.Empty)&lt;br /&gt;                sb = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StringBuilder (m.Groups[&lt;font color="#ff00ff"&gt;1&lt;/font&gt;].Value);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (sb != &lt;font color="#ff00ff"&gt;null&lt;/font&gt;)&lt;br /&gt;            {&lt;br /&gt;                sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;&amp;amp;lt;&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;lt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;&amp;amp;gt;&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                ret_val = sb.ToString ();&lt;br /&gt;                sb = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                System.GC.Collect ();&lt;br /&gt;                ret_val = TradSubRegex.Replace (ret_val,&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ret_val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; Translate (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; text)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; result=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.RemoveField (&lt;font color="#ff00ff"&gt;&amp;quot;text&amp;quot;&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;text&amp;quot;&lt;/font&gt;,text);&lt;br /&gt;            result = &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.Invoke ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ExtractTranslation (result);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este ejemplo utiliza la herencia para definir una nueva clase, la cual utiliza el servicio de traducción de texto de google.&lt;br /&gt;Entonces solo nos resta utilizarlo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; Main(&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;[] args)&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; result1 = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; result2 = &lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; text1=&lt;font color="#ff00ff"&gt;&amp;quot;El perro es blanco&amp;quot;&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; text2=&lt;font color="#ff00ff"&gt;&amp;quot;Este es otro ejemplo&amp;quot;&lt;/font&gt;;&lt;br /&gt;        GoogleTranslator gt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; GoogleTranslator (GoogleTranslator.Lang.es, GoogleTranslator.Lang.en);&lt;br /&gt;        result1 = gt.Translate (text1);&lt;br /&gt;        result2 = gt.Translate (text2);&lt;br /&gt;        System.Console.WriteLine (&lt;font color="#ff00ff"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/font&gt;,text1,result1);&lt;br /&gt;        System.Console.WriteLine (&lt;font color="#ff00ff"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/font&gt;,text2,result2);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bueno, ahora pongo todo este codigo completo para hacer copy/paste/test:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;// project created on 01/04/2008 at 13:39&lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Web;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Net;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.IO;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Text; &lt;font color="#0000ff"&gt;// StringBuilder&lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Text.RegularExpressions;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/font&gt; System.Collections;&lt;br /&gt;&lt;br /&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/font&gt; TestHttpRequest&lt;br /&gt;{&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; MainClass&lt;br /&gt;        {&lt;br /&gt;                &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; Main(&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;[] args)&lt;br /&gt;                {&lt;br /&gt;                    &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; result1 = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                    &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; result2 = &lt;font color="#ff00ff"&gt;&amp;quot;&amp;quot;&lt;/font&gt;;&lt;br /&gt;                    &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; text1=&lt;font color="#ff00ff"&gt;&amp;quot;El perro es blanco&amp;quot;&lt;/font&gt;;&lt;br /&gt;                    &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; text2=&lt;font color="#ff00ff"&gt;&amp;quot;Este es otro ejemplo&amp;quot;&lt;/font&gt;;&lt;br /&gt;                    GoogleTranslator gt = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; GoogleTranslator (GoogleTranslator.Lang.es, GoogleTranslator.Lang.en);&lt;br /&gt;                    result1 = gt.Translate (text1);&lt;br /&gt;                    result2 = gt.Translate (text2);&lt;br /&gt;                    System.Console.WriteLine (&lt;font color="#ff00ff"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/font&gt;,text1,result1);&lt;br /&gt;                    System.Console.WriteLine (&lt;font color="#ff00ff"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/font&gt;,text2,result2);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/font&gt; Lang : &lt;font color="#2e8b57"&gt;&lt;b&gt;short&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;    {&lt;br /&gt;        es=&lt;font color="#ff00ff"&gt;0&lt;/font&gt;,&lt;br /&gt;        en=&lt;font color="#ff00ff"&gt;1&lt;/font&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; HttpForm&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/font&gt; HttpFormMethod : &lt;font color="#2e8b57"&gt;&lt;b&gt;uint&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        {&lt;br /&gt;            POST,&lt;br /&gt;            GET&lt;br /&gt;        }&lt;br /&gt;        HttpFormMethod method;&lt;br /&gt;        HttpWebRequest req;&lt;br /&gt;        HttpWebResponse resp;&lt;br /&gt;        Hashtable fields;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; EncodeData (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; paramName, &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/font&gt;+paramName+&lt;font color="#ff00ff"&gt;&amp;quot;=&amp;quot;&lt;/font&gt;+HttpUtility.UrlEncode (&lt;font color="#a52a2a"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/font&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url, HttpFormMethod method)&lt;br /&gt;        {&lt;br /&gt;            fields = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Hashtable ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.method = method;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.url = url;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm AddField (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; name, &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; val)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.fields[name]=val;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; HttpForm RemoveField (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; name)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.fields.Remove(name);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (Exception ex)&lt;br /&gt;            { }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;object&lt;/b&gt;&lt;/font&gt; getFieldsData ()&lt;br /&gt;        {&lt;br /&gt;            StringBuilder encodedData = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StringBuilder ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;foreach&lt;/b&gt;&lt;/font&gt; (DictionaryEntry de &lt;font color="#a52a2a"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt; &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.fields)&lt;br /&gt;                encodedData.Append (EncodeData (de.Key.ToString(), de.Value.ToString()));&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.method == HttpFormMethod.POST)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; System.Text.Encoding.Default.GetBytes (encodedData.ToString());&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; encodedData.ToString();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;virtual&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; Invoke ()&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            Stream postDataWriter= &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            StreamReader reader = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; response = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.method == HttpFormMethod.POST)&lt;br /&gt;                {&lt;br /&gt;                    &lt;font color="#2e8b57"&gt;&lt;b&gt;byte&lt;/b&gt;&lt;/font&gt; [] buffer = (&lt;font color="#2e8b57"&gt;&lt;b&gt;byte&lt;/b&gt;&lt;/font&gt;[])&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.getFieldsData ();&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req = (HttpWebRequest)WebRequest.Create (url);&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.Method = method.ToString ();&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.ContentLength = buffer.Length;&lt;br /&gt;                    postDataWriter = &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.GetRequestStream ();&lt;br /&gt;                    postDataWriter.Write (buffer, &lt;font color="#ff00ff"&gt;0&lt;/font&gt;, buffer.Length);&lt;br /&gt;                    postDataWriter.Close ();&lt;br /&gt;                }&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req = (HttpWebRequest)WebRequest.Create (url+&lt;font color="#ff00ff"&gt;&amp;quot;?&amp;quot;&lt;/font&gt;+&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.getFieldsData ().ToString());&lt;br /&gt;                    System.Console.WriteLine (url+&lt;font color="#ff00ff"&gt;&amp;quot;?&amp;quot;&lt;/font&gt;+&lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.getFieldsData ());&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;font color="#0000ff"&gt;// obtiene la respuesta&lt;/font&gt;&lt;br /&gt;                resp = (HttpWebResponse) &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.req.GetResponse ();&lt;br /&gt;                reader = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StreamReader (resp.GetResponseStream ());&lt;br /&gt;                response = reader.ReadToEnd ();&lt;br /&gt;                reader.Close ();&lt;br /&gt;                resp.Close ();&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt; (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (reader != &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) reader.Close ();&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (resp != &lt;font color="#ff00ff"&gt;null&lt;/font&gt;) resp.Close ();&lt;br /&gt;                &lt;font color="#a52a2a"&gt;&lt;b&gt;throw&lt;/b&gt;&lt;/font&gt; ex;&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; response;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;font color="#2e8b57"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/font&gt; GoogleTranslator&lt;br /&gt;    : HttpForm&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;enum&lt;/b&gt;&lt;/font&gt; Lang: &lt;font color="#2e8b57"&gt;&lt;b&gt;uint&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        {&lt;br /&gt;            es,en&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; url=&lt;font color="#ff00ff"&gt;&amp;quot;&lt;a href="http://translate.google.com/translate_t?langpair="&gt;http://translate.google.com/translate_t?langpair=&lt;/a&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ComposeLangPair (Lang fromLang, Lang toLang)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; fromLang.ToString()+&lt;font color="#ff00ff"&gt;&amp;quot;|&amp;quot;&lt;/font&gt;+toLang.ToString();&lt;br /&gt;        }&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; GoogleTranslator (Lang fromLang, Lang toLang)&lt;br /&gt;        : &lt;font color="#a52a2a"&gt;&lt;b&gt;base&lt;/b&gt;&lt;/font&gt; (url+ComposeLangPair (fromLang, toLang), HttpFormMethod.POST)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;hl&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;es&amp;quot;&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;ie&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;UTF-8&amp;quot;&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;langpair&amp;quot;&lt;/font&gt;,ComposeLangPair(fromLang, toLang));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ExtractTranslation (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; htmlCode)&lt;br /&gt;        {&lt;br /&gt;            Regex TradRegex;&lt;br /&gt;            Regex TradSubRegex;&lt;br /&gt;            Match m;&lt;br /&gt;            Group trad;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; str_regex = &lt;font color="#6a5acd"&gt;@&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;.*&amp;lt;div id=result_box dir=&amp;quot;&amp;quot;ltr&amp;quot;&amp;quot;&amp;gt;(([^&amp;lt;]+(&amp;lt;br&amp;gt;)*)*)&amp;lt;/div&amp;gt;.*&amp;quot;&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; str_subregex = &lt;font color="#ff00ff"&gt;&amp;quot;[ ]?&amp;lt;br&amp;gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;            StringBuilder sb = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; ret_val = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            TradRegex = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Regex (str_regex);&lt;br /&gt;            TradSubRegex = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Regex (str_subregex);&lt;br /&gt;            m = TradRegex.Match (htmlCode);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (m.Value != &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt;.Empty)&lt;br /&gt;                sb = &lt;font color="#a52a2a"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; StringBuilder (m.Groups[&lt;font color="#ff00ff"&gt;1&lt;/font&gt;].Value);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (sb != &lt;font color="#ff00ff"&gt;null&lt;/font&gt;)&lt;br /&gt;            {&lt;br /&gt;                sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;&amp;amp;lt;&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;lt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                sb.Replace (&lt;font color="#ff00ff"&gt;&amp;quot;&amp;amp;gt;&amp;quot;&lt;/font&gt;,&lt;font color="#ff00ff"&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;                ret_val = sb.ToString ();&lt;br /&gt;                sb = &lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;                System.GC.Collect ();&lt;br /&gt;                ret_val = TradSubRegex.Replace (ret_val,&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;            }&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ret_val;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;font color="#2e8b57"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/font&gt; &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; Translate (&lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; text)&lt;br /&gt;        {&lt;br /&gt;            &lt;font color="#2e8b57"&gt;&lt;b&gt;string&lt;/b&gt;&lt;/font&gt; result=&lt;font color="#ff00ff"&gt;null&lt;/font&gt;;&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.RemoveField (&lt;font color="#ff00ff"&gt;&amp;quot;text&amp;quot;&lt;/font&gt;);&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.AddField (&lt;font color="#ff00ff"&gt;&amp;quot;text&amp;quot;&lt;/font&gt;,text);&lt;br /&gt;            result = &lt;font color="#a52a2a"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/font&gt;.Invoke ();&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ExtractTranslation (result);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;para compilar, simplemente:&lt;br /&gt;$ mcs archivo.cs -r:System.Web&lt;br /&gt;&lt;br /&gt;un ejemplo de su uso:&lt;br /&gt;jaa@dino-thunder:~$ mono archivo.exe &lt;br /&gt;El perro es blanco: The dog is white&lt;br /&gt;Este es otro ejemplo: This is another example&lt;br /&gt;jaa@dino-thunder:~$&lt;br /&gt;&lt;br /&gt;Y esto es todo por ahora.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-4454063922093512880?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/4454063922093512880/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=4454063922093512880&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/4454063922093512880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/4454063922093512880'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/07/consumir-un-http-form-con-mononet.html' title='Consumir un Http Form con mono/.net'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-8437496175335905526</id><published>2008-05-25T08:48:00.000-07:00</published><updated>2008-06-29T10:32:14.597-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conectividad j2me - python'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='j2me ws stub generation'/><category scheme='http://www.blogger.com/atom/ns#' term='wtk'/><category scheme='http://www.blogger.com/atom/ns#' term='soappy'/><category scheme='http://www.blogger.com/atom/ns#' term='j2me'/><category scheme='http://www.blogger.com/atom/ns#' term='conectividad j2me - soappy'/><category scheme='http://www.blogger.com/atom/ns#' term='wsdl'/><category scheme='http://www.blogger.com/atom/ns#' term='midp-2.0'/><title type='text'>Webservices para Mobiles: Comunicacion entre j2me y SOAPpy</title><content type='html'>En este artículo voy a describir los pasos necesarios para la comunicacion por medio de webservices (SOAP + wsdl) entre un cliente movil - celular por ejemplo - y un servidor remoto en internet implementado en python con el uso de SOAPpy.&lt;br /&gt;El cliente movil en teoría puede ser cualquier dispositivo que implemente midp-2.0 con el soporte especificado en jsr - 172.&lt;br /&gt;&lt;br /&gt;Herramientas necesarias:&lt;br /&gt;- Java sdk, y Java toolkit para desarrollo de aplicaciones j2me.&lt;br /&gt;- Sun Java Wireless Toolkit 2.5.2&lt;br /&gt;- Python v 2.4 o 2.5 (www.python.org)&lt;br /&gt;- SOAPpy  (http://pywebsvcs.sourceforge.net)&lt;br /&gt;&lt;br /&gt;Esquema:&lt;br /&gt;&lt;br /&gt;- El servidor esta implementado en python, y utilizando la libreria SOAPpy que es muy simple de usar. Esta contiene algunos bugs, (tal vez desprendidos de la simpleza), pero la idea es saltar estos para lograr conectividad.&lt;br /&gt;&lt;br /&gt;- El cliente es una aplicacion java para dispositivos moviles. Las caracteriscas necesarias del movil deberan ser: soporte para midp-2.0 y una coneccion a internet.&lt;br /&gt;Destaco que las pruebas que realizo las hago en el simulador incluido en Netbeans.&lt;br /&gt;&lt;br /&gt;- Un fichero WSDL que describe como se implementan los metodos ofrecidos por el servidor.&lt;br /&gt;&lt;br /&gt;Problemas:&lt;br /&gt;&lt;br /&gt;- En primer punto SOAPpy no ofrece mecanismos para generar ficheros WSDL (o por lo menos no descubrí ninguna utilidad). Este fichero es necesario para la generacion del codigo java de la aplicacion cliente, para lo que se utiliza una aplicacion del Wireless Toolkit distribuido por Sun.&lt;br /&gt;&lt;br /&gt;- El problema de conectividad surge en el uso de SOAPpy, la cual tiene algunos defectos en sus mecanismos de conectividad y en su documentacion que es MUY pobre.&lt;br /&gt;&lt;br /&gt;Manos a la obra:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Diseñando el metodo para el servicio.&lt;/span&gt;&lt;br /&gt;En primer lugar definimos el metodo para compartir. Nuestro metodo en python se define de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 139, 139);"&gt;request&lt;/span&gt;(String_1,String_2):&lt;br /&gt;  r = "&lt;span style="color: rgb(255, 0, 255);"&gt;%s, sos %s&lt;/span&gt;" % (str(String_1), str(String_2))&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; r&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como se ve en la declaracion, este metodo es simple, recive como parametros dos Strings y retorna un String.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Creando un fichero WSDL&lt;/span&gt;.&lt;br /&gt;Esta es la tarea mas complicada si no sabemos nada de WSDL; sus siglas significan Web Services Description Language, y su utilidad es esa misma, definir todos los aspectos necesarios para poder describir como se comporta un Servicio Web. Lo que mas nos importa acá es:&lt;br /&gt;&lt;br /&gt;- Una Seccion de definicion de tipos de datos: esto se hace en la seccion "types" del documento, e incluye:&lt;br /&gt;- Tipos de datos de entrada (ej: parametros de un metodo).&lt;br /&gt;- Tipos de datos de salida (ej:retorno de un metodo).&lt;br /&gt;&lt;br /&gt;- Secciones de definicion de los mensajes: en la cual se define la forma en que se envian y reciben mensajes para los metodos.&lt;br /&gt;&lt;br /&gt;- Secciones de definicion de Servicios: estas corresponden con las secciones portType, binding, operation y service, las cuales se encargan de todos los aspectos restantes de definicion de los servicios, es decir nombrar metodos, asociarles tipos de mensajes de ida y vuelta (parametros y retorno), y finalmente enlazarlos a un servicio dado.&lt;br /&gt;&lt;br /&gt;El fichero WSDL es generado como un fichero XML, con tags y atributos especificos que reflejen la semántica antes detallada.&lt;br /&gt;Si miramos en los ejemplos de wireless toolkit tendremos un fichero WSDL de ejemplo, nosotros lo modificamos a discrecion para poder reflejar los detalles de nuestro propio servicio, y la cosa nos queda así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xml&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;version&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"1.0"&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;encoding&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 2 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;definitions&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/wsdl/"&gt;http://schemas.xmlsoap.org/wsdl/&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 3 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;tns&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/wsdl"&gt;http://serverscript.org/wsdl&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 4 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;ns2&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/types"&gt;http://serverscript.org/types&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 5 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xsd&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://www.w3.org/2001/XMLSchema"&gt;http://www.w3.org/2001/XMLSchema&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 6 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;soap&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/wsdl/soap/"&gt;http://schemas.xmlsoap.org/wsdl/soap/&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 7 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"serverscript"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 8 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;targetNamespace&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/wsdl"&gt;http://serverscript.org/wsdl&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 9 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;types&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;10 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;schema&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://www.w3.org/2001/XMLSchema"&gt;http://www.w3.org/2001/XMLSchema&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;11 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;tns&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/types"&gt;http://serverscript.org/types&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;12 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;soap11-enc&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/soap/encoding/"&gt;http://schemas.xmlsoap.org/soap/encoding/&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;13 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xsi&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;14 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;wsdl&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/wsdl/"&gt;http://schemas.xmlsoap.org/wsdl/&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;15 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;targetNamespace&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/types"&gt;http://serverscript.org/types&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;16 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;import&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/soap/encoding/"&gt;http://schemas.xmlsoap.org/soap/encoding/&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;17 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;complexType&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;18 &lt;/span&gt;                &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;sequence&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;19 &lt;/span&gt;                &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;element&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"String_1"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"string"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;nillable&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"true"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;20 &lt;/span&gt;                &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;element&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"String_2"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"string"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;nillable&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"true"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;21 &lt;/span&gt;                &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/sequence&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;22 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/complexType&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;23 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;complexType&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"requestResponse"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;24 &lt;/span&gt;                &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;sequence&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;25 &lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;-- este debe llamarse Result para que funcione --&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;26 &lt;/span&gt;                    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;element&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"Result"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"string"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;nillable&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"true"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;27 &lt;/span&gt;                &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/sequence&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;28 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/complexType&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;29 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;element&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"tns:request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;30 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;element&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"requestResponse"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"tns:requestResponse"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;31 &lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;-- esto lo agrego --&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;32 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/schema&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;33 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/types&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;34 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;message&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"Interface_request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;35 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;part&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"parameters"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;element&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"ns2:request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;36 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;37 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;message&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"Interface_requestResponse"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;38 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;part&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"result"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;element&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"ns2:requestResponse"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;39 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;40 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;portType&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"Interface"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;41 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;operation&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;42 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;input&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;message&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"tns:Interface_request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;43 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;output&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;message&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"tns:Interface_requestResponse"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;44 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/operation&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;45 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/portType&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;46 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"InterfaceBinding"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"tns:Interface"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;47 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;operation&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"request"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;48 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;input&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;49 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;soap&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;use&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"literal"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;50 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/input&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;51 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;output&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;52 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;soap&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;use&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"literal"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;53 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/output&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;54 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;soap&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;operation&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;soapAction&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;""&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;55 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/operation&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;56 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;soap&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;binding&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;transport&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/soap/http"&gt;http://schemas.xmlsoap.org/soap/http&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;style&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"document"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/binding&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;57 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;service&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"Serverscript"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;58 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;port&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;name&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"InterfacePort"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;binding&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"tns:InterfaceBinding"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;59 &lt;/span&gt;            &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(106, 90, 205);"&gt;soap&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;address&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;xmlns&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;wsdl&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://schemas.xmlsoap.org/wsdl/"&gt;http://schemas.xmlsoap.org/wsdl/&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;60 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;location&lt;/b&gt;&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://localhost:8080/"&gt;http://localhost:8080&lt;/a&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;61 &lt;/span&gt;        &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/port&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;62 &lt;/span&gt;    &lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/service&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;63 &lt;/span&gt;&lt;span style="color: rgb(0, 139, 139);"&gt;&amp;lt;/definitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bueno, es necesario explicar ahora los puntos relevantes. En primer lugar el &lt;span style="font-weight: bold;"&gt;namespace&lt;/span&gt; para los tipos es: http://serverscript.org/types. Como se ve, no me tome el trabajo de cambiar el nombre del namespace con el que trae el fichero ejemplo de WTK, esto es un cambio minimo, así que si se quiere puede hacerce.&lt;br /&gt;Ademas es claro que hay dos definiciones de tipos:&lt;br /&gt;&lt;br /&gt;- El tipo &lt;span style="font-weight: bold;"&gt;"request&lt;/span&gt;", el cual anida dos strings en su interior: String_1 y String_2. Es importante notar que para que la comunicacion funcione, debe definirse un tipo con &lt;span style="font-weight: bold;"&gt;el mismo nombre que el metodo --request--,&lt;/span&gt; y que internamente tenga las definiciones de los parametros.&lt;br /&gt;&lt;br /&gt;- El tipo "&lt;span style="font-weight: bold;"&gt;requestResponse"&lt;/span&gt;, el cual anida un subtipo "Result", el cual anida el tipo de retorno de nuestro metodo. Hay dos cosas importantes en este, la primera es (como en el caso anterior) el nombre; para que la comunicacion funcione, debe existir definido en el WSDL un tipo para el mensaje de retorno del metodo el cual debe ser de la forma NombreDelMetodo&lt;span style="font-weight: bold;"&gt;Response&lt;/span&gt;. En segundo lugar el subtipo &lt;span style="font-weight: bold;"&gt;"Result"&lt;/span&gt; en el interior debe ponerse así ya que SOAPpy maneja de esta manera el retorno desde metodos.&lt;br /&gt;&lt;br /&gt;Estas dos definiciones de tipos anteriores deben ser así por limitaciones en SOAPpy. Para empezar este espera nombres de tipos en esta forma para sus metodos (metodo y metodoResponse). En segundo lugar el retorno del metodo (cuando hacemos return desde nuestra funcion) es manejado por SOAPpy con un subtipo &lt;span style="font-weight: bold;"&gt;"Result"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Generacion del codigo del Servidor.&lt;br /&gt;&lt;/span&gt;Para el Servidor, el codigo es el siguiente:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 1 &lt;/span&gt;&lt;span style="color: rgb(160, 32, 240);"&gt;from&lt;/span&gt; SOAPpy &lt;span style="color: rgb(160, 32, 240);"&gt;import&lt;/span&gt; SOAPServer&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 2 &lt;/span&gt;tns=u"&lt;span style="color: rgb(255, 0, 255);"&gt;&lt;a href="http://serverscript.org/types"&gt;http://serverscript.org/types&lt;/a&gt;&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 3 &lt;/span&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 139, 139);"&gt;request&lt;/span&gt;(String_1,String_2):&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 4 &lt;/span&gt;    r = "&lt;span style="color: rgb(255, 0, 255);"&gt;%s, sos %s&lt;/span&gt;" % (str(String_1), str(String_2))&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 5 &lt;/span&gt;    &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; r&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 6 &lt;/span&gt;ss = SOAPServer (("&lt;span style="color: rgb(255, 0, 255);"&gt;localhost&lt;/span&gt;",8080))&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 7 &lt;/span&gt;ss.namespace=tns&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 8 &lt;/span&gt;ss.registerFunction (request)&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 9 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# debug, obviamente es opcional.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;10 &lt;/span&gt;ss.config.debug=1&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;11 &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# a servir&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;12 &lt;/span&gt;ss.serve_forever ()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Las cosas relevantes son:&lt;br /&gt;- La definicion del metodo "request".&lt;br /&gt;- La creacion del servidor, el cual se enlaza a localhost en el port 8080.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;- La definicion del &lt;span style="font-weight: bold;"&gt;namespace&lt;/span&gt;. Ojo que esto es importante, si no se hace nuestro servidor no podrá interpretar correctamente los mensajes de entrada (para la invocacion del metodo con sus parametros).&lt;br /&gt;- Registro del metodo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Generacion del Cliente. &lt;/span&gt;&lt;br /&gt;Bueno para esta tarea se utilizan dos herramientas:&lt;br /&gt;- WTK 2.5: Exclusivamente para la creacion del código de conexion el WebService.&lt;br /&gt;- Netbeans: Para la creacion de la aplicacion java en su respectivo jar.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;4.1. Creacion de las clases java para conexion.&lt;br /&gt;&lt;/span&gt;Bueno en esta etapa vamos a generar 4 clases java:&lt;br /&gt;- La clase request. Correspondiente con el tipo ya nombrado.&lt;br /&gt;- La clase requestResponse, correspondiente con el tipo ya nombrado.&lt;br /&gt;- La clase con todo el codigo java necesario para acceder al ws (Interface_Stub).&lt;br /&gt;- Una clase que hereda de la anterior, implementa interfaces necesarias, y nos deja todo bien simple para interactuar con el servicio (Interface).&lt;br /&gt;Para esto es necesario como ya dije utilizar el WTK distribuido por Sun.&lt;br /&gt;Pasos necesarios:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;4.1.1. Ejecutamos el Toolkit:&lt;/span&gt;&lt;br /&gt;$ ./ktoolbar&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq7I/AAAAAAAAABA/1tM-eN8EQc8/s1600-h/ktoolbar.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq7I/AAAAAAAAABA/1tM-eN8EQc8/s320/ktoolbar.jpg" alt="" id="BLOGGER_PHOTO_ID_5207402129647643570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;4.1.2. Creamos el projecto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq8I/AAAAAAAAABI/v2yELsdnQWk/s1600-h/CreatingProject.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq8I/AAAAAAAAABI/v2yELsdnQWk/s320/CreatingProject.jpg" alt="" id="BLOGGER_PHOTO_ID_5207402129647643586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;4.1.3. Generamos las clases nombradas al principio.&lt;/span&gt; Para esto vamos al meno Project, y elejimos la opcion "Stub Generation". Se abrirá un dialogo en el cual tenemos que especificar nuestro fichero wsdl (como el que pongo mas arriva) y nombre para el paquete java que vamos a generar.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq9I/AAAAAAAAABQ/pa72DITPLtI/s1600-h/CreatingCodeStub.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq9I/AAAAAAAAABQ/pa72DITPLtI/s320/CreatingCodeStub.jpg" alt="" id="BLOGGER_PHOTO_ID_5207402129647643602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Todo el codigo que generamos estará en el directorio de nuestro proyecto, en linux,  el directorio sera: :"~/j2mewtk/2.5.2/apps/DummyProject/src/Conectividad/":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zWTIVoEiRH8/SERoppxCq-I/AAAAAAAAABY/ED3L5exTELw/s1600-h/CodeList.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_zWTIVoEiRH8/SERoppxCq-I/AAAAAAAAABY/ED3L5exTELw/s320/CodeList.jpg" alt="" id="BLOGGER_PHOTO_ID_5207402133942610914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bueno con esto ya tenemos todo el codigo para conectividad. Solo nos restan unas pequeñas cosas para que todo funcione:&lt;br /&gt;- Primero editamos el fichero Interface_Stub, y hacemos las siguientes modificaciones:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 94 &lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 95 &lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;//  End user methods&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 96 &lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;// &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 97 &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 98 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; QName _qname_String_1 = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; QName(&lt;span style="color: rgb(255, 0, 255);"&gt;""&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"String_1"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt; 99 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; QName _qname_String_2 = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; QName(&lt;span style="color: rgb(255, 0, 255);"&gt;""&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"String_2"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;100 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; QName _qname_result = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; QName(&lt;span style="color: rgb(255, 0, 255);"&gt;""&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"Result"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;101 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; QName _qname_request = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; QName(&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/types"&gt;http://serverscript.org/types&lt;/a&gt;"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"request"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;102 &lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;// cambiamos la siguiente linea&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;103 &lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;// protected static final QName _qname_requestResponse = new QName("&lt;a href="http://serverscript.org/types"&gt;http://serverscript.org/types&lt;/a&gt;", "requestResponse");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;104 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; QName _qname_requestResponse = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; QName(&lt;span style="color: rgb(255, 0, 255);"&gt;""&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"requestResponse"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;105 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; QName _qname_wsdl_request = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; QName(&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://serverscript.org/wsdl"&gt;http://serverscript.org/wsdl&lt;/a&gt;"&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 255);"&gt;"request"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;106 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; Element _type_request;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;107 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;protected&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; Element _type_requestResponse;&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;108 &lt;/span&gt;        &lt;span style="color: rgb(46, 139, 87);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: rgb(165, 42, 42);"&gt;109 &lt;/span&gt;         &lt;span style="color: rgb(0, 0, 255);"&gt;// Create all of the Type's that this stub uses, once.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Lo que hice fué cambiar la linea 103 por la linea 104. La idea de esta acción es que java vea el namespace del tipo que se está haciendo referencia como un namespace vacion ("" en lugar de "http://serverscript.org/types") ya que SOAPpy devuelve el tipo indicando un namespace de esta forma (un poco raro, tal vez sea un bug o tal vez sea que tengo mal codificado mi servidor, pero no encontré como hacerlo correctamente en la documentacion).&lt;br /&gt;&lt;br /&gt;- Luego solo nos resta incluir todos los ficheros java que nos generó el toolkit en nuestro proyecto, y simplemente invocar el servicio:&lt;br /&gt;&lt;pre&gt;     Interface_Stub is = &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; Interface_Stub ();&lt;br /&gt;  is._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, &lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;a href="http://localhost:8080/"&gt;http://localhost:8080&lt;/a&gt;"&lt;/span&gt;);&lt;br /&gt;  is._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, &lt;span style="color: rgb(165, 42, 42);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt; Boolean(&lt;span style="color: rgb(255, 0, 255);"&gt;true&lt;/span&gt;));&lt;br /&gt;  String ret = is.request(&lt;span style="color: rgb(255, 0, 255);"&gt;"River Plate"&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 255);"&gt;"el mas grande"&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;la forma más sencilla de probar la conectividad,  sería ponerlo en el método startApp(), o por lo menos lo es para mi.&lt;br /&gt;&lt;br /&gt;- Finalmente, ya podemos probar la conectividad, (obviamente en primer lugar hay que ejecutar el servidor):&lt;br /&gt;&lt;div style="text-align: center;"&gt;(1) Ejecutamos el servidor:&lt;br /&gt;&lt;/div&gt;  &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zWTIVoEiRH8/SGfFx8_m_6I/AAAAAAAAAB4/VBmBU12w4sg/s1600-h/RunningServer1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_zWTIVoEiRH8/SGfFx8_m_6I/AAAAAAAAAB4/VBmBU12w4sg/s320/RunningServer1.jpg" alt="" id="BLOGGER_PHOTO_ID_5217356155309195170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;(2) Ejecutamos el software para testing:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/SGfChve-xkI/AAAAAAAAABg/Bv0Cc7oIJLc/s1600-h/Running1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/SGfChve-xkI/AAAAAAAAABg/Bv0Cc7oIJLc/s320/Running1.jpg" alt="" id="BLOGGER_PHOTO_ID_5217352578269890114" border="0" /&gt;&lt;/a&gt;(3) Respondemos a la pregunta de seguridad:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/SGfCh2_JvRI/AAAAAAAAABo/dysLVdfWWE8/s1600-h/Running2.jpg"&gt; &lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/SGfCh2_JvRI/AAAAAAAAABo/dysLVdfWWE8/s320/Running2.jpg" alt="" id="BLOGGER_PHOTO_ID_5217352580283874578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;(4) - El resultado final:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/SGfCh8xVEmI/AAAAAAAAABw/3znlyaTt1UE/s1600-h/Running3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/SGfCh8xVEmI/AAAAAAAAABw/3znlyaTt1UE/s320/Running3.jpg" alt="" id="BLOGGER_PHOTO_ID_5217352581836509794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bueno, con esto queda demostrada la conectividad entre cliente y servidor. Si por algún motivo no se logra la conección, puede verificarse en la salida por consola del servidor, para asegurarse de que la petición está llegando y que el servidor responde correctamente.&lt;br /&gt;&lt;br /&gt;Obviamente si lo que se quiere es hacer algo mas complejo, simplemente debería investigarse un poco más, pero creo que con estos parametros que dí en esta entrada, se le puede simplificar un poco la investigación a cualquiera que tenga que luchar con este problema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-8437496175335905526?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/8437496175335905526/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=8437496175335905526&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/8437496175335905526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/8437496175335905526'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/05/webservices-para-mobiles-comunicacion.html' title='Webservices para Mobiles: Comunicacion entre j2me y SOAPpy'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_zWTIVoEiRH8/SERopZxCq7I/AAAAAAAAABA/1tM-eN8EQc8/s72-c/ktoolbar.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-7532540021936823175</id><published>2008-04-01T16:32:00.001-07:00</published><updated>2008-07-05T09:23:31.431-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='post'/><category scheme='http://www.blogger.com/atom/ns#' term='urllib'/><category scheme='http://www.blogger.com/atom/ns#' term='urllib2'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='get'/><category scheme='http://www.blogger.com/atom/ns#' term='webservices'/><title type='text'>Webservice Rústicos: aprobechando servicios POST en internet</title><content type='html'>&lt;span style="font-style: italic;"&gt;En este articulo muestro como aprobechar la funcionalidad de un form de html en una pagina en internet. Este articulo muestra como obtener traducciones de texto desde la pagina de google (http://translate.google.com), pero explicando paso a paso el desarrollo del ejemplo. Como lenguaje uso python por lo facil que hacer y probar cosas con este.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En primer lugar le damos un vistazo a la interfaz, por ejemplo entramos a la pagina, elegimos las opciones de traduccion, ponemos un texto, y le damos al boton "Traduzca", nos queda lo siguiente:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_zWTIVoEiRH8/R_j8qFV5MOI/AAAAAAAAAAQ/HWXlVvR4jVs/s1600-h/traduccion.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_zWTIVoEiRH8/R_j8qFV5MOI/AAAAAAAAAAQ/HWXlVvR4jVs/s320/traduccion.jpg" alt="" id="BLOGGER_PHOTO_ID_5186172770835837154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Bueno aca lo importante es el codigo html, así que lo que hacemos es visualizar dicho codigo, y vemos que llega bastante feo, todo de corrido sin ningun formato..., pero despues de un buen rato de dar vueltas, buscamos en el codigo la parte que nos interesa (la del formulario de traduccion de texto).&lt;br /&gt;&lt;br /&gt;Tomamos el codigo y lo llevamos a nuestro buen amigo editor de texto, lo formateamos un poco, borramos todo lo que nos sobre, y tenemos algo así:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_zWTIVoEiRH8/R_j9BlV5MPI/AAAAAAAAAAY/CstSsTLnK4k/s1600-h/Source.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_zWTIVoEiRH8/R_j9BlV5MPI/AAAAAAAAAAY/CstSsTLnK4k/s320/Source.jpg" alt="" id="BLOGGER_PHOTO_ID_5186173174562762994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;De la declaracion del form identificamos las dos cosas mas importantes:&lt;br /&gt;&lt;br /&gt;1. Url a enviar los datos:&lt;br /&gt;'http://translate.google.com/translate_t?langpair='+this.langpair.value;", que es seteada en base a la seleccion del langpair por ejemplo es|en, (despues cuando veas los parametros se va a notar mas esto) y entonces puede llegar a quedar algo así:&lt;br /&gt;'http://translate.google.com/translate_t?langpair=es|en'&lt;br /&gt;&lt;br /&gt;2. Si los parametros viajan por el metodo POST o GET:&lt;br /&gt;Para nuestro caso es claro que dice POST (dice claramente method=post)&lt;br /&gt;&lt;br /&gt;Sin dar mas vueltas ojeamos los parametros:&lt;br /&gt;un input oculto (hidden) de nombre 'hl' y que para nuestro caso su valor sera 'es' segun dice el codigo.&lt;br /&gt;un input oculto de nombre 'ie' que dice el encoding, el cual rellenamos con el valor 'UTF-8' segun dice en el codigo&lt;br /&gt;un textarea de nombre 'text' en el cual pondremos nuestro texto a traducir.&lt;br /&gt;un ultimo parametro de nombre 'langpair' y que debe seleccionarse de la larga lista, por ejemplo si traducimos desde español a la lengua de bill decimos 'es|en' en este campo.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;En resumen:&lt;br /&gt;hl=es&lt;br /&gt;ie=UTF-8&lt;br /&gt;text=el perro es blanco&lt;br /&gt;langpair=es|en&lt;br /&gt;&lt;br /&gt;entonces en python el codigo de invocacion al sercio queda algo así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;19 &lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/font&gt; &lt;font color="#008b8b"&gt;getTranslation&lt;/font&gt; (fromLang, toLang, text):&lt;br /&gt;&lt;font color="#a52a2a"&gt;20 &lt;/font&gt;    &lt;font color="#a020f0"&gt;import&lt;/font&gt; urllib&lt;br /&gt;&lt;font color="#a52a2a"&gt;21 &lt;/font&gt;    &lt;font color="#a020f0"&gt;import&lt;/font&gt; urllib2&lt;br /&gt;&lt;font color="#a52a2a"&gt;22 &lt;/font&gt;    langpair=fromLang+&amp;quot;&lt;font color="#ff00ff"&gt;|&lt;/font&gt;&amp;quot;+toLang&lt;br /&gt;&lt;font color="#a52a2a"&gt;23 &lt;/font&gt;    url = &amp;quot;&lt;font color="#ff00ff"&gt;&lt;a href="http://translate.google.com/translate_t?langpair="&gt;http://translate.google.com/translate_t?langpair=&lt;/a&gt;&lt;/font&gt;&amp;quot;+langpair&lt;br /&gt;&lt;font color="#a52a2a"&gt;24 &lt;/font&gt;    values = {'&lt;font color="#ff00ff"&gt;hl&lt;/font&gt;':&amp;quot;&lt;font color="#ff00ff"&gt;es&lt;/font&gt;&amp;quot;,'&lt;font color="#ff00ff"&gt;ie&lt;/font&gt;':&amp;quot;&lt;font color="#ff00ff"&gt;UTF-8&lt;/font&gt;&amp;quot;,'&lt;font color="#ff00ff"&gt;text&lt;/font&gt;':text,&amp;quot;&lt;font color="#ff00ff"&gt;langpair&lt;/font&gt;&amp;quot;:langpair}&lt;br /&gt;&lt;font color="#a52a2a"&gt;25 &lt;/font&gt;    &lt;font color="#0000ff"&gt;# Falla si se deja el agent por default en urllib2&lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;26 &lt;/font&gt;    headers = { '&lt;font color="#ff00ff"&gt;User-Agent&lt;/font&gt;' : '&lt;font color="#ff00ff"&gt;Mozilla&lt;/font&gt;'}&lt;br /&gt;&lt;font color="#a52a2a"&gt;27 &lt;/font&gt;    data = urllib.urlencode(values)&lt;br /&gt;&lt;font color="#a52a2a"&gt;28 &lt;/font&gt;    req = urllib2.Request(url, data,headers)&lt;br /&gt;&lt;font color="#a52a2a"&gt;29 &lt;/font&gt;    response = urllib2.urlopen(req)&lt;br /&gt;&lt;font color="#a52a2a"&gt;30 &lt;/font&gt;    lines = response.readlines ()&lt;br /&gt;&lt;font color="#a52a2a"&gt;31 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; extractTranslation (lines)&lt;br /&gt;&lt;font color="#a52a2a"&gt;32 &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; al hacer urlencode (values) no hace mas que formar una cadena con los parametros formateados como para enviar los datos con GET:&lt;br /&gt;&lt;br /&gt;&gt; print data&lt;br /&gt;langpair=es%7Cen&amp;amp;text=El+Perro+es+blanco&amp;amp;ie=UTF-8&amp;amp;hl=es&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;así que este es el punto clave en que se define la forma de enviar los datos, nosotros utilizaremos POST, así que proseguimos.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Proseguimos formando el POST request con los datos codificados mas los headers adicionales,&lt;br /&gt;&lt;br /&gt;req = urllib2.Request(url, data,headers),&lt;br /&gt;&lt;br /&gt;y luego hacer:&lt;br /&gt;&lt;br /&gt;response = urllib2.urlopen(req)&lt;br /&gt;&lt;br /&gt;lo que hacemos en enviar todos los datos por el metodo POST.&lt;br /&gt;&lt;br /&gt;Para finalizar leemos tooooda la respuesta desde el par que responde, esta no es mas que todo el codigo de la pagina que google nos muestra al darle click al boton traducir, pero en fin, el texto traducido esta ahí en su interior.&lt;br /&gt;Lo que hacemos para encontrar el texto de una forma mas o menos sencilla y elegante, es utilizar expresiones regulares para analizar el texto. Pero antes de hacer cualquier cosa, le pasamos la vista por encima a la parte del codigo que tiene la traduccion, y lo encontramos por ejemplo buscando alguna palabra que sabemos que esta ahí:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_zWTIVoEiRH8/R_j9UVV5MQI/AAAAAAAAAAg/TFH1t4_IpDg/s1600-h/codigo_ubica_traduccion.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_zWTIVoEiRH8/R_j9UVV5MQI/AAAAAAAAAAg/TFH1t4_IpDg/s320/codigo_ubica_traduccion.jpg" alt="" id="BLOGGER_PHOTO_ID_5186173496685310210" border="0" /&gt;&lt;/a&gt;entonces:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_zWTIVoEiRH8/R_j9r1V5MRI/AAAAAAAAAAo/0EwEu-Ge1lI/s1600-h/TraduccionEncontrada.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_zWTIVoEiRH8/R_j9r1V5MRI/AAAAAAAAAAo/0EwEu-Ge1lI/s320/TraduccionEncontrada.jpg" alt="" id="BLOGGER_PHOTO_ID_5186173900412236050" border="0" /&gt;&lt;/a&gt;Entonces podemos notar que el tag que encierra el texto traducido es unico en el codigo:&lt;br /&gt;&lt;br /&gt;&amp;lt;div id=result_box dir="ltr"&amp;gt; Nuestro texto traducido&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;Entonces ahora si podemos hacer uso de expresiones regulares para generar nuestra funcion extractTraduction ():&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 5 &lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/font&gt; &lt;font color="#008b8b"&gt;extractTranslation&lt;/font&gt; (lines):&lt;br /&gt;&lt;font color="#a52a2a"&gt; 6 &lt;/font&gt;    &lt;font color="#a020f0"&gt;import&lt;/font&gt; re&lt;br /&gt;&lt;font color="#a52a2a"&gt; 7 &lt;/font&gt;    expr = &amp;quot;&lt;font color="#ff00ff"&gt;.*&amp;lt;div id=result_box dir=&lt;/font&gt;&lt;font color="#6a5acd"&gt;\&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt;ltr&lt;/font&gt;&lt;font color="#6a5acd"&gt;\&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;gt;(?P&amp;lt;Translation&amp;gt;([^&amp;lt;]+(&amp;lt;br&amp;gt;)*)*)&amp;lt;/div&amp;gt;.*&lt;/font&gt;&amp;quot;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 8 &lt;/font&gt;    pattern   = re.compile (expr)&lt;br /&gt;&lt;font color="#a52a2a"&gt; 9 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; l &lt;font color="#a52a2a"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt; lines:&lt;br /&gt;&lt;font color="#a52a2a"&gt;10 &lt;/font&gt;        m = pattern.match (l)&lt;br /&gt;&lt;font color="#a52a2a"&gt;11 &lt;/font&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; m:&lt;br /&gt;&lt;font color="#a52a2a"&gt;12 &lt;/font&gt;            res = m.group (&amp;quot;&lt;font color="#ff00ff"&gt;Translation&lt;/font&gt;&amp;quot;)&lt;br /&gt;&lt;font color="#a52a2a"&gt;13 &lt;/font&gt;            res = res.replace (&amp;quot;&lt;font color="#ff00ff"&gt;&amp;amp;lt;&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#ff00ff"&gt;&amp;lt;&lt;/font&gt;&amp;quot;)&lt;br /&gt;&lt;font color="#a52a2a"&gt;14 &lt;/font&gt;            res = res.replace (&amp;quot;&lt;font color="#ff00ff"&gt;&amp;amp;gt;&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#ff00ff"&gt;&amp;gt;&lt;/font&gt;&amp;quot;)&lt;br /&gt;&lt;font color="#a52a2a"&gt;15 &lt;/font&gt;            res = re.sub (&amp;quot;&lt;font color="#ff00ff"&gt;([ ]*&amp;lt;br&amp;gt;[ ]*)&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&amp;quot;,res)&lt;br /&gt;&lt;font color="#a52a2a"&gt;16 &lt;/font&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; res&lt;br /&gt;&lt;font color="#a52a2a"&gt;17 &lt;/font&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; None&lt;br /&gt;&lt;font color="#a52a2a"&gt;18 &lt;/font&gt;&lt;br /&gt;&lt;/pre&gt; Bueno la cosa esta asi, nuestra expresion busca por una cantidad indefinida de caracteres que no incluya el &lt; (que marca el fin al aparecer en ) o que lo incluya pero en una expresion que marca nueva linea. Una vez encontrado el texto, lo que se hace es reemplazar algunas cosas de html antes de retornalas, por ejemplo si nuestro texto a traducir incluía un &lt;&gt;, entonces la traduccion es retornada con los codigos de estos: &amp;lt; e &amp;gt;, entonces ahora tenemos que restaurarlos, también, cada caracter de nueva linea (\n) es simbolizado como&lt;br /&gt;en html, entonces tenemos que reemplazarlos tambien.&lt;br /&gt;&lt;br /&gt;En fin, este codigo es bastante sencillo, así que lo dejo terminado:&lt;br /&gt;Texto plano:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;#!/usr/bin/python&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;#autor: jonatan anauati&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;#email: barakawins@gmail.com&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;#licencia: LGPL&lt;/font&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/font&gt; &lt;font color="#008b8b"&gt;extractTranslation&lt;/font&gt; (lines):&lt;br /&gt;    &lt;font color="#a020f0"&gt;import&lt;/font&gt; re&lt;br /&gt;    expr = &amp;quot;&lt;font color="#ff00ff"&gt;.*&amp;lt;div id=result_box dir=&lt;/font&gt;&lt;font color="#6a5acd"&gt;\&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt;ltr&lt;/font&gt;&lt;font color="#6a5acd"&gt;\&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;gt;(?P&amp;lt;Translation&amp;gt;([^&amp;lt;]+(&amp;lt;br&amp;gt;)*)*)&amp;lt;/div&amp;gt;.*&lt;/font&gt;&amp;quot;&lt;br /&gt;    pattern   = re.compile (expr)&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; l &lt;font color="#a52a2a"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt; lines:&lt;br /&gt;        m = pattern.match (l)&lt;br /&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; m:&lt;br /&gt;            res = m.group (&amp;quot;&lt;font color="#ff00ff"&gt;Translation&lt;/font&gt;&amp;quot;)&lt;br /&gt;            res = res.replace (&amp;quot;&lt;font color="#ff00ff"&gt;&amp;amp;lt;&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#ff00ff"&gt;&amp;lt;&lt;/font&gt;&amp;quot;)&lt;br /&gt;            res = res.replace (&amp;quot;&lt;font color="#ff00ff"&gt;&amp;amp;gt;&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#ff00ff"&gt;&amp;gt;&lt;/font&gt;&amp;quot;)&lt;br /&gt;            res = re.sub (&amp;quot;&lt;font color="#ff00ff"&gt;([ ]*&amp;lt;br&amp;gt;[ ]*)&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&amp;quot;,res)&lt;br /&gt;            &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; res&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; None&lt;br /&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/font&gt; &lt;font color="#008b8b"&gt;getTranslation&lt;/font&gt; (fromLang, toLang, text):&lt;br /&gt;    &lt;font color="#a020f0"&gt;import&lt;/font&gt; urllib&lt;br /&gt;    &lt;font color="#a020f0"&gt;import&lt;/font&gt; urllib2&lt;br /&gt;    langpair=fromLang+&amp;quot;&lt;font color="#ff00ff"&gt;|&lt;/font&gt;&amp;quot;+toLang&lt;br /&gt;    url = &amp;quot;&lt;font color="#ff00ff"&gt;&lt;a href="http://translate.google.com/translate_t?langpair="&gt;http://translate.google.com/translate_t?langpair=&lt;/a&gt;&lt;/font&gt;&amp;quot;+langpair&lt;br /&gt;    values = {'&lt;font color="#ff00ff"&gt;hl&lt;/font&gt;':&amp;quot;&lt;font color="#ff00ff"&gt;es&lt;/font&gt;&amp;quot;,'&lt;font color="#ff00ff"&gt;ie&lt;/font&gt;':&amp;quot;&lt;font color="#ff00ff"&gt;UTF-8&lt;/font&gt;&amp;quot;,'&lt;font color="#ff00ff"&gt;text&lt;/font&gt;':text,&amp;quot;&lt;font color="#ff00ff"&gt;langpair&lt;/font&gt;&amp;quot;:langpair}&lt;br /&gt;    &lt;font color="#0000ff"&gt;# Falla si se deja el agent por default en urllib2&lt;/font&gt;&lt;br /&gt;    headers = { '&lt;font color="#ff00ff"&gt;User-Agent&lt;/font&gt;' : '&lt;font color="#ff00ff"&gt;Mozilla&lt;/font&gt;'}&lt;br /&gt;    data = urllib.urlencode(values)&lt;br /&gt;    req = urllib2.Request(url, data,headers)&lt;br /&gt;    response = urllib2.urlopen(req)&lt;br /&gt;    lines = response.readlines ()&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; extractTranslation (lines)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; __name__ == &amp;quot;&lt;font color="#ff00ff"&gt;__main__&lt;/font&gt;&amp;quot;:&lt;br /&gt;    &lt;font color="#0000ff"&gt;# un ejemplo&lt;/font&gt;&lt;br /&gt;    lines = getTranslation (&amp;quot;&lt;font color="#ff00ff"&gt;es&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#ff00ff"&gt;en&lt;/font&gt;&amp;quot;,&amp;quot;&lt;font color="#ff00ff"&gt;El perro es blanco&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;Azul&lt;/font&gt;&lt;font color="#6a5acd"&gt;\n\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;verde&lt;/font&gt;&amp;quot;)&lt;br /&gt;    &lt;font color="#a52a2a"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; lines:&lt;br /&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt; &amp;quot;&lt;font color="#ff00ff"&gt;RESULTADO&lt;/font&gt;&amp;quot;&lt;br /&gt;        &lt;font color="#a52a2a"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt; lines&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt; 1 &lt;/font&gt;---INICIO---&lt;br /&gt;&lt;font color="#a52a2a"&gt; 2 &lt;/font&gt;---google_post.b64---&lt;br /&gt;&lt;font color="#a52a2a"&gt; 3 &lt;/font&gt;---para desempaquetarlo---&lt;br /&gt;&lt;font color="#a52a2a"&gt; 4 &lt;/font&gt;---openssl base64 -d -in google_post.b64 -out google_post.py---&lt;br /&gt;&lt;font color="#a52a2a"&gt; 5 &lt;/font&gt;IyEvdXNyL2Jpbi9weXRob24KI2F1dG9yOiBqb25hdGFuIGFuYXVhdGkKI2VtYWls&lt;br /&gt;&lt;font color="#a52a2a"&gt; 6 &lt;/font&gt;OiBiYXJha2F3aW5zQGdtYWlsLmNvbQojbGljZW5jaWE6IExHUEwKZGVmIGV4dHJh&lt;br /&gt;&lt;font color="#a52a2a"&gt; 7 &lt;/font&gt;Y3RUcmFuc2xhdGlvbiAobGluZXMpOgogICAgaW1wb3J0IHJlCiAgICBleHByID0g&lt;br /&gt;&lt;font color="#a52a2a"&gt; 8 &lt;/font&gt;Ii4qPGRpdiBpZD1yZXN1bHRfYm94IGRpcj1cImx0clwiPig/UDxUcmFuc2xhdGlv&lt;br /&gt;&lt;font color="#a52a2a"&gt; 9 &lt;/font&gt;bj4oW148XSsoPGJyPikqKSopPC9kaXY+LioiCiAgICBwYXR0ZXJuICAgPSByZS5j&lt;br /&gt;&lt;font color="#a52a2a"&gt;10 &lt;/font&gt;b21waWxlIChleHByKQogICAgZm9yIGwgaW4gbGluZXM6CiAgICAgICAgbSA9IHBh&lt;br /&gt;&lt;font color="#a52a2a"&gt;11 &lt;/font&gt;dHRlcm4ubWF0Y2ggKGwpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcmVzID0g&lt;br /&gt;&lt;font color="#a52a2a"&gt;12 &lt;/font&gt;bS5ncm91cCAoIlRyYW5zbGF0aW9uIikKICAgICAgICAgICAgcmVzID0gcmVzLnJl&lt;br /&gt;&lt;font color="#a52a2a"&gt;13 &lt;/font&gt;cGxhY2UgKCImbHQ7IiwiPCIpCiAgICAgICAgICAgIHJlcyA9IHJlcy5yZXBsYWNl&lt;br /&gt;&lt;font color="#a52a2a"&gt;14 &lt;/font&gt;ICgiJmd0OyIsIj4iKQogICAgICAgICAgICByZXMgPSByZS5zdWIgKCIoWyBdKjxi&lt;br /&gt;&lt;font color="#a52a2a"&gt;15 &lt;/font&gt;cj5bIF0qKSIsIlxuIixyZXMpCiAgICAgICAgICAgIHJldHVybiByZXMKICAgIHJl&lt;br /&gt;&lt;font color="#a52a2a"&gt;16 &lt;/font&gt;dHVybiBOb25lCgpkZWYgZ2V0VHJhbnNsYXRpb24gKGZyb21MYW5nLCB0b0xhbmcs&lt;br /&gt;&lt;font color="#a52a2a"&gt;17 &lt;/font&gt;IHRleHQpOgogICAgaW1wb3J0IHVybGxpYgogICAgaW1wb3J0IHVybGxpYjIgIAog&lt;br /&gt;&lt;font color="#a52a2a"&gt;18 &lt;/font&gt;ICAgbGFuZ3BhaXI9ZnJvbUxhbmcrInwiK3RvTGFuZwogICAgdXJsID0gImh0dHA6&lt;br /&gt;&lt;font color="#a52a2a"&gt;19 &lt;/font&gt;Ly90cmFuc2xhdGUuZ29vZ2xlLmNvbS90cmFuc2xhdGVfdD9sYW5ncGFpcj0iK2xh&lt;br /&gt;&lt;font color="#a52a2a"&gt;20 &lt;/font&gt;bmdwYWlyCiAgICB2YWx1ZXMgPSB7J2hsJzoiZXMiLCdpZSc6IlVURi04IiwndGV4&lt;br /&gt;&lt;font color="#a52a2a"&gt;21 &lt;/font&gt;dCc6dGV4dCwibGFuZ3BhaXIiOmxhbmdwYWlyfQogICAgIyBGYWxsYSBzaSBzZSBk&lt;br /&gt;&lt;font color="#a52a2a"&gt;22 &lt;/font&gt;ZWphIGVsIGFnZW50IHBvciBkZWZhdWx0IGVuIHVybGxpYjIKICAgIGhlYWRlcnMg&lt;br /&gt;&lt;font color="#a52a2a"&gt;23 &lt;/font&gt;PSB7ICdVc2VyLUFnZW50JyA6ICdNb3ppbGxhJ30KICAgIGRhdGEgPSB1cmxsaWIu&lt;br /&gt;&lt;font color="#a52a2a"&gt;24 &lt;/font&gt;dXJsZW5jb2RlKHZhbHVlcykKICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmws&lt;br /&gt;&lt;font color="#a52a2a"&gt;25 &lt;/font&gt;IGRhdGEsaGVhZGVycykKICAgIHJlc3BvbnNlID0gdXJsbGliMi51cmxvcGVuKHJl&lt;br /&gt;&lt;font color="#a52a2a"&gt;26 &lt;/font&gt;cSkKICAgIGxpbmVzID0gcmVzcG9uc2UucmVhZGxpbmVzICgpCiAgICByZXR1cm4g&lt;br /&gt;&lt;font color="#a52a2a"&gt;27 &lt;/font&gt;ZXh0cmFjdFRyYW5zbGF0aW9uIChsaW5lcykKCgppZiBfX25hbWVfXyA9PSAiX19t&lt;br /&gt;&lt;font color="#a52a2a"&gt;28 &lt;/font&gt;YWluX18iOgogICAgIyB1biBlamVtcGxvCiAgICBsaW5lcyA9IGdldFRyYW5zbGF0&lt;br /&gt;&lt;font color="#a52a2a"&gt;29 &lt;/font&gt;aW9uICgiZXMiLCJlbiIsIkVsIHBlcnJvIGVzIGJsYW5jb1xuQXp1bFxuXG52ZXJk&lt;br /&gt;&lt;font color="#a52a2a"&gt;30 &lt;/font&gt;ZSIpCiAgICBpZiBsaW5lczoKICAgICAgICBwcmludCAiUkVTVUxUQURPIgogICAg&lt;br /&gt;&lt;font color="#a52a2a"&gt;31 &lt;/font&gt;ICAgIHByaW50IGxpbmVzCg==&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;--- FIN ---&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7426898488372542781-7532540021936823175?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/7532540021936823175/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=7532540021936823175&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/7532540021936823175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/7532540021936823175'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/04/webservices-rusticos-aprobechando.html' title='Webservice Rústicos: aprobechando servicios POST en internet'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_zWTIVoEiRH8/R_j8qFV5MOI/AAAAAAAAAAQ/HWXlVvR4jVs/s72-c/traduccion.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7426898488372542781.post-6756942837856385881</id><published>2008-03-21T07:01:00.000-07:00</published><updated>2008-07-09T11:09:20.677-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='iptables'/><category scheme='http://www.blogger.com/atom/ns#' term='bandwidth'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Limitando el bandwidth por host, red y usuario con Linux:</title><content type='html'>&lt;span style=";font-family:arial;font-size:100%;"  &gt;En este articulo muestro dos scripts bastante simples que armé para poder limitar el bandwidth en terminales corriendo linux, o en una red (no digo gnu porque a linus no le gusta).&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;La idea es que sean simples, pero a la vez ayuden a las tareas de testing de aplicaciones y porque no administracion de la red. No me concidero un scripter, porque para decir la verdad evito bastante esta tarea, pero de en vuando hay que hacer alguno.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;NOTA: en esta entrada no me voy a poner a explicar como funcionan tc (con qdisc, class,...) y iptables, pero en la documentación que doy como referencia están muy bien explicados; además para que funcione todo hay que tener un nucleo compilado con soporte QoS (y sus chucherias), tampoco es la idea ponerme a explicar como hacer esto, y también está explicado en la documentacion que pongo como referencia.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;DESCRIPCION:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Bueno, este es un problema que surgio en el trabajo, necesitamos testear el sistema que vende la empresa donde trabajo, y entonces un de los puntos importantes es el ancho de banda necesario.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Cada instancia cliente del sistema (un ERP) se conecta por red a un server de base de datos (lo normal es mysql), generando así una bola de trafico de ida y vuelta. El sistema puede correr en windows, linux y mac con versiones nativas.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Llendo al punto, surgió el problema de como limitar el bandwidth en el servidor y cliente para poder hacer los testeos. Luego de googlear unas horas y pasar por varios howtos, llegué a esto: [1]&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;En síntesis lo que necesitaba era "Poder limitar el ancho de banda de envio y recepcion entre cliente - servidor", así que llegué a tres ideas posibles:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;1) Aplicar limitaciones por segmento de red.&lt;br /&gt;2) Aplicar limitaciones entre dos host (cliente y servidor).&lt;br /&gt;3) Aplicar limitacions por servicio (servidor de bases de datos / instancia cliente).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Bueno, al cabo de pelear tres o cuatro horas logré mis objetivos, y claro traian dos scripts atados con ellos.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;ANCHO DE BANDA POR HOST O POR RED&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Para los puntos (1) y (2), pude resolverlos con el siguiente script, el cual tiene la idea de poder limitar anchos de banda por red destino o por host destino:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="color: rgb(51, 204, 0);"&gt;---- lbnetng.sh ---&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# encoding utf8&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# Autor: Jonatan Anauati&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# email: barakawins@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# USO # ./lbnet ruleId UNIQUEID [[host IP] |[net IP/MASK]] [rate MAXRATE] [unit UNIT] [if INTERFACE] | [clear INTERFACE] | [show_conf INTERFACE]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;# Limita el ancho de banda de subida hacia una red o host&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;# - ruleId: [OBLIGATORIO] Identificador de regla, debe ser un entero unico por&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#     red (1,2,3,4...).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - net es la ip a la cual se le aplicara la reduccion en el ancho de banda de&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#   respuesta desde el servidor (ej: 192.168.0.23) , default: todas las redes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - ip es la ip de host a la que se desea aplicar la reduccion.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - rate: es el rate en kbit/s por defecto (OJO que no son kbits), a 256 por&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#     default.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - if: elige una interfaz de red (por defecto eth0:1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - unit decide la unidad de trabajo (kbit, kbps,... ver man tc) por defecto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#   esta en kbit por segundo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - clear: limpia todas las reglas para la interfac INTERFAZ.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - show_conf: muestra la configuracion para la interfaz INTERFAZ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;TC='tc'&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;DEV='eth0'&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;RULEID=''&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;MAXRATE='256'&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;UNIT='kbit'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;CLEARFLAG="FALSE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;DSTIP='0/0'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;final_config=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;CLEARFLAG="FALSE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;SHOWCONFFLAG="FALSE"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_conf_builder  ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    if [[ -z $final_config ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        final_config="Configuracion aplicada:"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        final_config="$final_config $1=$2"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_custom_conf ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo $final_config&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_conf ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;  echo "Qdiscs"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC -s -d qdisc show dev $DEV&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "Clases"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC -s -d class show dev $DEV&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "Filters"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC filter show dev $DEV&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function set_standard_args ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    case $1 in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "rate")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            MAXRATE=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "if")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2 ;;     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "unit")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            UNIT=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "clear")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            CLEARFLAG="TRUE" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "show_conf")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            SHOWCONFFLAG="TRUE" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        esac&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function cleanup_rules ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC qdisc del dev $DEV root 2&gt; /dev/null &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function set_custom_args ( )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    case $1 in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;              "host")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DSTIP=$2/32 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "net")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DSTIP=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "ruleId")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            RULEID=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    esac&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_used_ids ( )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    idlist=$(tc class show dev eth0  | sed -n 's/^class [^ ]\+ 1:\([0-9]\+\).\+$/\1/gp')&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo $idlist&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;case $1 in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;      "help")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo "Limita el trafico de subida hacia la red o host."&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo "MODO DE USO: $0 [net net/maskbits | host address] [rate maxRate] [unit bandwidthUnit] [if interface] | [clear INTERFACE]"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    "show_conf")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        show_conf&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        exit ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;esac&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;i=0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;list[0]=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;list[1]=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;for param in $@ ; do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    list[$i]=$param&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    let i+=1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    if [[ $i -eq 2 ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        set_standard_args ${list[0]} ${list[1]}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        set_custom_args ${list[0]} ${list[1]}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        show_conf_builder ${list[0]} ${list[1]}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        let i=0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;if [[ $CLEARFLAG == "TRUE" ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    cleanup_rules&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;elif [[ $SHOWCONFFLAG == "TRUE" ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    show_conf&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;USERID=$(cat /etc/passwd | grep $USERNAME | sed -n 's/\([^:]\+:\)\{2\}\([^:]\+\)\(:.\+$\)/\2/gp')&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;if [[ -z $USERID ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "El usuario $USERNAME parece no existir"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;if [[ -z $RULEID ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "Debe especificar el ruleId (no sea cobarde, y de cualquiera que no"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "halla puesto aun. Puede ser cualquier EXCEPTO los siguientes:"&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;  &lt;br /&gt;  show_used_ids&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;$TC qdisc add dev $DEV root handle 1: htb default 60 2&gt; /dev/null &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;$TC class add dev $DEV parent 1: classid 1:${RULEID} htb rate ${MAXRATE}${UNIT} ceil ${MAXRATE}${UNIT}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;$TC filter add dev $DEV protocol ip parent 1: prio 1 u32 match ip dst ${DSTIP} flowid 1:1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;$TC filter add dev $DEV protocol ip parent 1: handle 99 fw classid 1:1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;show_custom_conf&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);font-family:courier new;font-size:100%;"  &gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#vim:sw=4:sts=4:et:syntax=sh:nowrap:nu:filetype=sh&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;--- fin de lbnetng.sh ---&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Ejemplos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbnetng.sh host 192.168.1.32 rate 128 if eth0 ruleId 1&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Configuracion aplicada: host=192.168.1.32 rate=128 if=eth0 ruleId=1&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;limita el trafico hacia 192.168.1.32 a un maximo de 128kbit/s (OJO que son kbit por segundo) sobre la interfaz eth0. El parametro ruleId debe ser único, es decir hay que cambiarlo con cada llamada consecutiva a lbnetng.sh (si reinicias la configuracion puede volver a empezar).&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbnetng.sh host 192.168.1.32 rate 128 unit kbps if eth0 ruleId 2&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Configuracion aplicada: host=192.168.1.32 rate=128 unit=kbps if=eth0 ruleId=2&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;limita el trafico hacia 192.168.1.32 a un maximo de 128kbps (OJO que son kbytes&lt;br /&gt;por segundo) sobre la interfaz eth0.&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbnetng.sh net 192.168.1.0/24 rate 1 unit mbit if eth0 ruleId 3&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Configuracion aplicada: net=192.168.1.0/24 rate=1 unit=mbit if=eth0 ruleId=3&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;limita el trafico hacia la red 192.168.1.0 a un maximo de 1 mbit (1 mega bit /s)&lt;br /&gt;sobre la interfaz eth0.&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Para ver la configucion actual:&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbnetng.sh show_conf eth0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Qdiscs&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;qdisc htb 1: r2q 10 default 60 direct_packets_stat 0 ver 3.17&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Clases&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;class htb 1:1 root prio 0 quantum 1600 rate 128000bit ceil 128000bit burst 1663b/8&lt;br /&gt;mpu 0b overhead 0b cburst 1663b/8 mpu 0b overhead 0b level 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;lended: 0 borrowed: 0 giants: 0 &lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; tokens: 106496 ctokens: 106496&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;class htb 1:2 root prio 0 quantum 12800 rate 1024Kbit ceil 1024Kbit burst 2111b/8&lt;br /&gt;mpu 0b overhead 0b cburst 2111b/8 mpu 0b overhead 0b level 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;lended: 0 borrowed: 0 giants: 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;tokens: 16896 ctokens: 16896&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;class htb 1:3 root prio 0 quantum 12500 rate 1000Kbit ceil 1000Kbit burst 2099b/8&lt;br /&gt;mpu 0b overhead 0b cburst 2099b/8 mpu 0b overhead 0b level 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; lended: 0 borrowed: 0 giants: 0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; tokens: 17203 ctokens: 17203&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Filters&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 1 u32&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 1 u32 fh 800: ht divisor 1&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;... (continua)&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;font-size:100%;"  &gt;Para limpiar la configuracion:&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbnetng.sh clear eth0&lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;ANCHO DE BANDA POR PROCESO O USUARIO:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para resolver el puto (3), tambien genere este script:&lt;br /&gt;&lt;br /&gt;--- lbnetng.sh ---&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# encoding utf8&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# Autor: Jonatan Anauati&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# email: barakawins@gmail.com&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# USO # ./lbuser [[user USERNAME] [rate RATE] [unit UNIT] [if INTERFACE] |  [show_conf INTERFACE] | [help] | [clear INTERFACE] | [full_clear INTERFACE]]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# Limita el ancho de banda de subida de un usuario en el sistema&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - user: es el usuario para el cual quiere limitarse el bandwidth de envio&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#   por default actua solo sobre el usuario actual.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - rate es el rate en kbit/s por defecto (OJO que no son kbits), a 256 por&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#   default.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - if: elige una interfaz de red (por defecto eth0:1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - unit decide la unidad de trabajo (kbit, kbps,... ver man tc) por defecto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#   esta en kbit por segundo.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - clear: limpia todas las reglas para la interfaz INTERFAZ.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - full_clear: limpia todas las reglas para la interfaz INTERFAZ, y ademas&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#   limpia todoas las reglas de la tabla mangle de iptables.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;# - show_conf: muestra la configuracion para la interfaz INTERFAZ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#NOTA: falta probar la efectividad del script, si bien pareceriera que tiene que&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#      funcionar con solo ver la configuracion aplicada, todabia no esta probado&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#      que el marcado de iptables y las reglas se apliquen correctamente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;USERNAME="$LOGNAME"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;TC=tc&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;DEV="eth0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;MAXRATE=256&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;UNIT="kbit"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;CLEARFLAG="FALSE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;SHOWCONFFLAG="FALSE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;CLEAR_IPTABLES_MANGLE_T="FALSE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;final_config=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_conf_builder ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;  if [[ -z $final_config ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    final_config="Configuracion aplicada:"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;  fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    final_config="$final_config $1=$2"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_custom_conf ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo $final_config&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function show_conf ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "Qdiscs"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC -s -d qdisc show dev $DEV&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "Clases"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC -s -d class show dev $DEV&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "Filters"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC filter show dev $DEV&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function set_standard_args ( )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    case $1 in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "rate")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            MAXRATE=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "if")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2 ;;     &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "unit")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            UNIT=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "clear")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            CLEARFLAG="TRUE" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "show_conf")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            SHOWCONFFLAG="TRUE" ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    esac&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function cleanup_rules ()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC qdisc del dev $DEV root 2&gt; /dev/null &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;function set_custom_args ( )&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    case $1 in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "user")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            USERNAME=$2 ;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        "full_clear")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            DEV=$2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            CLEARFLAG="TRUE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;            CLEAR_IPTABLES_MANGLE_T="TRUE"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    esac&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;case $1 in&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    "help")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo "Limita el trafico de subida de todos los procesos de un usuario."&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo "MODO DE USO: $0 [user userPattern] [rate maxRate] [unit     bandwidthUnit] [if interface]"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        echo&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        exit  ;;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;esac&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;i=0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;list[0]=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;list[1]=""&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;for param in $@ ; do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    list[$i]=$param&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    let i+=1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    if [[ $i -eq 2 ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        set_standard_args ${list[0]} ${list[1]}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        set_custom_args ${list[0]} ${list[1]}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        show_conf_builder ${list[0]} ${list[1]}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        let i=0&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;if [[ $CLEARFLAG == "TRUE" ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    cleanup_rules&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    if [[ $CLEAR_IPTABLES_MANGLE_T == "TRUE" ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;        iptables -t mangle -F&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;USERID=$(cat /etc/passwd | grep $USERNAME | sed -n 's/\([^:]\+:\)\{2\}\([^:]\+\)\(:.\+$\)/\2/gp')&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;if [[ -z $USERID ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "El usuario $USERNAME parece no existir"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    exit&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;iptables -t mangle -A OUTPUT --out-interface $DEV --match owner --uid-owner $USERID -j MARK --set-mark $USERID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#$TC qdisc del dev $DEV root 2&gt;&amp;amp;1 &gt;/dev/null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;$TC qdisc add dev $DEV root handle 1: htb default 60 2&gt; /dev/null &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;$TC class add dev $DEV parent 1: classid 1:$USERID htb rate ${MAXRATE}${UNIT} ceil ${MAXRATE}${UNIT}  2&gt; /dev/null &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;if [[ $? == 0 ]] ; then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    $TC filter add dev $DEV protocol ip parent 1: handle $USERID fw classid    1:$USERID&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;  show_custom_conf&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "El seteo no pudo realizarze, tal vez sea que el usuario ya fue"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;    echo "configurado por este script."&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;#vim:sw=4:sts=4:et:syntax=sh:nowrap:nu:filetype=sh&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;--- fin de lbnetng.sh ---&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;En este caso quería que la limitacion sea por servicio (solo el servidor de bases de datos) ya que las pruebas son realizadas contra un servidor de produccion y no  quería meter la pata dejando a todos sin svn ! jaja.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Vi dos opciones posibles (ambas necesitan la intervencion de iptables en la cocina):&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;1) Limitar por pid del proceso.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;2) Limitar por el usuario que corre el servicio.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Por el hecho de que el servidor de base de datos creo que puede levantar mas procesos a conveniencia cuando el quiere (SUPONGO) y entonces tendría que ir casi adivinando la pid (en realidad sería hacer la conexion primero, luego mirar con&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;netstat -puta, identificar la pid que se enlaza a la ip de máquina que corre la instancia cliente) lo cual es un poco molesto cuando se hace mas de dos veces, me quedé con la opcion (2): Limitar el ancho de banda por usuario.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Hay que aclarar que si bien esta es la eleccion, es muy sencillo hacer que haga la limitacion solo por la pid (esto es la parte encargada a iptables).&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Para empezar el server tiene un so ubuntu 7.10, y el mysql de serie que trae es configurado para correr con el user mysql, entonces no me quedaba mas que limitar el bandwidth para este usuario en el servidor, e ir luego a mi maquina y limitar el bandwidth a mi usuario con el que corro la instancia del sistema (olvidé decir que mi desktop es un ubuntu 7.10 también).&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;font-size:100%;"  &gt;Ejemplos:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify; font-style: italic;"&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;NOTA: una forma sencilla de ver con que usuario corre tu proceso puede ser:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;jaa@dino-thunder:~$ ps aux | head -n1 &amp;amp;&amp;amp; ps aux | grep mysqld&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;root      5033  0.0  0.0   1712   444 ?        S    10:07   0:00 /bin/sh /usr/bin/mysqld_safe&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;mysql     5077  0.0  1.0 134036  4512 ?        Sl   10:07   0:03 /usr/sbin/mysqld ... (coooontinua)&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;root      5079  0.0  0.1   1640   456 ?        S    10:07   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;jaa       8877  0.0  0.1   2896   764 pts/1    R+   16:45   0:00 grep mysql&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-style: italic;font-family:courier new;font-size:100%;"  &gt;Como se para /usr/sbin/mysqld el usuario (primer columna) es mysql.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbuserng.sh user mysql rate 512 unit kbit if eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Configuracion aplicada: user=mysql rate=512 unit=kbit if=eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Si tenés tu mysql server corriendo a nombre del user mysql entonces el ancho de  banda de salida del usuario y por lo tanto del servidor va a ser de 512 kbit/s.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbuserng.sh user jaa rate 10 unit mbit if eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Configuracion aplicada: user=jaa rate=10 unit=mbit if=eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;limita todo el trafico saliente que genere el user jaa por la interfaz eth0 a una tasa de &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;256 kbit/s.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Por ejemplo si se quiere limitar el bandwidth para apache:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;br /&gt;root@dino-thunder:/home/jaa# ps aux | grep apache2&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;...&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;www-data  5530  0.0  0.0   9664   380 ?        S    10:08   0:00 /usr/sbin/apache2 -k start&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;www-data  5531  0.0  0.1 231232   584 ?        Sl   10:08   0:00 /usr/sbin/apache2 -k start&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;es muy sencillo notar que corre con www-data:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbuserng.sh user www-data rate 256 unit kbit if eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Configuracion aplicada: user=www-data rate=256 unit=kbit if=eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;font-size:100%;"  &gt;Ver la configuracion:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;root@dino-thunder:/home/jaa# ./lbuserng.sh show_conf eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Qdiscs&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;qdisc htb 1: r2q 10 default 60 direct_packets_stat 0 ver 3.17&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Clases&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;class htb 1:33 root prio 0 quantum 3200 rate 256000bit ceil 256000bit burst&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;1727b/8 mpu 0b overhead 0b cburst 1727b/8 mpu 0b overhead 0b level 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;lended: 0 borrowed: 0 giants: 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;tokens: 55296 ctokens: 55296&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;class htb 1:1000 root prio 0 quantum 125000 rate 10000Kbit ceil 10000Kbit burst&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;6598b/8 mpu 0b overhead 0b cburst 6598b/8 mpu 0b overhead 0b level 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;lended: 0 borrowed: 0 giants: 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;tokens: 5406 ctokens: 5406&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;class htb 1:111 root prio 0 quantum 6400 rate 512000bit ceil 512000bit burst&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;1855b/8 mpu 0b overhead 0b cburst 1855b/8 mpu 0b overhead 0b level 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;rate 0bit 0pps backlog 0b 0p requeues 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; lended: 0 borrowed: 0 giants: 0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;tokens: 29696 ctokens: 29696&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Filters&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 49151 fw&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 49151 fw handle 0x21 classid 1:33&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 49151 fw&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 49151 fw handle 0x3e8 classid 1:1000&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 49152 fw&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;filter parent 1: protocol ip pref 49152 fw handle 0x6f classid 1:111&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Limpiar la configuracion:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;./lbuserng.sh clear eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;Pero esta última pimpia las configuraciones aplicadas con tc. Y para este script también aplicamos reglas con iptables.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;Si queremos que limpie las reglas de iptables:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;./lbuserng.sh full_clear eth0&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;pero OJO porque elimina todas las reglas de la tabla mangle, entonces esto afecta de dos formas&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;1) si habias agregados limites para usuarios en otras interfaces entonces ya no se aplicaran porque iptables no hara la parte que le toca (entonces tendras que hacer  clear sobre cada interfaz y volver a empezar)&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;2) Si tenias reglas ya aplicadas en tu tabla mangle de iptables para otros objetivos entonces se esta quemando el culo, tendras que volver a aplicarlas nuevamente ! (si ya se que es un garron, pero controlar todo esto ya demanda mucho mas trabajo y la idea es que este sea un trabajo simple para testing, y a lo sumo setear reglas al arranque del sistema).&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;font-size:100%;"  &gt;NOTAS:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;No intentes probar estos scripts unicamente con conexiones a localhost, porque por&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; algun motivo no he logrado que funcionen, lo que si aseguron que funcionaron&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; fantasticamente en conexiones en red. Para realizar todas mis pruebas iniciales lo&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; que hice fue levantar un apache en un server, que comparta un achivo por http, y&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;desde mi firefox hacia descargas, prueba que para mi resulto perfecta, luego pase a&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt; las pruebas con el sistema que antes comente y resultaron bastante acorde con las&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;  limitaciones.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Scripts:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;[1]: lbnetng.sh (encodeado con base64):&lt;/span&gt;&lt;br /&gt;--- lbnetng.b64 ---&lt;br /&gt;--- Para obtener el script ejecutar: ---&lt;br /&gt;--- "openssl base64 -d -in lbnetng.b64 -out lbnetng.sh" ---&lt;br /&gt;IyEvYmluL2Jhc2gKIyBlbmNvZGluZyB1dGY4CiMgQXV0b3I6IEpvbmF0YW4gQW5h&lt;br /&gt;dWF0aQojIGVtYWlsOiBiYXJha2F3aW5zQGdtYWlsLmNvbQoKIyBVU08gIyAuL2xi&lt;br /&gt;bmV0IHJ1bGVJZCBVTklRVUVJRCBbW2hvc3QgSVBdIHxbbmV0IElQL01BU0tdXSBb&lt;br /&gt;cmF0ZSBNQVhSQVRFXSBbdW5pdCBVTklUXSBbaWYgSU5URVJGQUNFXSB8IFtjbGVh&lt;br /&gt;ciBJTlRFUkZBQ0VdIHwgW3Nob3dfY29uZiBJTlRFUkZBQ0VdCiMgTGltaXRhIGVs&lt;br /&gt;IGFuY2hvIGRlIGJhbmRhIGRlIHN1YmlkYSBoYWNpYSB1bmEgcmVkIG8gaG9zdAoj&lt;br /&gt;IC0gcnVsZUlkOiBbT0JMSUdBVE9SSU9dIElkZW50aWZpY2Fkb3IgZGUgcmVnbGEs&lt;br /&gt;IGRlYmUgc2VyIHVuIGVudGVybyB1bmljbyBwb3IKIyAgIHJlZCAoMSwyLDMsNC4u&lt;br /&gt;LikuCiMgLSBuZXQgZXMgbGEgaXAgYSBsYSBjdWFsIHNlIGxlIGFwbGljYXJhIGxh&lt;br /&gt;IHJlZHVjY2lvbiBlbiBlbCBhbmNobyBkZSBiYW5kYSBkZQojICAgcmVzcHVlc3Rh&lt;br /&gt;IGRlc2RlIGVsIHNlcnZpZG9yIChlajogMTkyLjE2OC4wLjIzKSAsIGRlZmF1bHQ6&lt;br /&gt;IHRvZGFzIGxhcyByZWRlcy4KIyAtIGlwIGVzIGxhIGlwIGRlIGhvc3QgYSBsYSBx&lt;br /&gt;dWUgc2UgZGVzZWEgYXBsaWNhciBsYSByZWR1Y2Npb24uCiMgLSByYXRlOiBlcyBl&lt;br /&gt;bCByYXRlIGVuIGtiaXQvcyBwb3IgZGVmZWN0byAoT0pPIHF1ZSBubyBzb24ga2Jp&lt;br /&gt;dHMpLCBhIDI1NiBwb3IgCiMgICBkZWZhdWx0LgojIC0gaWY6IGVsaWdlIHVuYSBp&lt;br /&gt;bnRlcmZheiBkZSByZWQgKHBvciBkZWZlY3RvIGV0aDA6MSkKIyAtIHVuaXQgZGVj&lt;br /&gt;aWRlIGxhIHVuaWRhZCBkZSB0cmFiYWpvIChrYml0LCBrYnBzLC4uLiB2ZXIgbWFu&lt;br /&gt;IHRjKSBwb3IgZGVmZWN0bwojICAgZXN0YSBlbiBrYml0IHBvciBzZWd1bmRvCiMg&lt;br /&gt;LSBjbGVhcjogbGltcGlhIHRvZGFzIGxhcyByZWdsYXMgcGFyYSBsYSBpbnRlcmZh&lt;br /&gt;YyBJTlRFUkZBWi4KIyAtIHNob3dfY29uZjogbXVlc3RyYSBsYSBjb25maWd1cmFj&lt;br /&gt;aW9uIHBhcmEgbGEgaW50ZXJmYXogSU5URVJGQVoKCgpUQz0ndGMnCkRFVj0nZXRo&lt;br /&gt;MCcKUlVMRUlEPScnCk1BWFJBVEU9JzI1NicKVU5JVD0na2JpdCcKQ0xFQVJGTEFH&lt;br /&gt;PSJGQUxTRSIKRFNUSVA9JzAvMCcKZmluYWxfY29uZmlnPScnCkNMRUFSRkxBRz0i&lt;br /&gt;RkFMU0UiClNIT1dDT05GRkxBRz0iRkFMU0UiCgpmdW5jdGlvbiBzaG93X2NvbmZf&lt;br /&gt;YnVpbGRlciAgKCkKewogICAgaWYgW1sgLXogJGZpbmFsX2NvbmZpZyBdXSA7IHRo&lt;br /&gt;ZW4KICAgICAgICBmaW5hbF9jb25maWc9IkNvbmZpZ3VyYWNpb24gYXBsaWNhZGE6&lt;br /&gt;IiAKICAgIGZpIAogICAgZmluYWxfY29uZmlnPSIkZmluYWxfY29uZmlnICQxPSQy&lt;br /&gt;Igp9CgpmdW5jdGlvbiBzaG93X2N1c3RvbV9jb25mICgpCnsKICAgIGVjaG8gJGZp&lt;br /&gt;bmFsX2NvbmZpZwp9CgpmdW5jdGlvbiBzaG93X2NvbmYgKCkKewogICAgZWNobyAi&lt;br /&gt;UWRpc2NzIgogICAgJFRDIC1zIC1kIHFkaXNjIHNob3cgZGV2ICRERVYKICAgIGVj&lt;br /&gt;aG8gIkNsYXNlcyIKICAgICRUQyAtcyAtZCBjbGFzcyBzaG93IGRldiAkREVWCiAg&lt;br /&gt;ICBlY2hvICJGaWx0ZXJzIgogICAgJFRDIGZpbHRlciBzaG93IGRldiAkREVWCn0K&lt;br /&gt;CmZ1bmN0aW9uIHNldF9zdGFuZGFyZF9hcmdzICgpIAp7CiAgICBjYXNlICQxIGlu&lt;br /&gt;CiAgICAgICAgInJhdGUiKQogICAgICAgICAgICBNQVhSQVRFPSQyIDs7CiAgICAg&lt;br /&gt;ICAgImlmIikKICAgICAgICAgICAgREVWPSQyIDs7ICAgICAgICAKICAgICAgICAi&lt;br /&gt;dW5pdCIpCiAgICAgICAgICAgIFVOSVQ9JDIgOzsKICAgICAgICAiY2xlYXIiKQog&lt;br /&gt;ICAgICAgICAgICBERVY9JDIKICAgICAgICAgICAgQ0xFQVJGTEFHPSJUUlVFIiA7&lt;br /&gt;OwogICAgICAgICJzaG93X2NvbmYiKQogICAgICAgICAgICBERVY9JDIKICAgICAg&lt;br /&gt;ICAgICAgU0hPV0NPTkZGTEFHPSJUUlVFIiA7OwogICAgZXNhYwp9CgpmdW5jdGlv&lt;br /&gt;biBjbGVhbnVwX3J1bGVzICgpCnsKICAgICRUQyBxZGlzYyBkZWwgZGV2ICRERVYg&lt;br /&gt;cm9vdCAyPiAvZGV2L251bGwgPiAvZGV2L251bGwKfQoKZnVuY3Rpb24gc2V0X2N1&lt;br /&gt;c3RvbV9hcmdzICggKQp7CiAgICBjYXNlICQxIGluCiAgICAgICAgImhvc3QiKQog&lt;br /&gt;ICAgICAgICAgICBEU1RJUD0kMi8zMiA7OwogICAgICAgICJuZXQiKQogICAgICAg&lt;br /&gt;ICAgICBEU1RJUD0kMiA7OwogICAgICAgICJydWxlSWQiKQogICAgICAgICAgICBS&lt;br /&gt;VUxFSUQ9JDIgOzsKICAgIGVzYWMKfQoKZnVuY3Rpb24gc2hvd191c2VkX2lkcyAo&lt;br /&gt;ICkKewogICAgaWRsaXN0PSQodGMgY2xhc3Mgc2hvdyBkZXYgZXRoMCAgfCBzZWQg&lt;br /&gt;LW4gJ3MvXmNsYXNzIFteIF1cKyAxOlwoWzAtOV1cK1wpLlwrJC9cMS9ncCcpCiAg&lt;br /&gt;ICBlY2hvICRpZGxpc3QKfQoKY2FzZSAkMSBpbgogICAgImhlbHAiKQogICAgICAg&lt;br /&gt;IGVjaG8KICAgICAgICBlY2hvICJMaW1pdGEgZWwgdHJhZmljbyBkZSBzdWJpZGEg&lt;br /&gt;aGFjaWEgbGEgcmVkIG8gaG9zdC4iCiAgICAgICAgZWNobyAiTU9ETyBERSBVU086&lt;br /&gt;ICQwIFtuZXQgbmV0L21hc2tiaXRzIHwgaG9zdCBhZGRyZXNzXSBbcmF0ZSBtYXhS&lt;br /&gt;YXRlXSBbdW5pdCBiYW5kd2lkdGhVbml0XSBbaWYgaW50ZXJmYWNlXSB8IFtjbGVh&lt;br /&gt;ciBJTlRFUkZBQ0VdIgogICAgICAgIGVjaG8gCiAgICAgICAgZXhpdCA7OwogICAg&lt;br /&gt;InNob3dfY29uZiIpCiAgICAgICAgc2hvd19jb25mIAogICAgICAgIGV4aXQgOzsK&lt;br /&gt;ZXNhYwoKaT0wCmxpc3RbMF09IiIKbGlzdFsxXT0iIgpmb3IgcGFyYW0gaW4gJEAg&lt;br /&gt;OyBkbwogICAgbGlzdFskaV09JHBhcmFtIAogICAgbGV0IGkrPTEKICAgIGlmIFtb&lt;br /&gt;ICRpIC1lcSAyIF1dIDsgdGhlbgogICAgICAgIHNldF9zdGFuZGFyZF9hcmdzICR7&lt;br /&gt;bGlzdFswXX0gJHtsaXN0WzFdfQogICAgICAgIHNldF9jdXN0b21fYXJncyAke2xp&lt;br /&gt;c3RbMF19ICR7bGlzdFsxXX0KICAgICAgICBzaG93X2NvbmZfYnVpbGRlciAke2xp&lt;br /&gt;c3RbMF19ICR7bGlzdFsxXX0KICAgICAgICBsZXQgaT0wCiAgICBmaQpkb25lCgpp&lt;br /&gt;ZiBbWyAkQ0xFQVJGTEFHID09ICJUUlVFIiBdXSA7IHRoZW4KICAgIGNsZWFudXBf&lt;br /&gt;cnVsZXMKICAgIGV4aXQgCmVsaWYgW1sgJFNIT1dDT05GRkxBRyA9PSAiVFJVRSIg&lt;br /&gt;XV0gOyB0aGVuCiAgICBzaG93X2NvbmYKICAgIGV4aXQgCmZpCgpVU0VSSUQ9JChj&lt;br /&gt;YXQgL2V0Yy9wYXNzd2QgfCBncmVwICRVU0VSTkFNRSB8IHNlZCAtbiAncy9cKFte&lt;br /&gt;Ol1cKzpcKVx7Mlx9XChbXjpdXCtcKVwoOi5cKyRcKS9cMi9ncCcpCmlmIFtbIC16&lt;br /&gt;ICRVU0VSSUQgXV0gOyB0aGVuCiAgICBlY2hvICJFbCB1c3VhcmlvICRVU0VSTkFN&lt;br /&gt;RSBwYXJlY2Ugbm8gZXhpc3RpciIKICAgIGV4aXQKZmkKaWYgW1sgLXogJFJVTEVJ&lt;br /&gt;RCBdXSA7IHRoZW4KICAgIGVjaG8gIkRlYmUgZXNwZWNpZmljYXIgZWwgcnVsZUlk&lt;br /&gt;IChubyBzZWEgY29iYXJkZSwgeSBkZSBjdWFscXVpZXJhIHF1ZSBubyIKICAgIGVj&lt;br /&gt;aG8gImhhbGxhIHB1ZXN0byBhdW4uIFB1ZWRlIHNlciBjdWFscXVpZXIgRVhDRVBU&lt;br /&gt;TyBsb3Mgc2lndWllbnRlczoiCiAgICBzaG93X3VzZWRfaWRzCiAgICBlY2hvIAog&lt;br /&gt;ICAgZXhpdApmaQoKaWYgW1sgJENMRUFSRkxBRyA9PSAiVFJVRSIgXV0gOyB0aGVu&lt;br /&gt;CiAgICBjbGVhbnVwX3J1bGVzCiAgICBleGl0IAplbGlmIFtbICRTSE9XQ09ORkZM&lt;br /&gt;QUcgPT0gIlRSVUUiIF1dIDsgdGhlbgogICAgc2hvd19jb25mCiAgICBleGl0CmZp&lt;br /&gt;CgokVEMgcWRpc2MgYWRkIGRldiAkREVWIHJvb3QgaGFuZGxlIDE6IGh0YiBkZWZh&lt;br /&gt;dWx0IDYwIDI+IC9kZXYvbnVsbCA+IC9kZXYvbnVsbAokVEMgY2xhc3MgYWRkIGRl&lt;br /&gt;diAkREVWIHBhcmVudCAxOiBjbGFzc2lkIDE6JHtSVUxFSUR9IGh0YiByYXRlICR7&lt;br /&gt;TUFYUkFURX0ke1VOSVR9IGNlaWwgJHtNQVhSQVRFfSR7VU5JVH0gCiRUQyBmaWx0&lt;br /&gt;ZXIgYWRkIGRldiAkREVWIHByb3RvY29sIGlwIHBhcmVudCAxOiBwcmlvIDEgdTMy&lt;br /&gt;IG1hdGNoIGlwIGRzdCAke0RTVElQfSBmbG93aWQgMToxCiRUQyBmaWx0ZXIgYWRk&lt;br /&gt;IGRldiAkREVWIHByb3RvY29sIGlwIHBhcmVudCAxOiBoYW5kbGUgOTkgZncgY2xh&lt;br /&gt;c3NpZCAxOjEKCnNob3dfY3VzdG9tX2NvbmYKIyB2aW06c3c9NDpzb2Z0dGFic3Rv&lt;br /&gt;cD00OmV4cGFuZHRhYjpzeW50YXg9c2g6bm93cmFwOm51OmZpbGV0eXBlPXNoCgo=&lt;br /&gt;--- Fin del archivo ---&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;[2]: lbuserng.sh (encodeado con base 64):&lt;/span&gt;&lt;br /&gt;--- lbuserng.b64 ---&lt;br /&gt;--- Para obtener el script ejecutar: ---&lt;br /&gt;--- "openssl base64 -d -in lbuserng.b64 -out lbuserng.sh" ---&lt;br /&gt;IyEvYmluL2Jhc2gKIyBlbmNvZGluZyB1dGY4CiMgQXV0b3I6IEpvbmF0YW4gQW5h&lt;br /&gt;dWF0aQojIGVtYWlsOiBiYXJha2F3aW5zQGdtYWlsLmNvbQojCiMgVVNPICMgLi9s&lt;br /&gt;YnVzZXIgW1t1c2VyIFVTRVJOQU1FXSBbcmF0ZSBSQVRFXSBbdW5pdCBVTklUXSBb&lt;br /&gt;aWYgSU5URVJGQUNFXSB8ICBbc2hvd19jb25mIElOVEVSRkFDRV0gfCBbaGVscF0g&lt;br /&gt;fCBbY2xlYXIgSU5URVJGQUNFXSB8IFtmdWxsX2NsZWFyIElOVEVSRkFDRV1dCiMg&lt;br /&gt;TGltaXRhIGVsIGFuY2hvIGRlIGJhbmRhIGRlIHN1YmlkYSBkZSB1biB1c3Vhcmlv&lt;br /&gt;IGVuIGVsIHNpc3RlbWEKIyAtIHVzZXI6IGVzIGVsIHVzdWFyaW8gcGFyYSBlbCBj&lt;br /&gt;dWFsIHF1aWVyZSBsaW1pdGFyc2UgZWwgYmFuZHdpZHRoIGRlIGVudmlvCiMgICBw&lt;br /&gt;b3IgZGVmYXVsdCBhY3R1YSBzb2xvIHNvYnJlIGVsIHVzdWFyaW8gYWN0dWFsLgoj&lt;br /&gt;IC0gcmF0ZSBlcyBlbCByYXRlIGVuIGtiaXQvcyBwb3IgZGVmZWN0byAoT0pPIHF1&lt;br /&gt;ZSBubyBzb24ga2JpdHMpLCBhIDI1NiBwb3IgCiMgICBkZWZhdWx0LgojIC0gaWY6&lt;br /&gt;IGVsaWdlIHVuYSBpbnRlcmZheiBkZSByZWQgKHBvciBkZWZlY3RvIGV0aDA6MSkK&lt;br /&gt;IyAtIHVuaXQgZGVjaWRlIGxhIHVuaWRhZCBkZSB0cmFiYWpvIChrYml0LCBrYnBz&lt;br /&gt;LC4uLiB2ZXIgbWFuIHRjKSBwb3IgZGVmZWN0bwojICAgZXN0YSBlbiBrYml0IHBv&lt;br /&gt;ciBzZWd1bmRvLgojIC0gY2xlYXI6IGxpbXBpYSB0b2RhcyBsYXMgcmVnbGFzIHBh&lt;br /&gt;cmEgbGEgaW50ZXJmYXogSU5URVJGQVouCiMgLSBmdWxsX2NsZWFyOiBsaW1waWEg&lt;br /&gt;dG9kYXMgbGFzIHJlZ2xhcyBwYXJhIGxhIGludGVyZmF6IElOVEVSRkFaLCB5IGFk&lt;br /&gt;ZW1hcyAKIyAgIGxpbXBpYSB0b2RvYXMgbGFzIHJlZ2xhcyBkZSBsYSB0YWJsYSBt&lt;br /&gt;YW5nbGUgZGUgaXB0YWJsZXMuCiMgLSBzaG93X2NvbmY6IG11ZXN0cmEgbGEgY29u&lt;br /&gt;ZmlndXJhY2lvbiBwYXJhIGxhIGludGVyZmF6IElOVEVSRkFaCgojTk9UQTogZmFs&lt;br /&gt;dGEgcHJvYmFyIGxhIGVmZWN0aXZpZGFkIGRlbCBzY3JpcHQsIHNpIGJpZW4gcGFy&lt;br /&gt;ZWNlcmllcmEgcXVlIHRpZW5lIHF1ZQojICAgICAgZnVuY2lvbmFyIGNvbiBzb2xv&lt;br /&gt;IHZlciBsYSBjb25maWd1cmFjaW9uIGFwbGljYWRhLCB0b2RhYmlhIG5vIGVzdGEg&lt;br /&gt;cHJvYmFkbwojICAgICAgcXVlIGVsIG1hcmNhZG8gZGUgaXB0YWJsZXMgeSBsYXMg&lt;br /&gt;cmVnbGFzIHNlIGFwbGlxdWVuIGNvcnJlY3RhbWVudGUuCgpVU0VSTkFNRT0iJExP&lt;br /&gt;R05BTUUiClRDPXRjIApERVY9ImV0aDAiCk1BWFJBVEU9MjU2ClVOSVQ9ImtiaXQi&lt;br /&gt;CkNMRUFSRkxBRz0iRkFMU0UiClNIT1dDT05GRkxBRz0iRkFMU0UiCkNMRUFSX0lQ&lt;br /&gt;VEFCTEVTX01BTkdMRV9UPSJGQUxTRSIKZmluYWxfY29uZmlnPSIiCmZ1bmN0aW9u&lt;br /&gt;IHNob3dfY29uZl9idWlsZGVyICgpCnsKICAgIGlmIFtbIC16ICRmaW5hbF9jb25m&lt;br /&gt;aWcgXV0gOyB0aGVuCiAgICAgICAgZmluYWxfY29uZmlnPSJDb25maWd1cmFjaW9u&lt;br /&gt;IGFwbGljYWRhOiIgCiAgICBmaSAKICAgIGZpbmFsX2NvbmZpZz0iJGZpbmFsX2Nv&lt;br /&gt;bmZpZyAkMT0kMiIKfQoKZnVuY3Rpb24gc2hvd19jdXN0b21fY29uZiAoKQp7CiAg&lt;br /&gt;ICBlY2hvICRmaW5hbF9jb25maWcKfQoKZnVuY3Rpb24gc2hvd19jb25mICgpCnsK&lt;br /&gt;ICAgIGVjaG8gIlFkaXNjcyIKICAgICRUQyAtcyAtZCBxZGlzYyBzaG93IGRldiAk&lt;br /&gt;REVWCiAgICBlY2hvICJDbGFzZXMiCiAgICAkVEMgLXMgLWQgY2xhc3Mgc2hvdyBk&lt;br /&gt;ZXYgJERFVgogICAgZWNobyAiRmlsdGVycyIKICAgICRUQyBmaWx0ZXIgc2hvdyBk&lt;br /&gt;ZXYgJERFVgp9CgpmdW5jdGlvbiBzZXRfc3RhbmRhcmRfYXJncyAoICkgCnsKICAg&lt;br /&gt;IGNhc2UgJDEgaW4KICAgICAgICAicmF0ZSIpCiAgICAgICAgICAgIE1BWFJBVEU9&lt;br /&gt;JDIgOzsKICAgICAgICAiaWYiKQogICAgICAgICAgICBERVY9JDIgOzsgICAgICAg&lt;br /&gt;IAogICAgICAgICJ1bml0IikKICAgICAgICAgICAgVU5JVD0kMiA7OwogICAgICAg&lt;br /&gt;ICJjbGVhciIpCiAgICAgICAgICAgIERFVj0kMgogICAgICAgICAgICBDTEVBUkZM&lt;br /&gt;QUc9IlRSVUUiIDs7CiAgICAgICAgInNob3dfY29uZiIpCiAgICAgICAgICAgIERF&lt;br /&gt;Vj0kMgogICAgICAgICAgICBTSE9XQ09ORkZMQUc9IlRSVUUiIDs7CiAgICBlc2Fj&lt;br /&gt;Cn0KCmZ1bmN0aW9uIGNsZWFudXBfcnVsZXMgKCkKewogICAgJFRDIHFkaXNjIGRl&lt;br /&gt;bCBkZXYgJERFViByb290IDI+IC9kZXYvbnVsbCA+IC9kZXYvbnVsbAp9CgpmdW5j&lt;br /&gt;dGlvbiBzZXRfY3VzdG9tX2FyZ3MgKCApIAp7CiAgICBjYXNlICQxIGluCiAgICAg&lt;br /&gt;ICAgInVzZXIiKQogICAgICAgICAgICBVU0VSTkFNRT0kMiA7OwogICAgICAgICJm&lt;br /&gt;dWxsX2NsZWFyIikKICAgICAgICAgICAgREVWPSQyCiAgICAgICAgICAgIENMRUFS&lt;br /&gt;RkxBRz0iVFJVRSIKICAgICAgICAgICAgQ0xFQVJfSVBUQUJMRVNfTUFOR0xFX1Q9&lt;br /&gt;IlRSVUUiCiAgICBlc2FjCn0KCmNhc2UgJDEgaW4KICAgICJoZWxwIikKICAgICAg&lt;br /&gt;ICBlY2hvIAogICAgICAgIGVjaG8gIkxpbWl0YSBlbCB0cmFmaWNvIGRlIHN1Ymlk&lt;br /&gt;YSBkZSB0b2RvcyBsb3MgcHJvY2Vzb3MgZGUgdW4gdXN1YXJpby4iCiAgICAgICAg&lt;br /&gt;ZWNobyAiTU9ETyBERSBVU086ICQwIFt1c2VyIHVzZXJQYXR0ZXJuXSBbcmF0ZSBt&lt;br /&gt;YXhSYXRlXSBbdW5pdCBiYW5kd2lkdGhVbml0XSBbaWYgaW50ZXJmYWNlXSIKICAg&lt;br /&gt;ICAgICBlY2hvCiAgICAgICAgZXhpdCAgOzsKZXNhYwoKaT0wCmxpc3RbMF09IiIK&lt;br /&gt;bGlzdFsxXT0iIgpmb3IgcGFyYW0gaW4gJEAgOyBkbwogICAgbGlzdFskaV09JHBh&lt;br /&gt;cmFtIAogICAgbGV0IGkrPTEKICAgIGlmIFtbICRpIC1lcSAyIF1dIDsgdGhlbgog&lt;br /&gt;ICAgICAgIHNldF9zdGFuZGFyZF9hcmdzICR7bGlzdFswXX0gJHtsaXN0WzFdfQog&lt;br /&gt;ICAgICAgIHNldF9jdXN0b21fYXJncyAke2xpc3RbMF19ICR7bGlzdFsxXX0KICAg&lt;br /&gt;ICAgICBzaG93X2NvbmZfYnVpbGRlciAke2xpc3RbMF19ICR7bGlzdFsxXX0gCiAg&lt;br /&gt;ICAgICAgbGV0IGk9MAogICAgZmkKZG9uZQoKaWYgW1sgJENMRUFSRkxBRyA9PSAi&lt;br /&gt;VFJVRSIgXV0gOyB0aGVuCiAgICBjbGVhbnVwX3J1bGVzCiAgICBpZiBbWyAkQ0xF&lt;br /&gt;QVJfSVBUQUJMRVNfTUFOR0xFX1QgPT0gIlRSVUUiIF1dIDsgdGhlbgogICAgICAg&lt;br /&gt;IGlwdGFibGVzIC10IG1hbmdsZSAtRgogICAgZmkKICAgIGV4aXQgCmVsaWYgW1sg&lt;br /&gt;JFNIT1dDT05GRkxBRyA9PSAiVFJVRSIgXV0gOyB0aGVuCiAgICBzaG93X2NvbmYK&lt;br /&gt;ICAgIGlwdGFibGVzIC10IG1hbmdsZSAtLWxpc3QgCiAgICBleGl0IApmaQoKVVNF&lt;br /&gt;UklEPSQoY2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAkVVNFUk5BTUUgfCBzZWQgLW4g&lt;br /&gt;J3MvXChbXjpdXCs6XClcezJcfVwoW146XVwrXClcKDouXCskXCkvXDIvZ3AnKQpp&lt;br /&gt;ZiBbWyAteiAkVVNFUklEIF1dIDsgdGhlbgogICAgZWNobyAiRWwgdXN1YXJpbyAk&lt;br /&gt;VVNFUk5BTUUgcGFyZWNlIG5vIGV4aXN0aXIiCiAgICBleGl0CmZpCgppcHRhYmxl&lt;br /&gt;cyAtdCBtYW5nbGUgLUEgT1VUUFVUIC0tb3V0LWludGVyZmFjZSAkREVWIC0tbWF0&lt;br /&gt;Y2ggb3duZXIgLS11aWQtb3duZXIgJFVTRVJJRCAtaiBNQVJLIC0tc2V0LW1hcmsg&lt;br /&gt;JFVTRVJJRAojJFRDIHFkaXNjIGRlbCBkZXYgJERFViByb290IDI+JjEgPi9kZXYv&lt;br /&gt;bnVsbAokVEMgcWRpc2MgYWRkIGRldiAkREVWIHJvb3QgaGFuZGxlIDE6IGh0YiBk&lt;br /&gt;ZWZhdWx0IDYwIDI+IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAKJFRDIGNsYXNzIGFk&lt;br /&gt;ZCBkZXYgJERFViBwYXJlbnQgMTogY2xhc3NpZCAxOiRVU0VSSUQgaHRiIHJhdGUg&lt;br /&gt;JHtNQVhSQVRFfSR7VU5JVH0gY2VpbCAke01BWFJBVEV9JHtVTklUfSAgMj4gL2Rl&lt;br /&gt;di9udWxsID4gL2Rldi9udWxsCmlmIFtbICQ/ID09IDAgXV0gOyB0aGVuCiAgICAk&lt;br /&gt;VEMgZmlsdGVyIGFkZCBkZXYgJERFViBwcm90b2NvbCBpcCBwYXJlbnQgMTogaGFu&lt;br /&gt;ZGxlICRVU0VSSUQgZncgY2xhc3NpZCAxOiRVU0VSSUQKICAgIHNob3dfY3VzdG9t&lt;br /&gt;X2NvbmYKZWxzZQogICAgZWNobyAiRWwgc2V0ZW8gbm8gcHVkbyByZWFsaXphcnpl&lt;br /&gt;LCB0YWwgdmV6IHNlYSBxdWUgZWwgdXN1YXJpbyB5YSBmdWUiCiAgICBlY2hvICJj&lt;br /&gt;b25maWd1cmFkbyBwb3IgZXN0ZSBzY3JpcHQuIgpmaQojIHZpbTpzdz00OnNvZnR0&lt;br /&gt;YWJzdG9wPTQ6ZXhwYW5kdGFiOnN5bnRheD1zaDpub3dyYXA6bnU6ZmlsZXR5cGU9&lt;br /&gt;c2gK&lt;br /&gt;--- Fin del archivo ---&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Referencias&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style=";font-family:courier new;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;[1]: (http://lartc.org/howto/, y en español http://www.gulic.org/comos/LARTC), man tc&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&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/7426898488372542781-6756942837856385881?l=janauati.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://janauati.blogspot.com/feeds/6756942837856385881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7426898488372542781&amp;postID=6756942837856385881&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/6756942837856385881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7426898488372542781/posts/default/6756942837856385881'/><link rel='alternate' type='text/html' href='http://janauati.blogspot.com/2008/03/limitando-el-bandwidth-por-host-red-y.html' title='Limitando el bandwidth por host, red y usuario con Linux:'/><author><name>Jonatan Anauati</name><uri>http://www.blogger.com/profile/08573063486585528093</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='20' src='http://3.bp.blogspot.com/-CRUp4cTS-gM/TlROT2INO2I/AAAAAAAAAFo/ln1rjxdsmyQ/s220/ollie.jpg'/></author><thr:total>0</thr:total></entry></feed>
