<?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-19875758</id><updated>2012-02-23T10:39:06.210-05:00</updated><category term='mobile'/><category term='presentaciones'/><category term='flash'/><category term='javascript'/><category term='center'/><category term='web'/><category term='ventanas'/><category term='lenguaje'/><category term='código'/><category term='malware'/><category term='desarrollo'/><category term='gadget'/><category term='sidebar'/><category term='ebook'/><category term='chrome'/><category term='firefox'/><category term='xampp'/><category term='iphone'/><category term='css'/><category term='git'/><category term='inicio'/><category term='esquema'/><category term='internet'/><category term='gráficos'/><category term='zen'/><category term='email'/><category term='windows'/><category term='tdd'/><category term='background'/><category term='uphp'/><category term='metodología'/><category term='cs5'/><category term='instalar'/><category term='xp'/><category term='agil'/><category term='kohana'/><category term='apache'/><category term='linux'/><category term='sharing'/><category term='centos'/><category term='mysql'/><category term='solución'/><category term='php'/><category term='photoshop'/><category term='libertad'/><category term='optimización'/><category term='ssh'/><category term='bash'/><category term='pdf'/><category term='seo'/><category term='mvc'/><category term='jquery'/><category term='editor'/><category term='programación'/><category term='proyectos'/><category term='mercury'/><category term='html'/><category term='utilidades'/><category term='problema'/><category term='drupal'/><category term='dropbox'/><category term='eventos'/><category term='framework'/><category term='ubuntu'/><category term='error'/><category term='virtuallización'/><title type='text'>Puroguramu</title><subtitle type='html'>Web [&amp;amp;] Development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>79</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19875758.post-663308470638793277</id><published>2012-02-23T10:39:00.000-05:00</published><updated>2012-02-23T10:39:06.226-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='ebook'/><title type='text'>Sigil para crear epub</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-g804S3Eqqio/T0ZcOuKtheI/AAAAAAAABv4/op8DPd6xzOs/s1600/sigil-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-g804S3Eqqio/T0ZcOuKtheI/AAAAAAAABv4/op8DPd6xzOs/s1600/sigil-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Epub es un formato abierto para libros electrónicos.&lt;br /&gt;&lt;br /&gt;Me estoy aficionando a leer epubs en el celular. Me gusta el hecho de que el contenido se adapte al tamaño de la pantalla. Me hacía recordar al HTML, así que me preguntaba cómo es que se haría un epub.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-3w1oqsPWjMs/T0ZcailU1lI/AAAAAAAABwA/x_dukVZehvA/s1600/epub_logo_color.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-3w1oqsPWjMs/T0ZcailU1lI/AAAAAAAABwA/x_dukVZehvA/s200/epub_logo_color.jpg" width="145" /&gt;&lt;/a&gt;Si pruebas cambiar la extensión de un archivo epub a zip y pruebas abrirlo, verás que se puede. Un epub contiene, comprimido en un zip, una estructura de archivos tipo web, principalmente XHTML, que constituyen el libro.&lt;br /&gt;&lt;br /&gt;De modo parecido a hacer páginas web, es posible hacer un epub completamente a mano. Sin embargo, la estructura del epub es un poco más complicada. Resulta más práctico iniciar sobre un template o usar algún programa de edición WYSIWYG, como &lt;a href="http://code.google.com/p/sigil/"&gt;Sigil&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lo he probado para hacer un libro simple. Me sirvió de bastante ayuda &lt;a href="http://code.google.com/p/sigil/wiki/BasicTutorial"&gt;este tutorial&lt;/a&gt;. Aunque es para una versión anterior y el menú ha cambiado un poco.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-663308470638793277?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/663308470638793277/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2012/02/sigil-para-crear-epub.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/663308470638793277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/663308470638793277'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2012/02/sigil-para-crear-epub.html' title='Sigil para crear epub'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-g804S3Eqqio/T0ZcOuKtheI/AAAAAAAABv4/op8DPd6xzOs/s72-c/sigil-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6844142555037948707</id><published>2012-02-22T22:34:00.001-05:00</published><updated>2012-02-22T22:42:53.145-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><title type='text'>Hola Sublime Text 2!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GAcPqZLiy-E/T0WtNTBdyJI/AAAAAAAABvs/-KutAcqdQUM/s1600/sublimetext2-icon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-GAcPqZLiy-E/T0WtNTBdyJI/AAAAAAAABvs/-KutAcqdQUM/s1600/sublimetext2-icon.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt; es un nuevo editor de texto que estoy probando.&lt;br /&gt;&lt;br /&gt;Mi editor de textos favorito es &lt;a href="http://notepad-plus-plus.org/"&gt;Notepad++&lt;/a&gt;. Antes lo fue &lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt;. Pero, cuando jEdit me empezó a parecer demasiado pesado, encontré en npp una buena alternativa. Iniciaba mucho más rápido, también coloreaba la sintaxis, también tenía tabs... además empecé a pasar la mayor parte del tiempo en Windows, así que comencé a usarlo cada vez más. Mucho más con el cómodo manejo de encodings (más que en cualquier otro editor que haya visto), el plugin para FTP y con el soporte para Zencoding.&lt;br /&gt;&lt;br /&gt;Hace unos días, de pronto, descubrí Sublime Text 2. Lo recomendaban en unos video tutoriales sobre jQuery en &lt;a href="http://net.tuts.com/"&gt;net.tuts.com&lt;/a&gt;. Y me está pareciendo interesante. Aún me está costando un poco acostumbrarme a las nuevas secuencias de teclas pero me gusta mucho lo de los cursores múltiples, las selecciones rectangulares, las selecciones múltiples, la forma en que maneja la configuración. No es open source pero tiene una arquitectura extensible. No es gratis pero uno puede probarlo indefinidamente... sólo hay que cerrar el recordatorio de compra de vez en cuando.&lt;br /&gt;&lt;br /&gt;Tengo ciertos hábitos al editar texto, así que aquí resumo lo que voy haciendo mientras aprendo cómo hacerlo en ST2.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Preferencias Generales&lt;/span&gt;&lt;br /&gt;Por ejemplo, para fonts, me gusta usar algo similar a Lucida Typewriter, o DejaVu Sans Mono, a 14pt. También los tabs reemplazados por 2 espacios.&lt;br /&gt;No encuentro un menú para eso. Pero se resuelve entrando a &lt;i&gt;Preferences, Settings-User&lt;/i&gt; y agregando ahí los items de configuración que uno quiera. Una referencia a los valores que se puede poner se puede ver entrando a &lt;i&gt;Preferences, Settings-Default&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{&lt;br /&gt;  "font_face": "DejaVu Sans Mono",&lt;br /&gt;  "font_size": 14,&lt;br /&gt;  "tab_size": 2,&lt;br /&gt;  "translate_tabs_to_spaces": true&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Zencoding&lt;/span&gt;&lt;br /&gt;Si uno hace una secuencia tipo zencoding seguida de un tab, se expande. Sin embargo, quisiera expansiones de documento un poco más completas (html:4s, por ejemplo). Así que buscando encuentro que para instalar Zencoding hay que instalar primero el &lt;a href="http://wbond.net/sublime_packages/package_control"&gt;Sublime Package Control&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para eso no hay que bajar manualmente ningún archivo, sino ejecutar en la consola de ST2 (se abre con &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;CTRL+`&lt;/span&gt; o entrando a View, Show Console), lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Luego de eso, reinicio ST2. Luego, entro a Tools, Command Pallete, Package Control::Install Package y elijo Zencoding en la lista de paquetes. Reinicio ST2 nuevamente. Pruebo crear un documento html, escribo &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;html:4s, TAB&lt;/span&gt;, funciona :-D&lt;br /&gt;&lt;br /&gt;Para una guía rápida de cómo usar Zencoding en ST2, se puede revisar&amp;nbsp;&lt;a href="http://code.google.com/p/zen-coding/wiki/SublimeTextZenCodingEn"&gt;http://code.google.com/p/zen-coding/wiki/SublimeTextZenCodingEn&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6844142555037948707?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6844142555037948707/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2012/02/hola-sublime-text-2.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6844142555037948707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6844142555037948707'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2012/02/hola-sublime-text-2.html' title='Hola Sublime Text 2!'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-GAcPqZLiy-E/T0WtNTBdyJI/AAAAAAAABvs/-KutAcqdQUM/s72-c/sublimetext2-icon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2737516019889132121</id><published>2012-01-20T00:52:00.001-05:00</published><updated>2012-01-20T01:02:11.092-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agil'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='zen'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>En el Dojo</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0RvQY1w4nQ8/TxkAwHGWU_I/AAAAAAAABvI/yPAe3BjgpDc/s1600/dojo_port.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://4.bp.blogspot.com/-0RvQY1w4nQ8/TxkAwHGWU_I/AAAAAAAABvI/yPAe3BjgpDc/s320/dojo_port.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Hoy asistí a un dojo de programación. Me ha parecido una experiencia muy enriquecedora.&lt;br /&gt;&lt;br /&gt;Un dojo de programación trata de seguir la idea de un dojo de artes marciales en cuanto a formar un ambiente donde podamos ejercitarnos fuera de la contienda real (que viene a ser el día a día con los proyectos que desarrollamos).&lt;br /&gt;&lt;br /&gt;La práctica se trató esta vez de usar TDD y una especie de Pair Programming para resolver el problema de convertir números arábigos, los que usamos normalmente, a la notación romana.&lt;br /&gt;&lt;br /&gt;TDD son las iniciales de Test Driven Development, Desarrollo Guiado por Pruebas. Pablo Tortorella, quien nos guiaba, dijo que le parecía mejor pensar en Desarrollo Guiado por Ejemplos, ya que una prueba es en realidad un caso particular que ponemos como ejemplo para que el programa que hacemos lo intente resolver. Un ambiente de pruebas toma la prueba y la lleva a cabo a ver si el programa la pasa. Entonces, en TDD: 1) definimos una prueba simple 2) corremos la prueba (incluso sin tener ningún programa; es importante ver que falla) 3) se enfoca uno en implementar en el programa lo mínimo necesario hasta lograr pasar la prueba 4) si se nota que algo puede refactorizarse (simplificar, eliminar duplicaciones o dependencias innecesarias), hacerlo, luego pasar al paso 1) e ir repitiendo el ciclo, con pasitos de bebe, dejando que el programa evolucione hasta el nivel que deseemos.&lt;br /&gt;&lt;br /&gt;Para alguien habituado a programar al estilo tradicional, donde se pretende resolver todo el problema en la fase de diseño, antes incluso de empezar a programar, puede costar un poco enfocarse en pequeños pasos y no intentar codificar toda la solución de una vez. Pero el estilo tradicional realmente tiene problemas. Precisamente en respuesta a esos problemas surgieron cosas como la eXtreme Programming, TDD y Agile.&lt;br /&gt;&lt;br /&gt;En el caso del problema de la conversión a números romanos, probablemente uno imagine ahora, sin necesidad de programar, una manera de resolver el problema y podría programarla en un rato. Pero, deténgase y trate de hacerlo en pequeños pasos, ideando una prueba simple y trivial cada vez, para ver a dónde va conduciendo.&lt;br /&gt;&lt;br /&gt;Con el dojo me di cuenta que, conforme avanzan las iteraciones, van apareciendo patrones que van sugiriendo la solución. El tiempo de la práctica se acabó, pero creo que eventualmente llegaríamos a solucionar el problema.&lt;br /&gt;&lt;br /&gt;Camino de regreso, recordaba la forma en que el código iba proponiéndose y refactorizándose. Había cierto algoritmo en eso. Me pregunto si sería posible programar a una computadora para que halle esa solución evolutiva usando TDD. Quizás sí. Entonces, me pregunto si sería posible que una computadora, o un conjunto de computadoras, realizando pequeños pasos de bebe, resolviendo casos triviales, puedan resolver cualquier tipo de problema de programación, simplemente por evolución, usando TDD. Me pregunto si será ese el futuro.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Crédito de la imagen:&amp;nbsp;&lt;a href="http://ciodojo.com/about/"&gt;CIO Dojo&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2737516019889132121?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2737516019889132121/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2012/01/en-el-dojo.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2737516019889132121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2737516019889132121'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2012/01/en-el-dojo.html' title='En el Dojo'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-0RvQY1w4nQ8/TxkAwHGWU_I/AAAAAAAABvI/yPAe3BjgpDc/s72-c/dojo_port.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5887850128486138948</id><published>2012-01-03T19:16:00.002-05:00</published><updated>2012-01-03T23:39:21.652-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libertad'/><title type='text'>La libertad de llegar al otro lado</title><content type='html'>Había una vez un barquero que ayudaba a la gente a cruzar de un lado a otro del río.&lt;br /&gt;&lt;br /&gt;Antaño hacía mucho frío y eran muy fuertes las corrientes que cruzaban el agua helada. Había que recorrer un camino largo, que pasaba por un monasterio, para llegar a un puente donde se podía cruzar.&lt;br /&gt;&lt;br /&gt;El barquero tuvo que traer madera de muy lejos, cuerdas fuertes y brea y hacer varias pruebas antes de lograr una embarcación que lograra cruzar el río en el punto donde la gente más lo necesitaba.&lt;br /&gt;&lt;br /&gt;Los primeros viajes fueron para los sacerdotes, que habían visto con recelo la construcción del aparato. Algunos criticaron que no tenia la estabilidad del puente del monasterio y que sería mejor prohibirlo, para proteger a la gente. Pero cruzaban ya los nobles y cada vez más gente, así que decidieron que dejarían al barquero en paz con tal de que les pagara el impuesto correspondiente. La gente le daba sus monedas al barquero y la décima parte de estas llegaba al monasterio. Además, la gente podía pasar sólo las cosas que el monasterio permitía.&lt;br /&gt;&lt;br /&gt;Aparecieron otros barqueros para resolver las largas colas que se estaban comenzando a formar, pues un solo barco no bastaba para todos los viajeros que cruzaban por ahí. El monasterio los dejaba prosperar con tal que le pagaran su impuesto.&lt;br /&gt;&lt;br /&gt;Un pueblo empezó a formarse en el punto donde cruzaba la gente, para atender a los muchos viajeros que ahora preferían esta ruta.&lt;br /&gt;&lt;br /&gt;No era fácil conseguir lo que se necesitaba para hacer un barco ni era fácil conducirlo por aquellas aguas agrestes. Los barqueros, con el tiempo, decidieron que era injusto el impuesto que le pagaban al monasterio y dejaron de dárselo. Como los pasajes bajaron de precio y les permitieron pasar mas cosas que antes, la gente apoyó la decisión.&lt;br /&gt;&lt;br /&gt;Los tiempos cambiaron. El río se volvió más amigable. Un día, alguien ideó una manera sencilla de hacerse una canoa y poder cruzar también. No se iba en los asientos de cuero de los barcos, ni servían té y panecillos, pero era suficiente para quienes querían un modo económico de cruzar.&lt;br /&gt;&lt;br /&gt;Los barqueros se opusieron al nuevo invento, aduciendo que ponía en peligro a la gente.&lt;br /&gt;&lt;br /&gt;Pero, como no pudieron detener a la gente que los seguía usando, decidieron reclamar al Señor de esas tierras, para que este declarara que el río era propiedad natural de los barqueros, del mismo modo que un martillo era propiedad natural de un carpintero, o un rastrillo la propiedad natural de un jardinero. Uno podría seguir usando canoas, siempre y cuando algún barquero le diera permiso de pasar por su parte del río.&lt;br /&gt;&lt;br /&gt;Los barqueros se convirtieron en protectores del río. El Señor se convirtió en protector de los barqueros.&amp;nbsp;Y como tal, recibía ahora los impuestos que antes recibiera el monasterio.&lt;br /&gt;&lt;br /&gt;Un día un grupo de viajeros decidió plantar altos pilares en cada orilla, llevar cuerdas de un lado a otro y tender un puente colgante. La gente podía cruzar con más fluidez, sin pagar nada y con libertad de llevar cualquier cosa que quisiera.&lt;br /&gt;&lt;br /&gt;Los barqueros se escandalizaron y se opusieron firmemente al puente, a pesar de que solucionaba el problema inicial. Qué iba a ser de ellos y su modo de vida. Anunciaron que la prosperidad del pueblo se vería afectada. Clamaron por sus derechos ante el Señor.&lt;br /&gt;&lt;br /&gt;Quienes tendieron el puente mostraron que no estaban tocando el río de los barqueros y el Señor tuvo que admitir que tenían razón y la gente podía usar lo que mejor le pareciera. Por un tiempo así fue.&lt;br /&gt;&lt;br /&gt;Pero los barqueros insistieron, haciéndole ver al Señor que obtendría menos impuestos. Y, por supuesto, del peligro que representaba el puente para la seguridad del reino, cuando no se podía controlar las cosas que podían pasar de un lado a otro del río.&lt;br /&gt;&lt;br /&gt;Un día se anunció que un espía proveniente de un reino enemigo había intentado cruzar el puente con intenciones oscuras. Había sido tan hábil con las armas como lo eran los hombres de la guardia del señor. Pero, por supuesto, era del otro reino porque usaba ese atuendo. Felizmente lo pudieron neutralizar.&lt;br /&gt;&lt;br /&gt;Como se demostró que el puente podía ser peligroso, se ordenó controlar no sólo qué cosas podían pasar, sino qué personas tenían el derecho de hacerlo. En cada extremo del puente, la gente se quitaba los zapatos y se los volvía a poner luego que los guardianes del Señor los habían revisado. Por otro lado, en el palacio consideraban invadir al reino que envió al invasor, por el terror que estaba ocasionando.&lt;br /&gt;&lt;br /&gt;Un día, el río cambió. El nivel bajó y era posible hallar sendas donde cruzar sin que el agua llegara más arriba de las rodillas. Cualquiera podría ir y venir sin usar barcos o puentes.&lt;br /&gt;&lt;br /&gt;Pero los barqueros prohibieron que se hiciera tal cosa. Insistían en que tenían el derecho natural de proteger el río.&lt;br /&gt;&lt;br /&gt;Una noche, cansados de que el Señor prefiriera a unos pocos barqueros por encima de todo el pueblo, todos los jóvenes se acercaron a la orilla y esperaron en silencio. Al amanecer, fueron cruzando. Aunque los barqueros vociferaban por sus derechos y se quejaban ante sus padres y los hombres del Señor intentaban detenerlos, no podían.&lt;br /&gt;&lt;br /&gt;En el transcurso de la mañana, también sus padres y toda la demás gente se les unió, en una sola fuerza. Porque eran más. Porque eran la razón de que los barcos. Porque eran la razón de los puentes. Porque se dieron cuenta que eran también la razón del Señor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5887850128486138948?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5887850128486138948/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2012/01/la-libertad-de-llegar-al-otro-lado.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5887850128486138948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5887850128486138948'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2012/01/la-libertad-de-llegar-al-otro-lado.html' title='La libertad de llegar al otro lado'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5706194035368054511</id><published>2011-12-19T13:02:00.001-05:00</published><updated>2011-12-19T13:02:20.966-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Creando nuevas opciones</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0zCGlTqGlbc/Tu94T3k0PwI/AAAAAAAABqs/uo0oNiyIilA/s1600/raton_laberinto.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="138" src="http://1.bp.blogspot.com/-0zCGlTqGlbc/Tu94T3k0PwI/AAAAAAAABqs/uo0oNiyIilA/s200/raton_laberinto.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Caminando por una tienda, encontré un juguete con forma de notebook.&lt;br /&gt;&lt;br /&gt;Lo encendí y comencé a navegar por las distintas opciones que ofrecía.&lt;br /&gt;&lt;br /&gt;Había juegos para aprender el alfabeto, los números, las notas musicales, para escribir mensajes, y así por el estilo.&lt;br /&gt;&lt;br /&gt;Pensé que llegaría un momento en que uno habría explorado todas las opciones. Entonces querria más.&lt;br /&gt;&lt;br /&gt;La diferencia entre una computadora y el juguete era que no había opción para agregar cosas. O quitar cosas. O modificar las que habían.&lt;br /&gt;&lt;br /&gt;¿Cuántas personas usan las computadoras de ese modo? Es decir, como un gran conjunto de opciones que consumir, simplemente, sin poder modificarlas. Un ejemplo que me viene a la mente es el de los diccionarios. Sería tan útil que nos permitieran agregar nuestras propias definiciones y, sin embargo, debemos conformarnos con descargar las que hayan hecho otros.&lt;br /&gt;&lt;br /&gt;Se podría pensar que es algo que le corresponde a los programadores. Pero pienso que programar una computadora debería ser algo tan simple que podamos hacerlo todos.&lt;br /&gt;&lt;br /&gt;Me parece que con la consola de comandos íbamos por un camino que eventualmente nos conduciria a intérpretes de lenguajes humanos. Primero por escrito y luego por voz. Un día cercano podríamos comandar una computadora como si conversáramos con ella, como en Star Trek.&lt;br /&gt;&lt;br /&gt;Pero apareció el sistema de menús y ratón y hubo un desvío.&lt;br /&gt;&lt;br /&gt;Un sistema de menús presenta las opciones en una estructura jerárquica. Eso permite verlas con más claridad. El ratón permite navegar en ese sistema. Comparado con escribir los comandos, puede resultar más cómodo, más rápido... para ciertas cosas.&lt;br /&gt;&lt;br /&gt;Quienes usan la consola de comandos pueden notar que hay cosas que la consola permite y el sistema de menús no.&lt;br /&gt;&lt;br /&gt;Si usamos la consola de comandos simplemente como un modo de llegar a las opciones que ofrece el sistema de menús, no hay mucha ventaja (sería más cómodo usar el ratón). La magia de la consola de comandos aparece cuando permite crear nuevas opciones y manipularlas con una expresividad que quizás esté más allá de las posibilidades de un sistema jerárquico de presentación.&lt;br /&gt;&lt;br /&gt;Los lenguajes de programación son un modo de crear esas nuevas opciones. Antes, en la época de la consola de comandos, se hacía el intento de acercar estos lenguajes a la gente. Estaban BASIC, LOGO y así por el estilo. Pero eso fue decayendo conforme se popularizaba el ratón.&lt;br /&gt;&lt;br /&gt;El problema con el mundo del ratón es que tiene un límite, igual que el juguete. Como en una tierra plana, llegará el momento, tarde o temprano, en que se habrá recorrido cada opción y, parado en el borde de ese mundo, querrá más.&lt;br /&gt;&lt;br /&gt;Claro que los programadores se encargarán de ampliarlo, proveyendo nuevas opciones que estarán disponibles con solo pasar a la siguiente versión. Dependemos de ellos para eso. Pero ¿no sería mejor que cada uno pudiera crear por si mismo nuevas opciones, en lugar de tener que esperar a que a alguien más se les ocurra y las programe?&lt;br /&gt;&lt;br /&gt;En el desarrollo de programas, se va tomando más en cuenta el papel del usuario en la definición del producto y su implementación. Las ideas de los usuarios (recolectadas a través de foros o emails) son tomadas en cuenta en el diseño. Los errores que encuentran ayudan a mejorar el producto. Se compite para ver quién logra escuchar mejor a los usuarios y traducir lo que dicen a mejoras en el software. Pero, viéndolo bien, es como si los usuarios programaran las computadoras a través de los programadores. ¿No sería mejor que la programación pudiera ser directa?&lt;br /&gt;&lt;br /&gt;Yo soy programador, pero me parece que muchas veces estamos cumpliendo simplemente el rol de intermediarios es una tarea que debería poder ser realizada directamente por los usuarios. Programar debería ser algo mas simple y cualquier persona debería sentirse capaz de comunicar a la computadora lo que quisiera que hiciera. Encontrar un modo en que la gente pueda definir nuevas opciones, o expresarlas de otro modo, luego compartirlas con los demás y permitir que evolucionen.&lt;br /&gt;&lt;br /&gt;Imagine que puede agregar opciones a su árbol de menús. Imagine que puede operar con las opciones que ya tiene para crear otras nuevas. Imagine que incluso puede crear nuevas operaciones para manipular esas opciones. Imagine que puede compartir todo eso con otros usuarios. Y todo eso de un modo que le resulta natural, lógico, simple.&lt;br /&gt;&lt;br /&gt;Esa forma de ver la computación era más evidente cuando se usaba la consola de comandos, ese infinito universo negro poblado de letras fosforescentes. Pero pienso que también se podría hacer en el sistema de menús, si abrimos la puerta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5706194035368054511?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5706194035368054511/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/12/creando-nuevas-opciones.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5706194035368054511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5706194035368054511'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/12/creando-nuevas-opciones.html' title='Creando nuevas opciones'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-0zCGlTqGlbc/Tu94T3k0PwI/AAAAAAAABqs/uo0oNiyIilA/s72-c/raton_laberinto.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-869284615553018464</id><published>2011-11-17T11:22:00.001-05:00</published><updated>2011-11-17T11:35:11.212-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimización'/><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><title type='text'>Optimizando Photoshop</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JQM6dfKbOmU/TsU3t0pbz_I/AAAAAAAABqU/jxYxBYZioG0/s1600/Adobe-Photoshop-Icon-64.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-JQM6dfKbOmU/TsU3t0pbz_I/AAAAAAAABqU/jxYxBYZioG0/s1600/Adobe-Photoshop-Icon-64.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Edit, Preferences, General (CTRL+K)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Desmarcar &lt;i&gt;Export Clipboard&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Al parecer esto previene que una copia sea puesta además en el clipboard general de Windows. Como las copias en Photoshop suelen ser grandes, significa un ahorro significativo en la memoria disponible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Además, es posible acceder a &lt;i&gt;Edit, Purge&lt;/i&gt; para vaciar de memoria el clipboard (de Photoshop) y el historial.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-869284615553018464?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/869284615553018464/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/11/optimizando-photoshop.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/869284615553018464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/869284615553018464'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/11/optimizando-photoshop.html' title='Optimizando Photoshop'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JQM6dfKbOmU/TsU3t0pbz_I/AAAAAAAABqU/jxYxBYZioG0/s72-c/Adobe-Photoshop-Icon-64.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3965695183719528600</id><published>2011-10-28T18:00:00.000-05:00</published><updated>2011-10-28T18:34:43.037-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Construyendo un Wysiwyg Editor con jQuery</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1HqO8qW939Q/TJPfxG0QArI/AAAAAAAABNM/gcxnjPQOroM/s1600/jquery-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-1HqO8qW939Q/TJPfxG0QArI/AAAAAAAABNM/gcxnjPQOroM/s1600/jquery-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;En HTML, normalmente un textarea no es wysiwyg, pero existen plugins javascript, como &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;, &lt;a href="http://nicedit.com/"&gt;NicEdit&lt;/a&gt;, entre otros, que ayudan a que lo sea. Se instala el plugin, se configura y listo. ¿Te animarías a hacerlo tú mismo?&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;WYSIWYG&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;W&lt;/b&gt;hay &lt;b&gt;Y&lt;/b&gt;ou &lt;b&gt;S&lt;/b&gt;ee &lt;b&gt;I&lt;/b&gt;s &lt;b&gt;W&lt;/b&gt;hat &lt;b&gt;Y&lt;/b&gt;ou &lt;b&gt;G&lt;/b&gt;et&lt;/i&gt;: lo que ves es lo que obtienes&lt;br /&gt;Así es como se denomina a los editores que muestran la apariencia final del documento mientras es editado.&lt;br /&gt;&lt;br /&gt;Buscando hacerme una herramienta para tomar notas con más facilidad, entré a explorar en este tema.&lt;br /&gt;&lt;br /&gt;Antes, estaba envuelto por un halo misterioso. Suponía que sería una cuestión demasiado complicada. Descubrí que es más fácil de lo que parece.&lt;br /&gt;&lt;br /&gt;Antes, para hacer editable un &lt;b&gt;div&lt;/b&gt;, lo que se me ocurría era montar encima un elemento editable, como un &lt;b&gt;input text&lt;/b&gt;, que se muestre cuando se necesite la edición. Pero, limitándome a eso, no veía cómo era posible mostrar en negrita o cursiva algo dentro de un elemento editable. Imaginaba que tendría que ver con algún tipo de magia desconocida que involucraría código muy complejo y sofisticado.&lt;br /&gt;&lt;br /&gt;Resulta que es posible hacer que un &lt;b&gt;div&lt;/b&gt; sea editable (¿por qué no difunden más esas cosas?).&lt;br /&gt;&lt;br /&gt;Cuando un &lt;b&gt;div&lt;/b&gt; es editable, está disponible un API que permite ejecutar comandos sobre su contenido (!).&lt;br /&gt;&lt;br /&gt;De ese modo, hacer un editor wysiwyg se convierte en una cuestión muy, muy accesible, incluso para un programador como yo :-)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;designMode&lt;/span&gt;&lt;br /&gt;Al parecer, IE fue el que primero implementó la idea de que un elemento fuera editable, luego los otros navegadores acogieron la idea y ahora ya es algo estándar.&lt;br /&gt;&lt;br /&gt;Esto se consigue haciendo que &lt;b&gt;designMode="On"&lt;/b&gt; para el objeto que se desea editar.&lt;br /&gt;&lt;br /&gt;Cuando se está en designMode="On", se pueden enviar comandos de formato usando la función execCommand. Estos permanecen activos hasta que se vuelven a enviar otra vez. O se aplican sobre el texto que estuviera seleccionado. Sí, como en Word. Hasta funciona deshacer con CTRL+Z&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;La idea básica&lt;/span&gt;&lt;br /&gt;Una de las primeras guías que encontré usa un iframe y botones.&lt;br /&gt;&lt;br /&gt;Pone el iframe en designMode="On". Hecho esto, se puede editar el contenido del iframe como si se estuviera en un textarea.&lt;br /&gt;&lt;br /&gt;Los botones permiten invocar los comandos de formato.&lt;br /&gt;&lt;br /&gt;Este es un ejemplo basado en:&amp;nbsp;&lt;a href="http://jsfiddle.net/Kxmaf/6/"&gt;http://jsfiddle.net/Kxmaf/6/&lt;/a&gt;&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html;charset=UTF-8"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;WYSIWYG Demo&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="js/jquery-1.6.4.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;input[type=button] {&lt;br /&gt;  border: 1px solid #ccc;&lt;br /&gt;}&lt;br /&gt;#editor {&lt;br /&gt;  width: 500px;&lt;br /&gt;  height: 170px;&lt;br /&gt;}&lt;br /&gt;#bold {&lt;br /&gt;  font-weight: bold;&lt;br /&gt;}&lt;br /&gt;#italic {&lt;br /&gt;  font-style: italic;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;$(document).ready(function() {&lt;br /&gt;  var cw = document.getElementById('editor').contentWindow;&lt;br /&gt;  var doc = cw.document;&lt;br /&gt;  doc.designMode = "on";&lt;br /&gt;  doc.write('');&lt;br /&gt;  doc.close();&lt;br /&gt;  &lt;br /&gt;  $('#bold').click(function() {&lt;br /&gt;    cw.focus();// IE&lt;br /&gt;    doc.execCommand('bold', false, false);&lt;br /&gt;    cw.focus();&lt;br /&gt;  });&lt;br /&gt;  $('#italic').click(function() {&lt;br /&gt;    cw.focus();// IE&lt;br /&gt;    doc.execCommand('italic', false, false);&lt;br /&gt;    cw.focus();&lt;br /&gt;  });&lt;br /&gt;  $('#fontname').change(function() {&lt;br /&gt;    cw.focus();// IE&lt;br /&gt;    doc.execCommand('fontname', false, $(this).val());&lt;br /&gt;    cw.focus();&lt;br /&gt;  });&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;WYSIWYG Demo&amp;lt;/h1&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;div id="buttons"&amp;gt;&lt;br /&gt;    &amp;lt;input type="button" id="bold" value="B" /&amp;gt;&lt;br /&gt;    &amp;lt;input type="button" id="italic" value="I" /&amp;gt;&lt;br /&gt;    &amp;lt;select id="fontname"&amp;gt;&lt;br /&gt;      &amp;lt;option value="Arial"&amp;gt;Arial&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Comic Sans MS"&amp;gt;Comic Sans MS&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Courier New"&amp;gt;Courier New&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Monotype Corsiva"&amp;gt;Monotype&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Tahoma"&amp;gt;Tahoma&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Times"&amp;gt;Times&amp;lt;/option&amp;gt;&lt;br /&gt;    &amp;lt;/select&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;iframe id="editor"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Mejorando&lt;/span&gt;&lt;br /&gt;Es posible usar un div en lugar de un iframe. También se puede aprovechar más cosas de jQuery.&lt;br /&gt;&lt;br /&gt;Este es un ejemplo basado en&amp;nbsp;&lt;a href="http://de77.com/javascript/jquery-simple-wysiwyg-editor"&gt;de77: jQuery Simple WYSIWYG Editor&lt;/a&gt;&amp;nbsp;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html;charset=UTF-8"&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;WYSIWYG Demo&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="js/jquery-1.6.4.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;input[type=button] {&lt;br /&gt;  border: 1px solid #ccc;&lt;br /&gt;}&lt;br /&gt;#editor {&lt;br /&gt;  width: 500px;&lt;br /&gt;  height: 170px;&lt;br /&gt;  border: 1px solid #ccc;&lt;br /&gt;}&lt;br /&gt;#bold {&lt;br /&gt;  font-weight: bold;&lt;br /&gt;}&lt;br /&gt;#italic {&lt;br /&gt;  font-style: italic;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;$(document).ready(function() {&lt;br /&gt;  function action(a,p) {&lt;br /&gt;    $('#editor').focus();&lt;br /&gt;    if (p == null) p = false;&lt;br /&gt;    document.execCommand(a, null, p);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  $('#editor').get(0).contentEditable = "true";&lt;br /&gt;  &lt;br /&gt;  $('#bold').click(function() {&lt;br /&gt;    action('bold');&lt;br /&gt;  });&lt;br /&gt;  $('#italic').click(function() {&lt;br /&gt;    action('italic');&lt;br /&gt;  });&lt;br /&gt;  $('#fontname').change(function() {&lt;br /&gt;    action('fontname', $(this).val());&lt;br /&gt;  });&lt;br /&gt;  $('#html').click(function() {&lt;br /&gt;    alert($('#editor').html());&lt;br /&gt;  });&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;WYSIWYG Demo&amp;lt;/h1&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;div id="buttons"&amp;gt;&lt;br /&gt;    &amp;lt;input type="button" id="bold" value="B" /&amp;gt;&lt;br /&gt;    &amp;lt;input type="button" id="italic" value="I" /&amp;gt;&lt;br /&gt;    &amp;lt;select id="fontname"&amp;gt;&lt;br /&gt;      &amp;lt;option value="Arial"&amp;gt;Arial&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Comic Sans MS"&amp;gt;Comic Sans MS&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Courier New"&amp;gt;Courier New&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Monotype Corsiva"&amp;gt;Monotype&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Tahoma"&amp;gt;Tahoma&amp;lt;/option&amp;gt;&lt;br /&gt;      &amp;lt;option value="Times"&amp;gt;Times&amp;lt;/option&amp;gt;&lt;br /&gt;    &amp;lt;/select&amp;gt;&lt;br /&gt;    &amp;lt;input type="button" id="html" value="HTML" /&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div id="editor"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Me parece que esto puede ayudar a aclarar el tema para empezar. Ojalá le sirva de ayuda.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/rich-text_editing_in_mozilla"&gt;Rich-Text Editing in Mozilla&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://de77.com/javascript/jquery-simple-wysiwyg-editor"&gt;jQuery Simple WYSIWYG Editor&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3965695183719528600?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3965695183719528600/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/10/construyendo-un-wysiwyg-editor-con.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3965695183719528600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3965695183719528600'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/10/construyendo-un-wysiwyg-editor-con.html' title='Construyendo un Wysiwyg Editor con jQuery'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1HqO8qW939Q/TJPfxG0QArI/AAAAAAAABNM/gcxnjPQOroM/s72-c/jquery-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-581282005453046768</id><published>2011-10-05T18:04:00.000-05:00</published><updated>2011-10-05T18:28:02.642-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>HTML + Javascript para usar cualquier framework</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: large;"&gt;Todo o nada&lt;/span&gt;&lt;br /&gt;Para hacer una aplicación web, se suele optar por alguna de las siguientes alternativas:&lt;br /&gt;&lt;br /&gt;a) Usar completamente un framework propio.&lt;br /&gt;b) Usar completamente un framework estándar.&lt;br /&gt;&lt;br /&gt;La alternativa a) significa volver a implementar muchas de las cosas que ya se han resuelto en otros frameworks.&lt;br /&gt;&lt;br /&gt;La alternativa b) significa depender completamente de lo que esté implementado en el framework elegido.&lt;br /&gt;&lt;br /&gt;Pero pienso que hay otra alternativa. Una que no use la palabra &lt;i&gt;completamente&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Imagine all the people&lt;/span&gt;&lt;br /&gt;Imagine que no tiene que volver a escribir su aplicación web en otro lenguaje simplemente para usar algunas de las cosas que ofrece cierto framework escrito en ese lenguaje.&lt;br /&gt;&lt;br /&gt;Imagine que no tiene que volver a escribir su aplicación web simplemente para usar algunas de las cosas que ofrece la siguiente versión del framework.&lt;br /&gt;&lt;br /&gt;Imagine un framework en el que pudiera usar cualquier cosa que ya se hubiera implementado en otro framework, sin necesidad de volver a escribirlo.&lt;br /&gt;&lt;br /&gt;Imagine que todos los frameworks pudieran trabajar juntos y usted pudiera escoger de esa feria de componentes los que mejor se adaptaran para cada cosa que necesitara. Todas las versiones y todos los lenguajes.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Cómo hacerlo&lt;/span&gt;&lt;br /&gt;Se me ocurre al menos una manera.&lt;br /&gt;&lt;br /&gt;Que el contenido dinámico se construya usando Javascript. Usando técnicas AJAX, se puede hacer una solicitud a cierto URL, con los parámetros que se requieran. En ese URL, un servidor procesa la solicitud, usando el framework y lenguaje de programación que sea, y devuelve una respuesta JSON. Con la respuesta, se construye la vista de la respuesta.&lt;br /&gt;&lt;br /&gt;Pensando sobre eso, noto que en el modelo cliente-servidor del HTML, se obliga a que el navegador reemplace &lt;i&gt;completamente &lt;/i&gt;el contenido de la página con la respuesta. Otra vez esa palabrita.&lt;br /&gt;&lt;br /&gt;Quizás sería interesante extender la especificación HTML para admitir reemplazos parciales. AJAX es el testimonio de que eso se necesita. Flash también lo implementa (llamándolo &lt;i&gt;carga dinámica&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Por el momento, la manera de hacer eso es con ayuda de Javascript (y alguna biblioteca como jQuery).&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;MVC&lt;/span&gt;&lt;br /&gt;Un patrón de muy difundido en los frameworks actuales es MVC (modelo-vista-controlador).&lt;br /&gt;&lt;br /&gt;Básicamente, se piensan las soluciones en términos de tres tipos de componentes: controladores, modelos y vistas.&lt;br /&gt;&lt;br /&gt;Un controlador recibe la solicitud, determina qué hacer, utilizando los modelos necesarios y pasa los resultados a una vista.&lt;br /&gt;&lt;br /&gt;Algunos dicen que la idea principal es que los diseñadores no se vean obligados a programar ni los programadores a diseñar. Pero, como nadie lo ha logrado (para hacer cualquier template se combina diseño con programación), pienso que se trata más de una cuestión de orden.&lt;br /&gt;&lt;br /&gt;Si se usa Javascript para carga dinámica, lo que ocurre es que lo que devuelven las vistas puede ser usado no sólo para reemplazos totales, sino también para reemplazos parciales.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;¿Por qué no se hace?&lt;/span&gt;&lt;br /&gt;Eso mismo me pregunto.&lt;br /&gt;&lt;br /&gt;He ido desarrollando estas ideas luego de observar como la comunidad Drupal está rehaciendo los módulos que funcionaban bien en Drupal 6 para que funcionen en Drupal 7. Es un riesgo. Se habla que algunos proyectos, como Perl, han perdido comunidad por hacer maniobras como esa.&lt;br /&gt;&lt;br /&gt;Ya se ha iniciado la carrera hacia Drupal 8... llegado el momento, ¿volverán a reescribir los módulos?... ¿y así, sucesivamente?&lt;br /&gt;&lt;br /&gt;Me parece que debe haber un camino mejor.&lt;br /&gt;&lt;br /&gt;¿Qué le parece?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-581282005453046768?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/581282005453046768/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/10/html-javascript-para-usar-cualquier.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/581282005453046768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/581282005453046768'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/10/html-javascript-para-usar-cualquier.html' title='HTML + Javascript para usar cualquier framework'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-8788413182317206676</id><published>2011-10-04T16:12:00.002-05:00</published><updated>2011-10-04T16:17:22.859-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='xampp'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><title type='text'>Solucionar puerto 80 ocupado luego de Webmatrix</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-YoQvafbtfsc/TJRBQ9wcVvI/AAAAAAAABNU/OgvJYz_5BEs/s1600/windows7_01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-YoQvafbtfsc/TJRBQ9wcVvI/AAAAAAAABNU/OgvJYz_5BEs/s200/windows7_01.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Resolver esto me ha tomado un tiempo. Espero le resulte de ayuda a alguien.&lt;br /&gt;&lt;br /&gt;Luego lo desinstalar Webmatrix (La versión 1.0 me parece, en Windows 7), encontré que XAMPP no podía usar el puerto 80 como antes.&lt;br /&gt;&lt;br /&gt;Con la idea de averiguar qué proceso lo ocupa, ejecuto en la consola de comandos, como administrador:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;netstat -anb&lt;/pre&gt;&lt;br /&gt;pero aparece que no hay información disponible sobre el proceso que ocupa el puerto 80.&lt;br /&gt;&lt;br /&gt;Usando la utilidad tcpview (de Sysinternals), veo que el proceso es el mismo System, con PID 4.&lt;br /&gt;&lt;br /&gt;Hago &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;telnet localhost 80&lt;/span&gt; y veo que quién está atendiendo es&amp;nbsp;&lt;b&gt;Microsoft-HTTPAPI/2.0&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Reviso en el Panel de Control, Herramientas Administrativas, Servicios, y desactivo &lt;b&gt;"Servicio Agente remoto para Microsoft Web Deploy 2.0."&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Eso era. Al parecer un issue de Webmatrix. Ahora XAMPP ya puede iniciar en el puerto 80.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/1430141/port-80-is-being-used-by-system-pid-4-what-is-that"&gt;Port 80 is being used by SYSTEM (PID 4), what is that?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-8788413182317206676?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/8788413182317206676/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/10/solucionar-puerto-80-ocupado-luego-de.html#comment-form' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8788413182317206676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8788413182317206676'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/10/solucionar-puerto-80-ocupado-luego-de.html' title='Solucionar puerto 80 ocupado luego de Webmatrix'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-YoQvafbtfsc/TJRBQ9wcVvI/AAAAAAAABNU/OgvJYz_5BEs/s72-c/windows7_01.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7685878947504574181</id><published>2011-09-22T12:49:00.002-05:00</published><updated>2011-09-22T12:56:51.804-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>Comprobar un elemento con jQuery</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1HqO8qW939Q/TJPfxG0QArI/AAAAAAAABNM/gcxnjPQOroM/s1600/jquery-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-1HqO8qW939Q/TJPfxG0QArI/AAAAAAAABNM/gcxnjPQOroM/s1600/jquery-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Para comprobar si existe un elemento, es útil comprobar su propiedad length:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;if ($('selector_del_elemento').length) {&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ejemplos con selectores:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;$('#section-1')&lt;/li&gt;&lt;li&gt;$('.sections a.active')&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jqueryfordesigners.com/element-exists/"&gt;How to tell if an element exists&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7685878947504574181?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7685878947504574181/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/09/comprobar-un-elemento-con-jquery.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7685878947504574181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7685878947504574181'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/09/comprobar-un-elemento-con-jquery.html' title='Comprobar un elemento con jQuery'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1HqO8qW939Q/TJPfxG0QArI/AAAAAAAABNM/gcxnjPQOroM/s72-c/jquery-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5182507669458066021</id><published>2011-09-19T15:28:00.000-05:00</published><updated>2011-09-21T15:13:58.995-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seo'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>SEO</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mT6lJasnOJI/TnefYLM9YgI/AAAAAAAABog/CVg_sE02cIM/s1600/googlebot.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mT6lJasnOJI/TnefYLM9YgI/AAAAAAAABog/CVg_sE02cIM/s1600/googlebot.png" /&gt;&lt;/a&gt;&lt;/div&gt;SEO es como se denomina al trabajo de optimizar páginas web para facilitar su procesamiento por los buscadores (el término proviene de las siglas de &lt;i&gt;Search Engine Optimization&lt;/i&gt;: Optimización para Máquinas de Búsqueda).&lt;br /&gt;&lt;br /&gt;He estado leyendo sobre SEO durante 3 días, así que ya soy un experto.&lt;br /&gt;&lt;br /&gt;;-) Claro que es una broma. Así conociera toda la teoría, un experto, prácticamente por definición, es aquel que ha experimentado durante algún tiempo, y ha obtenido ese conocimiento que da la práctica (y que suele corregir a la teoría).&lt;br /&gt;&lt;blockquote style="text-align: justify;"&gt;&lt;i&gt;En el caso particular de SEO, el tiempo parece ser un factor casi inevitable. Un cambio SEO podría tardar al menos dos semanas en verse reflejado. Y una campaña SEO al menos 3 meses.&lt;/i&gt;&lt;/blockquote&gt;No, no soy un experto en SEO, pero me gustaría compartir algunas de las cosas que he encontrado, y también algunas reflexiones. Espero sea indulgente con algún error que llegara a notar, y agradezco de antemano los comentarios en buena onda.&lt;br /&gt;&lt;blockquote style="text-align: justify;"&gt;&lt;i&gt;Me parece que &lt;b&gt;Optimización para Motores de Búsqueda&lt;/b&gt; no deja muy claro qué es lo que optimiza.&amp;nbsp;¿La página o su posicionamiento?&amp;nbsp;Aquí manejo la definición de SEO como veo que lo hace Google. Como la &lt;b&gt;optimización de la página &lt;/b&gt;para &lt;b&gt;mejorar su visibilidad &lt;u&gt;para&lt;/u&gt;&lt;/b&gt; los motores de búsqueda.&lt;br /&gt;Sin embargo, también es frecuente encontrar que se piense en SEO como la &lt;b&gt;mejora de la posición&lt;/b&gt; de un sitio web en los resultados de búsqueda. Es decir, &lt;b&gt;mejorar su visibilidad &amp;nbsp;&lt;u&gt;en&lt;/u&gt;&lt;/b&gt; la lista de resultados de los motores de búsqueda.&lt;br /&gt;Como la posición de una página web suele estar determinada por el número y la calidad de los enlaces que le apuntan desde otras páginas, mejorar eso es toda una campaña. Involucra inscribirse en directorios, ser recomendado por páginas afines, aparecer en blogs, participar en foros, redes sociales, quizás algo de publicidad en otros medios, el boca a boca, etc.&lt;br /&gt;Que la página pueda ser eficientemente indexada por un robot también ayuda, y es en ese sentido que uso el término SEO.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;SEO es una de las muchas herramientas que se usan en la campaña para mejorar la posición. Me parece que es más claro así, que llamar SEO a las dos cosas y dar pie a confusiones.&lt;/i&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;El problema y las soluciones&lt;/span&gt;&lt;br /&gt;Me parece que para entender lo que se hace en SEO hay que considerar cómo encontramos una página web.&lt;br /&gt;&lt;br /&gt;En el principio, como ahora, fueron las páginas, y la necesidad de encontrar las páginas que contuvieran la información que queríamos. Para ayudar en eso, aparecieron directorios, como Yahoo, con enlaces que eran mantenidos manualmente. Quienes publicaban algo en la web, se inscribían al directorio y su página era enlazada bajo cierta categoría. Un buscador de texto ayudaba a localizar algún enlace en particular.&lt;br /&gt;&lt;br /&gt;Luego, se automatizó el proceso, como lo hace Google, usando programas robots (llamados &lt;i&gt;spiders&lt;/i&gt;) que navegan por la red, siguiendo enlaces y recomendaciones. De esa navegación de robots, se extrae información que permite construir listas de enlaces según las palabras clave que proporcionemos para la búsqueda.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;La solución y el problema&lt;/span&gt;&lt;br /&gt;Estos robots tienen capacidades limitadas de exploración, en comparación con los humanos. Pueden leer el texto simple contenido en los archivos HTML, pero no el que estuviera contenido en una imagen o fotografía. No pueden reconocer el significado de una forma. Aunque pueden reconocer las palabras no pueden reconocer lo que significan. Ni el mensaje contenido en un texto, o una foto, o un video. Aún no tienen esa capacidad.&lt;br /&gt;&lt;br /&gt;A pesar de eso, son muy útiles para buscar entre las páginas de la red. Es más, tener un puesto relevante en el índice de los buscadores se ha vuelto tan importante como para que la gente se vea obligada a modificar la forma en que hace las páginas web, de modo que los robot no encuentren demasiados obstáculos al navegar por ellas.&lt;br /&gt;&lt;br /&gt;Como los robots no pueden entrar a cierto tipo de medios, los humanos crean contenido textual alterno que los robots puedan ver e indexar.&amp;nbsp;La labor del SEO es entender cómo hacerlo.&lt;br /&gt;&lt;br /&gt;Ojalá quede un poco más claro que el SEO existe debido a las limitaciones de los robots para entender el contenido.&amp;nbsp;La optimización de la que se habla es para ellos, no para los humanos.&lt;br /&gt;&lt;br /&gt;Me parece que es importante tener presente esta situación para ver con más claridad las opciones disponibles.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;El texto alterno&lt;/span&gt;&lt;br /&gt;Quizás lo ideal sería que los robots de los motores de búsqueda pudieran entender el contenido del mismo modo que los humanos. Pero por el momento, sólo pueden reconocer texto simple así que, si tenemos contenido que no sea texto simple, hay que hacerles una versión textual para ellos.&lt;br /&gt;&lt;br /&gt;Pero la capacidad de Internet para mostrar contenido multimedia ha ido aumentando, y probablemente continuará haciéndolo. Así que hay una porción cada vez mayor de la web a la que los robots no pueden acceder y que sería completamente invisible para los buscadores si no fuera porque introducimos manualmente contenido textual alterno.&lt;br /&gt;&lt;br /&gt;Por otro lado, el tener contenido textual alterno puede ser útil no solo para los robots con capacidades limitadas, sino para los humanos con capacidades limitadas que accedan a las páginas.&lt;br /&gt;&lt;br /&gt;Sin embargo, el tener contenido duplicado en diferentes versiones no parece muy eficiente. Sería mejor encontrar algún modo de presentar convenientemente las páginas según quién lo solicite. Multimedia para quién lo pueda apreciar, texto para quién solo pueda o quiera texto, etc. Pero todo a partir de la misma fuente.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;El factor humano&lt;/span&gt;&lt;br /&gt;Parece que, al menos por el momento, es un problema muy difícil aumentar las capacidades de los robots, porque se ha optado por la alternativa de usar a los humanos para eso. Por ejemplo, cuando un humano califica positivamente cierta información (haciendo click en "&lt;i&gt;Me gusta&lt;/i&gt;" o "&lt;i&gt;+1&lt;/i&gt;"), contribuye a hacerla más relevante para los buscadores.&lt;br /&gt;&lt;br /&gt;Un solo individuo podría equivocarse, o manipular su voto, pero el conjunto de individuos muestra un comportamiento colectivo relevante que puede resultar de ayuda a la hora de buscamos algo.&lt;br /&gt;&lt;br /&gt;Sin embargo, quizás nuestra inteligencia colectiva tenga ciertas preferencias y hayan espacios en la red que no se cataloguen tan bien como nuestras búsquedas quisiera.&lt;br /&gt;&lt;br /&gt;Tal vez cuando haya robots que puedan entender más, se encarguen ellos de hacer las calificaciones positivas.&lt;br /&gt;&lt;br /&gt;Mientras tanto, hacemos SEO.&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_9364855" style="text-align: center; width: 512px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/akobashikawa/seo-9364855" target="_blank" title="SEO"&gt;SEO&lt;/a&gt;&lt;/strong&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9364855" width="425"&gt;&lt;/iframe&gt; &lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;&lt;a href="http://www.slideshare.net/" target="_blank"&gt;con la ayuda de SlideShare&lt;/a&gt; por&amp;nbsp;&lt;a href="http://www.slideshare.net/akobashikawa" target="_blank"&gt;Antonio Kobashikawa&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Herramientas&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Spider Simulator&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.feedthebot.com/tools/spider/index.php"&gt;http://www.feedthebot.com/tools/spider/index.php&lt;/a&gt;&lt;br /&gt;Permite examinar los resultados de una página del mismo modo que lo haría un spider. Es genérico; a diferencia del spider de Google, no soporta flash.&lt;/li&gt;&lt;li&gt;&lt;b&gt;View a Web Page as 'Googlebot'&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.smart-it-consulting.com/internet/google/googlebot-spoofer/index.htm"&gt;http://www.smart-it-consulting.com/internet/google/googlebot-spoofer/index.htm&lt;/a&gt;&lt;br /&gt;Simula Googlebot y otros crawlers&lt;/li&gt;&lt;li&gt;&lt;b&gt;filetype:flash&lt;/b&gt;&lt;br /&gt;Una forma de demostrar que Google puede explorar dentro del texto de un swf (sí, si puede hacerlo) es buscar algo como:filetype:swf "futbol"&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Mejorando la indexacion de Flash (10/3/2009)&lt;/b&gt;&lt;br /&gt;&lt;a href="http://googlewebmaster-es.blogspot.com/2009/03/mejorando-la-indexacion-de-flash.html"&gt;http://googlewebmaster-es.blogspot.com/2009/03/mejorando-la-indexacion-de-flash.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Creating Google-friendly sites: Flash and other rich media files (7/23/2011)&lt;/b&gt;&lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=72746"&gt;http://www.google.com/support/webmasters/bin/answer.py?answer=72746&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Google - Guía SEO para Principiantes&lt;/b&gt;&lt;a href="http://www.google.es/webmasters/docs/guia_optimizacion_motores_busqueda.pdf"&gt;http://www.google.es/webmasters/docs/guia_optimizacion_motores_busqueda.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Wikipedia:&amp;nbsp;Search engine optimization&lt;/b&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Search_engine_optimization"&gt;http://en.wikipedia.org/wiki/Search_engine_optimization&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5182507669458066021?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5182507669458066021/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/09/seo.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5182507669458066021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5182507669458066021'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/09/seo.html' title='SEO'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mT6lJasnOJI/TnefYLM9YgI/AAAAAAAABog/CVg_sE02cIM/s72-c/googlebot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2046420329784018102</id><published>2011-07-18T14:24:00.007-05:00</published><updated>2011-07-19T12:38:30.855-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><title type='text'>Liberando la V, otra forma de usar un framework MVC</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UcP01Kq0lfI/TiSIJ7jmV1I/AAAAAAAABXk/ACnSY0H_zz8/s1600/free-v.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-UcP01Kq0lfI/TiSIJ7jmV1I/AAAAAAAABXk/ACnSY0H_zz8/s1600/free-v.png" /&gt;&lt;/a&gt;&lt;/div&gt;En el esquema MVC, se tienen &lt;i&gt;modelos &lt;/i&gt;que proveen datos, y&amp;nbsp;&lt;i&gt;controladores &lt;/i&gt;que toman los datos y los procesan de algún modo antes de enviar el resultado a la &lt;i&gt;vista&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;En web, los framework MVC tratan de seguir este esquema para organizar el trabajo. En teoría, parte del equipo se puede enfocar en los modelos, otro en los controladores y otro en las vistas.&lt;br /&gt;&lt;br /&gt;Al margen de si en la práctica realmente se cumple esto, es notable un problema: los modelos, vistas y controladores desarrollados determinan finalmente un API no estándar que termina "enjaulando" el producto final. Si decide actualizar el framework a la siguiente versión, encontrará que puede acarrear para el site un trabajo similar a volverlo a hacer. Aún más difícil es pasar un site de un framework a otro.&lt;br /&gt;&lt;br /&gt;Esto genera algunos vicios. Si otro framework implementa cierta característica ventajosa, no lo podemos usar; tenemos que esperar hasta que algo similar sea implementado en el que usamos. Esa característica debe ser expresada &lt;b&gt;otra vez&lt;/b&gt;, en los términos de nuestro framework.&lt;br /&gt;&lt;br /&gt;En mi opinión, esto ocurre porque la página web ha sido forzada a encajar en el esquema MVC sobrescribiendo sus características estándar por otras propietarias, definidas por su sistema de templates particular.&lt;br /&gt;&lt;br /&gt;Sí, aunque el framework sea open source, en este caso se está comportando como un ente propietario. Y eso es lo que provoca esta limitación de libertad.&lt;br /&gt;&lt;br /&gt;Para tener más libertad, libere la vista. Puede desarrollar su sitio web de modo que las vistas sean HTML estándar y las partes dinámicas carguen con javascript (AJAX) los datos obtenidos de invocar algún framework.&lt;br /&gt;&lt;br /&gt;Por ejemplo. Si uso &lt;b&gt;Drupal &lt;/b&gt;como framework, puedo tener un subdirectorio &lt;b&gt;drupal &lt;/b&gt;dentro de mi site, e invocar con javascript a algo como &lt;b&gt;drupal/action.json&lt;/b&gt;, cuyo resultado reflejo en la página.&lt;br /&gt;&lt;br /&gt;No hay problema con las páginas del site mientras no cambie el modo de invocar la accion. Si luego cambio la versión de drupal, no seria necesario cambiar las vistas.&lt;br /&gt;&lt;br /&gt;Si, en lugar de usar &lt;b&gt;drupal &lt;/b&gt;como nombre del subdirectorio, hubiera usado algo como&amp;nbsp;&lt;b&gt;framework&lt;/b&gt;, y colocara dentro acciones que se invocaran del mismo modo, entonces, podría usar cualquier framework, con tal que siguiera el protocolo esperado por las vistas.&lt;br /&gt;&lt;br /&gt;Esta forma de trabajar puede permitir funcionar un sitio dinámico que use muchos frameworks diferentes en simultaneo. Uno para el login, otro para los listados, otro para comunicaciones, etc. El que mejor haga lo que queremos. También facilita la actualización de los frameworks a versiones superiores.&lt;br /&gt;&lt;br /&gt;Usar javascript para esto me parece un camino relativamente asequible en este momento. Pero si alguien no desea usar javascript para eso, podría usar un framework unobstrusivo (que respete la integridad de las páginas), como &lt;b&gt;&lt;a href="http://sourceforge.net/projects/uphp/"&gt;uphp&lt;/a&gt;, &lt;/b&gt;para hacer el trabajo de reemplazo. uphp usa &lt;b&gt;querypath &lt;/b&gt;para ubicar un elemento en la página (al estilo &lt;b&gt;jquery&lt;/b&gt;, pero con &lt;b&gt;php)&lt;/b&gt;, y reemplazarlo por algún resultado; todo eso en el lado del servidor.&lt;br /&gt;&lt;br /&gt;En este otro modo, no son las vistas las que invocan las acciones, sino los controladores que se disponen en el framework unobstrusivo (o uframework, para abreviar). El uframework podria invocar a otros frameworks para hacer los reemplazos de los resultados en las ubicaciones pertinentes en la vista. Igual, se podría usar varios frameworks a la vez.&lt;br /&gt;&lt;br /&gt;La idea principal es que la vista salga de la jaula del framework, se respete su integridad, tal como es, y sea independiente de los motores que se usen para generar el contenido dinámico.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2046420329784018102?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2046420329784018102/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/07/liberando-la-v-otra-forma-de-usar-un.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2046420329784018102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2046420329784018102'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/07/liberando-la-v-otra-forma-de-usar-un.html' title='Liberando la V, otra forma de usar un framework MVC'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-UcP01Kq0lfI/TiSIJ7jmV1I/AAAAAAAABXk/ACnSY0H_zz8/s72-c/free-v.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3055077525880800987</id><published>2011-07-08T15:39:00.004-05:00</published><updated>2011-07-11T18:28:40.570-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Generación modular de HTML</title><content type='html'>Actualmente, cuando desarrolla un sitio usando cierto framework, no lo puede modificar con otro. Si está metido en esto, puede parecer obvio y hasta natural. Pero, si lo vemos en perspectiva, es algo así como una limitación por diseño. Algo que se podría mejorar.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Sites estáticos y dinámicos&lt;/span&gt;&lt;br /&gt;Aunque el objetivo final es enviar html al navegador, en el desarrollo de sites dinamicos el paso intermedio es crear un conjunto de archivos que generen el html que se desea.&lt;br /&gt;&lt;br /&gt;Cuando se trata de sites estáticos es más simple. Uno coloca los archivos en el directorio web y el servidor web los envía al navegador tal cual. Esos archivos son html, css, javascript, o imágenes que el desarrollador puede modificar con la libertad de elegir entre muchas herramientas para eso.&lt;br /&gt;&lt;br /&gt;Cuando se trata de sites dinámicos las cosas se suelen complicar. En general, primero se plasma el diseño en un site estático, que luego es desmantelado para ver el modo de generarlo. Finalmente, se obtiene el site dinámico, que actúa como un &lt;b&gt;generador total&lt;/b&gt; del html que se desea.&lt;br /&gt;&lt;br /&gt;Ese suele se el enfoque más usado. Practicamente siempre que use C, Java, PHP, Ruby, Python, o lo que sea, lo que construye es siempre un &lt;b&gt;generador total&lt;/b&gt; de html.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Frameworks exclusivos&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZFfl-lfhfaA/Tht63DV_zMI/AAAAAAAABXc/ntK3Ds6R2pU/s1600/generador-total-html.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="168" src="http://1.bp.blogspot.com/-ZFfl-lfhfaA/Tht63DV_zMI/AAAAAAAABXc/ntK3Ds6R2pU/s200/generador-total-html.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;El enfoque de la generación total tiene el problema de tender a soluciones monolíticas, con sus vicios asociados.&lt;br /&gt;&lt;br /&gt;Si quiere modificar el site, tiene que modificar el generador, y tiene que entender el framework-que-todo-lo-hace.&lt;br /&gt;&lt;br /&gt;Cuando un framework mejora, esa nueva versión no le sirve para el site que hizo con la versión antigua y tendría que reescribir el site bajo los nuevos términos.&lt;br /&gt;&lt;br /&gt;Si otro framework implementa una característica que le gustaría, tendrá que esperar hasta que sea implementada, otra vez, en los términos del framework que usted usa.&lt;br /&gt;&lt;br /&gt;Un montón de trabajo repetido.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Frameworks inclusivos&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vehqqtlfaAc/Tht6-C29-7I/AAAAAAAABXg/Ql6oLmYpE_4/s1600/generacion-parcial-html.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-vehqqtlfaAc/Tht6-C29-7I/AAAAAAAABXg/Ql6oLmYpE_4/s200/generacion-parcial-html.png" width="198" /&gt;&lt;/a&gt;&lt;/div&gt;Una alternativa podría ser hacer&amp;nbsp;&lt;b&gt;generadores modulares&lt;/b&gt;. En lugar de generar el html de toda la página, un generador modular sólo produce el html de cierta región específica.&lt;br /&gt;&lt;br /&gt;Para indicar dónde colocar el html dinámico, habrían algunas alternativas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Que la página use javascript, obtenga el resultado y lo coloque.&lt;/li&gt;&lt;li&gt;Que la página use un tag especial que se reemplace por el contenido dinámico.&lt;/li&gt;&lt;li&gt;Que el servidor ubique los lugares dónde hacer el reemplazo y los haga.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;La primera alternativa es relativamente asequible con lo que ya tenemos. Para las otras, habría que hacer un framework que se encargue de hacer los reemplazos adecuados (por ejemplo uphp).&lt;br /&gt;&lt;br /&gt;Ya mismo podríamos empezar a desarrollar sites de ese modo. Una ventaja grande de usar generadores modulares, es que no importa en que lenguaje de programación se hacen, ni que framework usan, ni que versión del framework. Simplemente se usan. Podría usar generadores modulares escritos en C, Java, PHP, Python y Ruby... todos juntos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3055077525880800987?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3055077525880800987/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/07/generacion-modular-de-html.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3055077525880800987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3055077525880800987'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/07/generacion-modular-de-html.html' title='Generación modular de HTML'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZFfl-lfhfaA/Tht63DV_zMI/AAAAAAAABXc/ntK3Ds6R2pU/s72-c/generador-total-html.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3781048492791362792</id><published>2011-06-28T15:00:00.002-05:00</published><updated>2011-06-28T15:05:09.393-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='uphp'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Liberando los sitios dinámicos</title><content type='html'>Imagine que le hicieran una página web y, un tiempo después, usted quiere modificar el documento HTML.&lt;br /&gt;&lt;br /&gt;Imagine que puede abrirla en cualquier editor de texto, modificarla y volverla a grabar. Sin importar si se hizo en Dreamweaver, Geany, Notepad, o cualquier otro. Qué libertad.&lt;br /&gt;&lt;br /&gt;Claro que no sólo lo podemos imaginar, de hecho podemos hacerlo.&lt;br /&gt;&lt;br /&gt;Entonces, ¿por qué hemos permitido que esta libertad y conveniencia sea recortada por los frameworks? Porque eso es lo que ocurre.&lt;br /&gt;&lt;br /&gt;Cuando hacemos un sitio dinámico, digamos en CakePHP, y, un tiempo después, usted quiere modificarlo, tiene que usar no sólo CakePHP, sino la misma versión de CakePHP. Del mismo modo si hubiera usado Zend, CodeIgniter o Drupal.&lt;br /&gt;&lt;br /&gt;Es como si le dijeran que para abrir un HTML tiene que usar Notepad 4 y no otro, porque no es compatible. Que si quiere el mismo site para Notepad 5 hay que volverlo a hacer.&lt;br /&gt;&lt;br /&gt;Sí, un site dinámico es más complejo que un documento HTML, pero la razón es similar. Es importante que el producto sea independiente de la herramienta usada para fabricarla. No sólo porque es un gran ahorro de esfuerzo y duplicidad. Sino también para que tengamos la libertad de elegir cualquier herramienta que queramos.&lt;br /&gt;&lt;br /&gt;En el desarrollo web han aparecido islas, o silos. Al comienzo fue entre lenguajes, como ASP, JSP, PHP, Python, Ruby. Luego entre frameworks dentro de esos lenguajes. Y entre versiones de un mismo framework.&lt;br /&gt;&lt;br /&gt;Muchos desarrolladores se amarran a cierta plataforma porque sus productos no pueden ser modificados con otra. Expresar un sitio dinámico en otro framework (o versión de framework) puede ser tanto trabajo como hacerlo de nuevo.&lt;br /&gt;&lt;br /&gt;Después de todos los discursos que nos dan sobre la reinvención de la rueda, KISS (&lt;i&gt;Keep It Simple, Stupid&lt;/i&gt;: Mantenlo Simple, Estúpido), DRY (&lt;i&gt;Don't Repeat Yourself&lt;/i&gt;: No te Repitas), etc&amp;nbsp;¿no le parece poco razonable?&lt;br /&gt;&lt;br /&gt;Hay razones por las que se prefirió que los protocolos web usaran texto simple. Para que cualquiera pudiera entrar a manejarlos. Quizás debemos recordarlo más seguido.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Imagine que le hicieran un sitio dinámico y, un tiempo después, usted quiere modificar el site.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Imagine que puede usar cualquier framework, modificarlo y guardarlo. Sin importar si se hizo en Drupal 6 o Drupal 7. O si se hizo en Zend o CodeIgniter. Incluso sin importar si se hizo en PHP, Ruby, Python o ASP. Qué libertad.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Claro que sólo lo podemos imaginar, pero podemos hacerlo.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3781048492791362792?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3781048492791362792/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/liberando-los-sitios-dinamicos.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3781048492791362792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3781048492791362792'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/liberando-los-sitios-dinamicos.html' title='Liberando los sitios dinámicos'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5026609673176937362</id><published>2011-06-19T01:23:00.000-05:00</published><updated>2011-06-19T01:23:15.895-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proyectos'/><title type='text'>Proyectos como sistemas biológicos</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sTQK-WQC0Ho/Tf2Vtw-p7oI/AAAAAAAABWk/FH1rCZa-_MM/s1600/new-born-plant.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://2.bp.blogspot.com/-sTQK-WQC0Ho/Tf2Vtw-p7oI/AAAAAAAABWk/FH1rCZa-_MM/s200/new-born-plant.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Los proyectos de software no salen tan bien como se quisiera.&lt;br /&gt;&lt;br /&gt;Un programador solitario, con talento, puede hacer código muy bonito, hasta cierto punto.&lt;br /&gt;Cuando el proyecto llega a cierto tamaño o complejidad, es cada vez más difícil continuar.&lt;br /&gt;&lt;br /&gt;Varios programadores, con talento, formando un equipo, pueden hacer algo muy bueno, muy por encima de lo que serían capaces con sus talentos individuales, hasta cierto punto.&lt;br /&gt;Cuando el proyecto llega a cierto tamaño o complejidad, es cada vez más difícil continuar.&lt;br /&gt;&lt;br /&gt;Los proyectos exitosos son aquellos que alcanzan ese punto límite no tan lejos de la meta que se proponían.&lt;br /&gt;&lt;br /&gt;Pero la mayoría lo alcanza mucho antes.&lt;br /&gt;&lt;br /&gt;Tratando de explicarse esto, hay quienes culpan a la gente. Pero sucede incluso en equipos compuestos de gente talentosa.&lt;br /&gt;&lt;br /&gt;Parece que la respuesta es la organización.&lt;br /&gt;&lt;br /&gt;La forma en cómo se organiza a las personas, las reglas o normas que siguen, de algún modo, van tejiendo una trama que, eventualmente, ahoga el proyecto.&lt;br /&gt;&lt;br /&gt;Quizás haya un modo de lograr una organización sostenible.&lt;br /&gt;&lt;br /&gt;Por lo pronto, se ha visto algunas cosas que funcionan mejor que otras.&lt;br /&gt;&lt;br /&gt;Algo visible es más fácil de corregir. Algo simple es más fácil de ver. Algo modular es más simple de hacer. Algo descentralizado es más modular. Algo libre es más descentralizado. Algo que podemos corregir es más libre.&lt;br /&gt;&lt;br /&gt;Cada ser vivo puede considerarse un tipo de sistema. Cada ser vivo tiene una vida, corta o larga, con un patrón de nacimiento, desarrollo, apogeo y remisión. Quizás sea propio de cada sistema. Quizás cada sistema está condenado por la complejidad que es capaz de alcanzar. El apogeo sería el aviso de la remisión inminente. Y la remisión el&amp;nbsp;preámbulo de un nuevo nacimiento.&lt;br /&gt;&lt;br /&gt;Quizás debamos dejar de comportarnos como si&amp;nbsp;pudiéramos&amp;nbsp;diseñar proyectos eternos, que muchas veces conducen a intentos efímeros, y diseñar proyectos con ciclos de ascenso y remisión, que inspiren y exhalen, que corran y duerman. Y todo eso, mientras evolucionan.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5026609673176937362?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5026609673176937362/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/proyectos-como-sistemas-biologicos.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5026609673176937362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5026609673176937362'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/proyectos-como-sistemas-biologicos.html' title='Proyectos como sistemas biológicos'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sTQK-WQC0Ho/Tf2Vtw-p7oI/AAAAAAAABWk/FH1rCZa-_MM/s72-c/new-born-plant.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6596473492329035347</id><published>2011-06-17T11:36:00.002-05:00</published><updated>2011-06-17T11:38:08.374-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu menú de aplicaciones con iconos</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LD1XnA0zJ6g/TfuCYDUCc8I/AAAAAAAABWY/08Y2rlw1drY/s1600/application_menu_icons.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-LD1XnA0zJ6g/TfuCYDUCc8I/AAAAAAAABWY/08Y2rlw1drY/s200/application_menu_icons.png" width="158" /&gt;&lt;/a&gt;&lt;/div&gt;En &lt;b&gt;Ubuntu Natty Narwhal&lt;/b&gt;,&amp;nbsp;no me agrada mucho que &lt;b&gt;Unity&lt;/b&gt;, el nuevo sistema de escritorio de Ubuntu, requiera que uno descienda varios niveles para encontrar el menú de aplicaciones (&lt;i&gt;Ubuntu logo, More Apps, All Applications&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Así que he instalado &lt;b&gt;Cairo&lt;/b&gt;, que provee un docker similar al que se usa en Mac, o al que provee también&amp;nbsp;&lt;a href="http://rocketdock.com/"&gt;&lt;b&gt;RocketDock&lt;/b&gt;&lt;/a&gt;&amp;nbsp;en &lt;b&gt;Windows&lt;/b&gt;. Lo bueno de Cairo es que provee un acceso directo al menú de aplicaciones.&lt;br /&gt;&lt;br /&gt;Sin embargo, noto que el menú de aplicaciones no muestra los iconos sino sólo la etiqueta de cada opción.&lt;br /&gt;&lt;br /&gt;Encontré en&amp;nbsp;&lt;a href="http://tips4linux.com/toggle-the-ubuntu-system-menu-icons-to-visible/"&gt;tips4linux.com&lt;/a&gt;&amp;nbsp;una manera de solucionarlo. Ejecutar en la consola de comandos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gconftool-2 --type Boolean --set /desktop/gnome/interface/menus_have_icons True&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tips4linux.com/toggle-the-ubuntu-system-menu-icons-to-visible/"&gt;Toggle the Ubuntu System menu icons to Visible&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6596473492329035347?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6596473492329035347/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/ubuntu-menu-de-aplicaciones-con-iconos.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6596473492329035347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6596473492329035347'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/ubuntu-menu-de-aplicaciones-con-iconos.html' title='Ubuntu menú de aplicaciones con iconos'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-LD1XnA0zJ6g/TfuCYDUCc8I/AAAAAAAABWY/08Y2rlw1drY/s72-c/application_menu_icons.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-8705229472356420484</id><published>2011-06-16T01:12:00.000-05:00</published><updated>2011-06-16T01:12:23.674-05:00</updated><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='xampp'/><title type='text'>Resolviendo inicio MySQL con Xampp en Ubuntu</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KmhYf9ZalO4/TUwhyQVJXyI/AAAAAAAABQ8/GpJ-i1hu6wo/s1600/tux-100.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-KmhYf9ZalO4/TUwhyQVJXyI/AAAAAAAABQ8/GpJ-i1hu6wo/s1600/tux-100.png" /&gt;&lt;/a&gt;&lt;/div&gt;Instalé &lt;b&gt;Lampp&lt;/b&gt; (&lt;i&gt;Xampp para Linux&lt;/i&gt;, xampp-linux-1.7.4.tar.gz) en &lt;b&gt;Ubuntu&lt;/b&gt; (&lt;i&gt;Natty Narwhal&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;La ruta de instalación es &lt;b&gt;/opt/lampp&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para iniciar lampp:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo /opt/lampp/lampp start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Obtuve un mensaje de error, indicando que MySQL no podía iniciar.&lt;br /&gt;&lt;br /&gt;Parece que el problema tiene que ver con los derechos de escritura. La solución que me funcionó fue:javascript:void(0)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo -s&lt;br /&gt;cd /opt&lt;br /&gt;chmod -R 777 lampp&lt;br /&gt;chmod 755 lamp/etc/my.cnf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero le sea de ayuda. Quizás alguien encuentre una mejor solución.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-8705229472356420484?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/8705229472356420484/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/resolviendo-inicio-mysql-con-xampp-en.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8705229472356420484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8705229472356420484'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/resolviendo-inicio-mysql-con-xampp-en.html' title='Resolviendo inicio MySQL con Xampp en Ubuntu'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-KmhYf9ZalO4/TUwhyQVJXyI/AAAAAAAABQ8/GpJ-i1hu6wo/s72-c/tux-100.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-476710237893294671</id><published>2011-06-14T13:34:00.000-05:00</published><updated>2011-06-14T13:34:13.745-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Copia en Linux convirtiendo symlinks</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KmhYf9ZalO4/TUwhyQVJXyI/AAAAAAAABQ8/GpJ-i1hu6wo/s1600/tux-100.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-KmhYf9ZalO4/TUwhyQVJXyI/AAAAAAAABQ8/GpJ-i1hu6wo/s1600/tux-100.png" /&gt;&lt;/a&gt;&lt;/div&gt;En Linux, para copiar un directorio completo, se puede usar algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cp -a origen destino&lt;/pre&gt;&lt;br /&gt;Si origen tuviera symlinks (enlaces simbólicos), estos se copiarían tal cual.&lt;br /&gt;&lt;br /&gt;Si se desea que los symlinks se conviertan en los archivos a los cuales apuntan:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cp -aL origen destino&lt;/pre&gt;&lt;br /&gt;Esto parece que no esta muy documentado. Ojalá le sea de ayuda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-476710237893294671?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/476710237893294671/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/copia-en-linux-convirtiendo-symlinks.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/476710237893294671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/476710237893294671'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/copia-en-linux-convirtiendo-symlinks.html' title='Copia en Linux convirtiendo symlinks'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-KmhYf9ZalO4/TUwhyQVJXyI/AAAAAAAABQ8/GpJ-i1hu6wo/s72-c/tux-100.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5020972469948198391</id><published>2011-06-11T22:57:00.002-05:00</published><updated>2011-11-24T23:59:51.736-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Acceder a Nokia 3220 usando Gammu</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CkYp1y9wqIc/TfQ5MBfR_II/AAAAAAAABWU/wtcG_7xm2rA/s1600/nokia-3220b.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-CkYp1y9wqIc/TfQ5MBfR_II/AAAAAAAABWU/wtcG_7xm2rA/s200/nokia-3220b.jpg" width="158" /&gt;&lt;/a&gt;&lt;/div&gt;El Nokia 3220 es un teléfono celular que vengo usando varios años. Ahora, quizás se puede considerar un modelo antiguo, pero puede tomar fotos de 640x480 px que se ven bien.&lt;br /&gt;&lt;br /&gt;Para descargar las fotos, uso un cable tipo DKU5 que va del puerto serial del teléfono a un puerto USB de la computadora.&lt;br /&gt;&lt;br /&gt;En el lado de la computadora, con Windows, se puede usar el Nokia PC Suite. Me ha funcionado bien con Windows XP. Con Windows 7 parecía no conectar bien, así que lo que hice fue correr Windows XP en un vmware para correr allí el Nokia PC Suite.&lt;br /&gt;&lt;br /&gt;Muchas veces he tenido problemas para lograr la conexión. El teléfono suele decir 'Data enhancement not support', aún cuando finalmente la conexión se logre.&lt;br /&gt;&lt;br /&gt;Ahora que estoy usando Ubuntu Linux (Natty Narwhal), encontré que se puede usar Gammu/Wammu para acceder al celular.&lt;br /&gt;&lt;br /&gt;Instalé Wammu y lo probé. Tiene un wizard que permite identificar el celular conectado. Se logra hacer la conexión, pero no logré encontrar en la interfaz del programa el modo de descargar las fotos.&lt;br /&gt;&lt;br /&gt;Entonces encontré el artículo&amp;nbsp;&lt;a href="https://lists.ubuntu.com/archives/ubuntu-es/2006-June/016657.html"&gt;COMO: Archivos de Nokia 3220 ( u otro ) a Ubuntu&lt;/a&gt;&amp;nbsp;que me mostró el camino por la consola de comandos.&lt;br /&gt;&lt;br /&gt;Primero instale Gammu (yo pensaba que Wammu lo había instalado pero no era así):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install gammu&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Luego, verifico que en ~/.gammurc esté lo siguiente (generado previamente por el wizard de Wammu):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[gammu]&lt;br /&gt;port = /dev/ttyUSB0&lt;br /&gt;connection = dku5fbus&lt;br /&gt;name = Nokia 3220&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para comprobar la conexión, ejecuto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gammu --identify&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Obtengo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Device               : /dev/ttyUSB0&lt;br /&gt;Manufacturer         : Nokia&lt;br /&gt;Model                : 3220 (RH-49)&lt;br /&gt;Firmware             : 05.10 I (07-09-05)&lt;br /&gt;Hardware             : 6203&lt;br /&gt;...&lt;br /&gt;Old simlock          : TIM Peru (716 10)&lt;br /&gt;UEM                  : 400&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se puede obtener un listado de los archivos (en un formato tipo árbol):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gammu --getfilesystem&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O también un listado plano:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gammu --getfilesystem -flatall&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con el listado plano, veo que los archivos de las fotos están en &lt;code&gt;d:/predefgallery/predefphotos&lt;/code&gt;. Entonces, ejecuto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gammu --getfilefolder d:/predefgallery/predefphotos&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y logré descargar mis fotos.&lt;br /&gt;&lt;br /&gt;Para más ayuda sobre el comando gammu:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gammu --help&lt;br /&gt;gammu --help filesystem&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Al querer eliminar los archivos Image*.jpg, encontré que no funcionaba &lt;code&gt;gammu --deletefiles d:/predefgallery/predefphotos/Image*&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Entonces, ubicado en el directorio donde descargué las fotos, ejecuté este comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;for p in $(ls Image*); do echo $p; gammu --deletefiles d:/predefgallery/predefphotos/$p; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Quizás les sirva de ayuda.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://lists.ubuntu.com/archives/ubuntu-es/2006-June/016657.html"&gt;COMO: Archivos de Nokia 3220 ( u otro ) a Ubuntu&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5020972469948198391?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5020972469948198391/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/acceder-nokia-3220-usando-gammu.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5020972469948198391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5020972469948198391'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/acceder-nokia-3220-usando-gammu.html' title='Acceder a Nokia 3220 usando Gammu'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-CkYp1y9wqIc/TfQ5MBfR_II/AAAAAAAABWU/wtcG_7xm2rA/s72-c/nokia-3220b.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6447321974354303690</id><published>2011-06-07T11:51:00.002-05:00</published><updated>2011-06-07T11:55:00.648-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='virtuallización'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Acceder a un Server en Virtualbox desde el Host</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yEzZU-vUNME/TebOTGXljkI/AAAAAAAABVk/UAosUOEB_NA/s1600/Windows-7-Ubuntu-Linux.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-yEzZU-vUNME/TebOTGXljkI/AAAAAAAABVk/UAosUOEB_NA/s200/Windows-7-Ubuntu-Linux.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Virtualbox&lt;/b&gt; es una aplicación que permite instalar un sistema operativo dentro de otro. Por ejemplo, puedo instalar Ubuntu Linux dentro de Windows 7. En el caso que describo a continuación, está instalado &lt;b&gt;Windows XP&lt;/b&gt; dentro de &lt;b&gt;Ubuntu Linux&lt;/b&gt; (Natty Narwhal).&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Por qué&lt;/span&gt;&lt;br /&gt;Al requerir un entorno de desarrollo Drupal que sea portable, la solución que encontré fue usar &lt;b&gt;XamppLite portable&lt;/b&gt; (disponible para Windows) en un USB.&lt;br /&gt;&lt;br /&gt;Como trabajar directamente en el USB me parece muy lento, copio el directorio de xampplite al disco duro y trabajo allí. Luego, al final del día, sincronizo esa copia con el USB.&lt;br /&gt;&lt;br /&gt;Como todo el estado de la base de datos MySQL está en los archivos generados, al copiarlos todas las bases de datos, tablas y cambios se reflejan idénticamente.&lt;br /&gt;&lt;br /&gt;Al volver a trabajar en Linux, me interesó encontrar un modo de levantar el xampplite. Intenté con Wine y, aunque arranca el panel de control de xampp, no se puede iniciar el servidor apache. Entonces, lo hice con Virtualbox.&lt;br /&gt;&lt;br /&gt;Instalé Virtualbox 4.0.8 para Ubuntu y allí instalé Windows XP.&lt;br /&gt;&lt;br /&gt;De modo que, en la jerga de la virtualización, Ubuntu es el &lt;i&gt;&lt;b&gt;Host&lt;/b&gt;&lt;/i&gt; y Windows XP es el &lt;i&gt;&lt;b&gt;Guest&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Pude correr xampplite y funcionaba apache. Pero no encontraba el modo de acceder al servicio web del Guest desde el Host.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Usando VBoxManage&lt;/span&gt;&lt;br /&gt;No logré encontrar en la interfaz de Virtualbox un modo de configurar eso.&lt;br /&gt;&lt;br /&gt;Después de navegar un poco en Internet, encontré en Sitepoint el artículo&amp;nbsp;&lt;a href="http://blogs.sitepoint.com/build-your-own-dev-server-with-virtualbox/"&gt;Build Your Own Dev Server with VirtualBox&lt;/a&gt;. Allí, la solución consiste en editar a mano el archivo XML de la configuración de la máquina virtual.&lt;br /&gt;&lt;br /&gt;Si uno revisa ese archivo (VirtualBox.xml) puede encontrar la advertencia de no editarlo a mano. Así que indagué un poco más para ver si había otro modo y lo encontré en el artículo&amp;nbsp;&lt;a href="http://www.salixos.org/wiki/index.php/How_to_access_a_server_running_in_a_VirtualBox_guest"&gt;How to access a server running in a VirtualBox guest&lt;/a&gt;, que indica cómo hacer los cambios usando el comando VBoxManage.&lt;br /&gt;&lt;br /&gt;Primero hay que apagar la máquina virtual. Los cambios se harán efectivos al reiniciarla.&lt;br /&gt;&lt;br /&gt;Para listar las máquinas virtuales:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;VBoxManage list vms&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hay que establecer varios &lt;i&gt;&lt;b&gt;extradata&lt;/b&gt;&lt;/i&gt; en el Guest "Windows XP":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/HostPort" 8888&lt;br /&gt;VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/GuestPort" 80&lt;br /&gt;VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/Protocol" TCP&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para verificar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;VBoxManage getextradata "Windows XP" enumerate&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si hubiera que eliminar alguno, bastaría con darle un valor en blanco. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;VBoxManage setextradata "Windows XP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/apache/HostPort" 8888&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación inicié el Guest, y el servidor apache que contiene.&lt;br /&gt;&lt;br /&gt;En el Host pude acceder al servicio web entrando a:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;http://localhost:8888&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.sitepoint.com/build-your-own-dev-server-with-virtualbox/"&gt;Build Your Own Dev Server with VirtualBox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.salixos.org/wiki/index.php/How_to_access_a_server_running_in_a_VirtualBox_guest"&gt;How_to_access_a_server_running_in_a_VirtualBox_guest&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6447321974354303690?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6447321974354303690/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/acceder-un-server-en-virtualbox-desde.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6447321974354303690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6447321974354303690'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/acceder-un-server-en-virtualbox-desde.html' title='Acceder a un Server en Virtualbox desde el Host'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-yEzZU-vUNME/TebOTGXljkI/AAAAAAAABVk/UAosUOEB_NA/s72-c/Windows-7-Ubuntu-Linux.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2171950619665244320</id><published>2011-06-03T16:14:00.003-05:00</published><updated>2011-06-03T16:34:50.743-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='xampp'/><title type='text'>XAMPP en Ubuntu</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3YKFAHdviag/S1CjewJ-MVI/AAAAAAAAAMg/JTfeebYypaI/s1600/20-xampp-logo-trio.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="175" src="http://4.bp.blogspot.com/-3YKFAHdviag/S1CjewJ-MVI/AAAAAAAAAMg/JTfeebYypaI/s200/20-xampp-logo-trio.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;XAMPP empaqueta Apache, MySQL, PHP y otros programas que se suelen usar en programación web.&lt;br /&gt;&lt;br /&gt;Instalar y usar XAMPP para desarrollo me ha venido resultando una alternativa más práctica que buscar/instalar/configurar cada uno de sus componentes por separado.&lt;br /&gt;&lt;br /&gt;Para instalar XAMPP en Ubuntu se pueden seguir las instrucciones para el caso Linux, que aparecen en el sitio de ApacheFriends:&amp;nbsp;&lt;a href="http://www.apachefriends.org/en/xampp-linux.html"&gt;http://www.apachefriends.org/en/xampp-linux.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Básicamente, consiste en descargar el tar.gz de la&amp;nbsp;versión&amp;nbsp;que se desea y extraer el contenido a /opt.&lt;br /&gt;&lt;br /&gt;En mi caso, se trata de instalar XAMPP 1.7.1, que es la versión compatible con Drupal 6.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Descargo&amp;nbsp;xampp-linux-1.7.1.tar.gz (&lt;a href="http://sourceforge.net/projects/xampp/files/XAMPP%20Linux/1.7.1/"&gt;http://sourceforge.net/projects/xampp/files/XAMPP%20Linux/1.7.1/&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Abro una consola de comandos y cambio a usuario root:&lt;br /&gt;&lt;pre&gt;sudo -s&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Extraigo el contenido del tar.gz a /opt:&lt;br /&gt;&lt;pre&gt;tar -xvzf&amp;nbsp;xampp-linux-1.7.1.tar.gz&amp;nbsp;-C /opt&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Para iniciar xampp:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;/opt/lampp/lampp start&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Para detener xampp:&lt;br /&gt;&lt;pre&gt;/opt/lampp/lampp stop&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Para establecer contraseñas (que se recomienda por seguridad):&lt;br /&gt;&lt;pre&gt;/opt/lampp/lampp security&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Se puede observar que el comando es lampp. Ese era el nombre que ApacheFriends le había puesto. Sin embargo, es xampp para Linux.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Panel de Control&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Para tener un panel de control similar al que estaba disponible en Windows:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;En la consola de comandos:&lt;br /&gt;&lt;pre&gt;sudo gedit ~/.local/share/applications/xampp-control-panel.desktop&lt;/pre&gt;En este caso uso gedit, pero también se pudo haber invocado otro editor de texto, como nano o vi.&lt;/li&gt;&lt;li&gt;En el editor de texto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[Desktop Entry]&lt;br /&gt;Comment=Start and Stop XAMPP&lt;br /&gt;Name=XAMPP Control Panel&lt;br /&gt;Exec=gksudo python /opt/lampp/share/xampp-control-panel/xampp-control-panel.py&lt;br /&gt;Icon[en_CA]=/usr/share/icons/Humanity/devices/24/network-wired.svg&lt;br /&gt;Encoding=UTF-8&lt;br /&gt;Terminal=false&lt;br /&gt;Name[en_CA]=XAMPP Control Panel&lt;br /&gt;Comment[en_CA]=Start and Stop XAMPP&lt;br /&gt;Type=Application&lt;br /&gt;Icon=/usr/share/icons/Humanity/devices/24/network-wired.svg&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Después de eso, podrá encontrar una nueva opción en el menú: &lt;i&gt;Applications/Other/XAMPP Control Panel&lt;/i&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.apachefriends.org/en/xampp-linux.html"&gt;http://www.apachefriends.org/en/xampp-linux.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://freshtutorial.com/add-gui-xampp-control-panel-ubuntu/"&gt;How To: Add GUI xampp control panel on ubuntu&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2171950619665244320?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2171950619665244320/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/xampp-en-ubuntu.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2171950619665244320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2171950619665244320'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/xampp-en-ubuntu.html' title='XAMPP en Ubuntu'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3YKFAHdviag/S1CjewJ-MVI/AAAAAAAAAMg/JTfeebYypaI/s72-c/20-xampp-logo-trio.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4993352259232735750</id><published>2011-06-03T14:00:00.003-05:00</published><updated>2011-06-11T19:36:03.195-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>Moviendo Dropbox</title><content type='html'>Hace algún tiempo que vengo usando &lt;b&gt;Dropbox&lt;/b&gt;, el programa que facilita la sincronización de una carpeta en nuestro disco con otra en dropbox.com&lt;br /&gt;&lt;br /&gt;De ese modo, los archivos que tenga en el dropbox de la computadora de la casa se sincronizan con el de dropbox de Internet y luego con el dropbox de la computadora de la oficina. Es como la idea del USB, pero automático.&lt;br /&gt;&lt;br /&gt;Ahora que estoy empezando a trabajar con &lt;b&gt;Ubuntu Linux&lt;/b&gt;, noté que Dropbox ha cambiado el nombre de su directorio por default. Antes se llamaba "&lt;b&gt;My Dropbox"&lt;/b&gt; y había muchas quejas por eso en los foros. Ahora se llama simplemente &lt;b&gt;"Dropbox"&lt;/b&gt;. Es decir, que si elige que su directorio para dropbox esté en &lt;b&gt;/home/rulo&lt;/b&gt;, por ejemplo, entonces el directorio de dropbox será &amp;nbsp;&lt;b&gt;/home/rulo/Dropbox&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Como uso Linux al lado de &lt;b&gt;Windows&lt;/b&gt;, y el disco de Windows es visible desde Linux, me parece buena idea que el dropbox que instale en Linux apunte al mismo directorio que el que tengo instalado en Windows.&lt;br /&gt;&lt;br /&gt;Pero alli el directorio es "My Dropbox". Pensé que podría usarlo pero no, dropbox insiste en que el directorio se llame "Dropbox". Entonces, entré a Windows, fui a la configuración de dropbox e indiqué mover el directorio a una nueva ubicación. En micaso, elegí el directorio&amp;nbsp;&lt;b&gt;C:\Users\compaq&lt;/b&gt;, de modo que el nuevo directorio de dropbox es &lt;b&gt;C:\Users\compaq\Dropbox&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7rTQZnYcOJw/Tekurx-VnWI/AAAAAAAABVo/9N5LE_66vps/s1600/dropbox-move.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-7rTQZnYcOJw/Tekurx-VnWI/AAAAAAAABVo/9N5LE_66vps/s320/dropbox-move.png" width="316" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;Advertencia&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Luego de esto fui a Linux e indiqué a dropbox que use la misma carpeta que Windows. Empezó por eliminar todo el contenido (!!!) y luego procedió a descargar lo que tenia en Internet.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Tome sus precauciones. Una mejor alternativa sería tener una copia del dropbox en otra carpeta y, luego de instalar dropbox, pausar la sincronización, pasar a mano los archivos, y reiniciar la sincronización. Quizás así se ahorraría tiempo en la sincronización inicial.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-4993352259232735750?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4993352259232735750/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/moviendo-dropbox.html#comment-form' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4993352259232735750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4993352259232735750'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/moviendo-dropbox.html' title='Moviendo Dropbox'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-7rTQZnYcOJw/Tekurx-VnWI/AAAAAAAABVo/9N5LE_66vps/s72-c/dropbox-move.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-1644497200627720933</id><published>2011-06-01T18:48:00.002-05:00</published><updated>2011-06-02T15:35:51.098-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Ubuntu Natty Narwhal con Windows 7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yEzZU-vUNME/TebOTGXljkI/AAAAAAAABVk/UAosUOEB_NA/s1600/Windows-7-Ubuntu-Linux.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-yEzZU-vUNME/TebOTGXljkI/AAAAAAAABVk/UAosUOEB_NA/s200/Windows-7-Ubuntu-Linux.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Hoy he instalado Ubuntu Natty Narwhal (ubuntu-11.04-desktop-i386.iso) junto a Windows 7, que ya estaba instalado. Aunque no ha sido tan fácil como parecía.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Intro&lt;/span&gt;&lt;br /&gt;La PC de la oficina es una Compaq Presario CQ5310LA PC, con Windows 7 instalado de fábrica. Hace muchos años, en otra oficina, habitualmente usaba RedHat o Suse, pero recientemente la he pasado más con Windows XP y Windows 7.&lt;br /&gt;&lt;br /&gt;Cuando necesito hacer alguna tarea en el servidor Linux, abro un terminal con Putty. Si quiero experimentar alguna aplicación Linux, puedo usar VMWare o VirtualBox para instalar allí alguna distribución.&lt;br /&gt;&lt;br /&gt;Me gusta mucho la opción de la virtualización con VMWare o VirtualBox pero, si no hay mucha memoria, &amp;nbsp;todo el sistema se vuelve bastante lento.&lt;br /&gt;&lt;br /&gt;Viendo a los amigos de la comunidad Drupal Perú usando Linux y, considerando los temas que me gusta investigar, me animé a dar el salto para volver a usarlo más intensivamente.&lt;br /&gt;&lt;br /&gt;Sin embargo, hay algunas cosas de desarrollo web para las que tengo herramientas habituales en Windows. Así que lo tengo a la vuelta para cuando lo necesite, mientras voy desarrollando alternativas.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;No tan fácil como parecía&lt;/span&gt;&lt;br /&gt;No es la primera vez que instalo Ubuntu. Incluso antes he hecho una instalación dual con Windows XP. En aquella ocasión aprendí que a veces el sistema de arranque de Windows y el de Linux se cruzan y hay que hacer algunas correcciones luego del proceso.&lt;br /&gt;&lt;br /&gt;Esta vez, vi con agrado que había una interfaz incluida en el proceso de instalación para cambiar el tamaño de la partición Windows existente para hacer espacio a la nueva partición para Ubuntu. Además, no requería de ninguna operación previa de defragmentación. Supuese que era una señal de que el proceso sería más facil ahora, pero no fue así.&lt;br /&gt;&lt;br /&gt;Puse el instalador en un USB (usando Lili USB Creator) y reinicié el sistema para arrancar desde ahí.&lt;br /&gt;&lt;br /&gt;En el proceso de instalación, el reparticionamiento fue casi automático. Indiqué 50 GB para la nueva partición Linux. Luego continuó bien pero, casi al final, falló por alguna razón. Un mensaje de error irrecuperable. Reinicié el proceso.&lt;br /&gt;&lt;br /&gt;La segunda vez hice el proceso desde el escritorio del Live CD. Ya no ocurrió el error irrecuperable y la instalación se completó, pero tardó bastante tiempo la descarga de los archivos de actualización y otros. Quizás hubiera dejado esa opción para después. Sin embargo, como estaba en el escritorio, podía navegar mientras esperaba :)&lt;br /&gt;&lt;br /&gt;Cuando reinicié, esperaba que apareciera el menú de inicio de Grub (usado para iniciar Linux), pero la pantalla se quedó en negro, con el rectángulo que muestra el monitor cuando no recibe ninguna señal.&lt;br /&gt;&lt;br /&gt;Probé reiniciar varias veces, sin resultado. Felizmente hice backup, pensé.&lt;br /&gt;&lt;br /&gt;Por si acaso, repetí el proceso de instalación. Para no descargar las actualizaciones, desconecté el cable de red y así fue un poco menos el tiempo. Pero el resultado fue el mismo.&lt;br /&gt;&lt;br /&gt;Felizmente, usando el navegador de archivos del Live CD podía comprobar que los archivos de Windows estaban allí. El problema era que se había perdido el arranque.&lt;br /&gt;&lt;br /&gt;Hice un disco de rescate en otra máquina que también tiene Windows 7 y seguí el procedimiento de reparar el sector de inicio. Reinicié, pero seguía igual.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Una esperanza&lt;/span&gt;&lt;br /&gt;Entonces, cruzado de brazos, vi como después de casi un minuto, en la pantalla apareció Ubuntu. Al parecer, el sistema si iniciaba, pero con un Grub silente. Sin Grub, ¿cómo escoger la opción de iniciar con Windows?&lt;br /&gt;&lt;br /&gt;Investigando, encontré una solución para corregir el inicio perdido de Windows. Consiste en usar el disco de rescate para iniciar una consola y desde allí ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;bootrec /fixmbr&lt;br /&gt;bootrec /fixboot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Funcionó y se inició Windows 7 normalmente.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Más o menos&lt;/span&gt;&lt;br /&gt;Ahora, para tener un acceso a Ubuntu iba a intentar tratar con Grub, pero antes probé bajar el utilitario EasyBCD, que había visto mencionaban en los foros.&lt;br /&gt;&lt;br /&gt;Allí, modifiqué el menú de inicio, agregando un nuevo item para sistema operativo Linux, tipo de inicio Grub2 (el usado por Ubuntu 11). Salve los cambios y reinicié.&lt;br /&gt;&lt;br /&gt;Esta vez, apareció un menú de inicio provisto por Windows. Elegí Ubuntu. La pantalla se puso negra y, luego de un rato, apareció Ubuntu.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Corrigiendo el menú de Grub&lt;/span&gt;&lt;br /&gt;Encontré una solución al problema de la pantalla negra antes de Ubuntu. Al parecer, no se estaba presentando bien el menú de grub. En la consola ejecuté:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo gedit /etc/default/grub.conf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para editar el archivo de configuración de grub. En lugar de gedit también se puede usar otro editor, como nano.&lt;br /&gt;&lt;br /&gt;En grub.conf, localizar la línea &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#GFX640x480&lt;/span&gt; y descomentarla, de modo que queda:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;GFX640x480&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo update-grub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Al reiniciar la máquina, aparece primero el menú de inicio de Windows (el que configuré con ayuda de EasyBCD). Si elijo Ubuntu, aparece el menú de inicio de Grub. Bien.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Restableciendo el arranque de Grub&lt;/span&gt;&lt;br /&gt;Quizás se podría simplificar el pasar primero del menú de inicio de Windows al menú de inicio de Grub.&lt;br /&gt;&lt;br /&gt;Se puede conseguir reinstalando el menú de inicio Grub:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo grub-install /dev/sda&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En mi caso, /dev/sda es el disco donde se coloca el inicio.&lt;br /&gt;&lt;br /&gt;Al reiniciar la máquina, aparece primero el menú de inicio de Grub. Si elijo Windows, aparece el menú de inicio de Windows. Tiene sentido.&lt;br /&gt;&lt;br /&gt;Para que no aparezca el menú de inicio de Windows, uso EasyBCD para quitar la opcion Ubuntu y además indicar que omita el menú de inicio.&lt;br /&gt;&lt;br /&gt;Una vez hecho esto, al reiniciar la máquina, aparece sólamente el menú de inicio de Grub, desde donde se puede elegir Linux o Windows.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;En resumen&lt;/span&gt;&lt;br /&gt;Para instalar Ubuntu (11, Natty Narwhal) junto a un Windows 7, ya instalado:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No es necesario reparticionar el disco antes de correr el instalador de Ubuntu. Tampoco es necesario defragmentarlo.&lt;/li&gt;&lt;li&gt;Ejecutar el instalador de Ubuntu, eligiendo la instalación lado a lado, junto al Windows 7 existente e indicando el tamaño de la partición destinada a Ubuntu. Un mínimo recomendable suele ser 20 GB. Yo elegí 40 GB, pero puede ser tanto como se quiera.&lt;/li&gt;&lt;li&gt;Sí, luego de ejecutar la instalación, no se ve ningún menú que permita elegir qué sistema iniciar, aguardar un poco. En mi caso, me parece que luego de 30 segundos, se iniciaba Ubuntu.&lt;/li&gt;&lt;li&gt;Para corregir la falta de visualización del menú de inicio de Grub, editar el archivo &lt;b&gt;/etc/default/grub.conf&lt;/b&gt; y descomentar la linea&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#GFX640x480&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://forums.scotsnewsletter.com/index.php?showtopic=45226"&gt;http://forums.scotsnewsletter.com/index.php?showtopic=45226&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-1644497200627720933?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/1644497200627720933/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/06/ubuntu-natty-narwhal-con-windows-7.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1644497200627720933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1644497200627720933'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/06/ubuntu-natty-narwhal-con-windows-7.html' title='Ubuntu Natty Narwhal con Windows 7'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-yEzZU-vUNME/TebOTGXljkI/AAAAAAAABVk/UAosUOEB_NA/s72-c/Windows-7-Ubuntu-Linux.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-1369013346591525427</id><published>2011-05-20T14:27:00.001-05:00</published><updated>2011-05-20T14:27:25.237-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Unobstrusive wev dev</title><content type='html'>&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9-J7ZnRLaeQ/Tcq_RK2rWuI/AAAAAAAABVU/2hREkJPgZws/s1600/uphp.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-9-J7ZnRLaeQ/Tcq_RK2rWuI/AAAAAAAABVU/2hREkJPgZws/s1600/uphp.png" style="cursor: move;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Lea el artículo original en&amp;nbsp;&lt;a href="http://akcideas.blogspot.com/2011/05/unobstrusive-web-dev.html"&gt;Unobstrusive web dev&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/19875758-1369013346591525427?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/1369013346591525427/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/05/unobstrusive-wev-dev.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1369013346591525427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1369013346591525427'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/05/unobstrusive-wev-dev.html' title='Unobstrusive wev dev'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-9-J7ZnRLaeQ/Tcq_RK2rWuI/AAAAAAAABVU/2hREkJPgZws/s72-c/uphp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7820864668340582855</id><published>2011-05-16T15:18:00.004-05:00</published><updated>2011-07-13T17:44:04.351-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Programando Web</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-NqE0lUJ297c/TdGK4CKh9CI/AAAAAAAABVY/8YSeBFMBH2E/s1600/free-web-host.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://4.bp.blogspot.com/-NqE0lUJ297c/TdGK4CKh9CI/AAAAAAAABVY/8YSeBFMBH2E/s200/free-web-host.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Lea el artículo original en&amp;nbsp;&lt;a href="http://uphp.blogspot.com/2011/05/programando-web.html"&gt;Programando Web&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7820864668340582855?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7820864668340582855/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/05/programando-web.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7820864668340582855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7820864668340582855'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/05/programando-web.html' title='Programando Web'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-NqE0lUJ297c/TdGK4CKh9CI/AAAAAAAABVY/8YSeBFMBH2E/s72-c/free-web-host.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7833993067672212685</id><published>2011-04-27T12:41:00.002-05:00</published><updated>2011-06-28T15:09:14.701-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>.htaccess para proteger index.html</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-mnivdaPjRtA/TbhUfnjv1hI/AAAAAAAABU4/VJK3xW-jwBg/s1600/Lock+file+Icon.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-mnivdaPjRtA/TbhUfnjv1hI/AAAAAAAABU4/VJK3xW-jwBg/s1600/Lock+file+Icon.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Se puede usar .htaccess para proteger el acceso a un determinado archivo en un directorio. En este caso, se desea proteger el acceso a http://example.com/protegido/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;.htaccess&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;En el directorio que contiene a &lt;b&gt;index.html&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;FilesMatch index.html&amp;gt;&lt;br /&gt;AuthUserFile /var/www/.htpasswd&lt;br /&gt;AuthType Basic&lt;br /&gt;AuthName "Pagina Privada"&lt;br /&gt;Require valid-user&lt;br /&gt;&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;.htpasswd&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;code&gt;/var/www/.htpasswd&lt;/code&gt; se puede crear usando el comando &lt;i&gt;htpasswd&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd /var/www&lt;br /&gt;htpasswd -c .htpasswd uuu&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Donde &lt;i&gt;uuu &lt;/i&gt;es el nombre del usuario al que se quiere dar acceso a ese directorio.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Files o FilesMatch&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Inicialmente habia usado &lt;b&gt;Files&lt;/b&gt;&amp;nbsp;en lugar de &lt;b&gt;FilesMatch,&lt;/b&gt;&amp;nbsp;pero&lt;b&gt;&amp;nbsp;&lt;/b&gt;me permitía entrar al directorio omitiendo &lt;b&gt;index.html&lt;/b&gt; en el url.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si el url era:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;http://example.com/protegido/index.html&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Podía entrar con:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;http://example.com/protegido/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En cambio, con &lt;b&gt;FilesMatch &lt;/b&gt;se protegieron ambos accesos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7833993067672212685?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7833993067672212685/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/04/htaccess-para-proteger-indexhtml.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7833993067672212685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7833993067672212685'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/04/htaccess-para-proteger-indexhtml.html' title='.htaccess para proteger index.html'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-mnivdaPjRtA/TbhUfnjv1hI/AAAAAAAABU4/VJK3xW-jwBg/s72-c/Lock+file+Icon.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7701728562731231549</id><published>2011-04-23T11:47:00.003-05:00</published><updated>2011-04-23T12:11:45.359-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Cómo sombrear filas alternas con CSS3</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;A esta forma de presentar filas se le suele llamar cebra.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Caso Tabla&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wCaJOl-tDdc/TbMHzuF-gKI/AAAAAAAABUo/hT5OSXrRZaY/s1600/zebra-table.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-wCaJOl-tDdc/TbMHzuF-gKI/AAAAAAAABUo/hT5OSXrRZaY/s1600/zebra-table.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;table class="zebra"&amp;gt;&lt;br /&gt;  &amp;lt;thead&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;th&amp;gt;Col0&amp;lt;/th&amp;gt;&lt;br /&gt;      &amp;lt;th&amp;gt;Col1&amp;lt;/th&amp;gt;&lt;br /&gt;      &amp;lt;th&amp;gt;Col2&amp;lt;/th&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/thead&amp;gt;&lt;br /&gt;  &amp;lt;tbody&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;td&amp;gt;Item&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;CSS&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;table.zebra tbody tr:nth-child(2n+1) {&lt;br /&gt;  background-color: #eef;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Normalmente, las tablas presentan sus celdas con un borde. Para ocultarlo, se puede usar el atributo html border="0". Sin embargo, también se puede hacer usando estilos, con algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;table.zebra {&lt;br /&gt;  border-collapse: collapse;&lt;br /&gt;  border-spacing: 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Caso Lista&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YtxG-MZiw5Y/TbMIAXy9llI/AAAAAAAABUs/5T-rZUZMAKs/s1600/zebra-list.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-YtxG-MZiw5Y/TbMIAXy9llI/AAAAAAAABUs/5T-rZUZMAKs/s1600/zebra-list.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;ul class="zebra"&amp;gt;&lt;br /&gt;  &amp;lt;li&amp;gt;Item 1&amp;lt;/li&amp;gt;&lt;br /&gt;  &amp;lt;li&amp;gt;Item 2&amp;lt;/li&amp;gt;&lt;br /&gt;  &amp;lt;li&amp;gt;Item 3&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;CSS&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;ul.zebra li:nth-child(2n+1) {&lt;br /&gt;  background-color: #eef;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Normalmente, las listas presentan sus filas con un bullet. Para ocultarlo, se puede usar estilos, con algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ul.zebra {&lt;br /&gt;  list-style: none;&lt;br /&gt;  padding: 0;&lt;br /&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/19875758-7701728562731231549?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7701728562731231549/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/04/como-sombrear-filas-alternas-con-css3.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7701728562731231549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7701728562731231549'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/04/como-sombrear-filas-alternas-con-css3.html' title='Cómo sombrear filas alternas con CSS3'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wCaJOl-tDdc/TbMHzuF-gKI/AAAAAAAABUo/hT5OSXrRZaY/s72-c/zebra-table.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3579530805927676663</id><published>2011-04-15T15:22:00.001-05:00</published><updated>2011-04-15T15:23:38.797-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='uphp'/><title type='text'>uphp</title><content type='html'>&lt;span class="Apple-style-span" style="color: #444444; font-family: Helvetica, Arial, sans-serif; font-size: 15px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VOiPjiViZ4A/SpeOgCTX4MI/AAAAAAAAAE0/3qftQsAxguI/s1600/php2sv8.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="128" src="http://4.bp.blogspot.com/-VOiPjiViZ4A/SpeOgCTX4MI/AAAAAAAAAE0/3qftQsAxguI/s200/php2sv8.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Con &lt;b&gt;HTML&lt;/b&gt;, el contenido se mezcla con etiquetas que permiten mostrarlo en un navegador.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;CSS&lt;/b&gt; permite separar la data del formato de la data del contenido.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;Javascript &lt;/b&gt;permite poner código en las etiquetas para manipular el documento e interactuar con sus elementos.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;Unobstrusive javascript&lt;/b&gt; es una forma de usar javascript que procura mantener el código aparte. &lt;i&gt;jQuery &lt;/i&gt;ayuda mucho en esto.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;JSP, &lt;b&gt;PHP&lt;/b&gt;, etc, permiten generar HTML, abriendo la puerta a la automatización y al uso de recursos como las bases de datos.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;Frameworks&lt;/b&gt; web permiten para manejar el desarrollo de un site relativamente extenso o complejo.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;El modelo de framework &lt;b&gt;MVC&lt;/b&gt; (Modelo-Vista-Controlador), viene del mundo Smalltalk a la web para separar el desarrollo en esas tres capas.&lt;br /&gt;En mi opinión, aumenta la inercia del proceso de desarrollo. Expresar una solución web en términos MVC se convierte en un problema adicional.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;b&gt;Drupal &lt;/b&gt;usa un modelo de framework diferente, ingenioso, permitiendo agregar libremente componentes que pueden colaborar entre sí.&lt;br /&gt;También requiere algo de tiempo y trabajo aprender a pensar y expresar cualquier solución en sus términos. A cambio, a mi parecer, permite ser mucho más productivo que en cualquiera de las alternativas anteriores.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;En general, estos frameworks requieren que aprendamos una nueva versión de lo que ya sabemos hacer en web. A veces, incluso hay que hacer ese reaprendizaje de una versión a otra del mismo framework.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;¿No le parece que algo tiene que cambiar?&lt;br /&gt;¿Habrá alguna forma de hacer dinámica una página estática sin tener que reescribirla?&amp;nbsp;&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Encontrando a &lt;b&gt;QueryPath&lt;/b&gt;, algo como un puerto de &lt;b&gt;jQuery &lt;/b&gt;para PHP, que facilita la manipulación de una página, me pareció que podría haber alternativas.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://rulokc.freezoka.net/uphp/"&gt;&lt;b&gt;uphp&lt;/b&gt;&lt;/a&gt; es la búsqueda de una forma de desarrollar web en la que el código afecta al contenido pero se manteniene aparte.&lt;br /&gt;De ese modo, se pueden respetar las páginas estáticas de un site mientras se lo vuelve dinámico.&lt;br /&gt;Además, se podría usar, tal cual, soluciones HTML/CSS/Javascript que sean independientes del framework.&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 15px; margin-bottom: 0.8em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Quien sabe, quizás tambien se halle una forma de hacer todo eso y además separar la data del contenido de la data HTML.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3579530805927676663?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3579530805927676663/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/04/uphp.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3579530805927676663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3579530805927676663'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/04/uphp.html' title='uphp'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-VOiPjiViZ4A/SpeOgCTX4MI/AAAAAAAAAE0/3qftQsAxguI/s72-c/php2sv8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6480852073053756860</id><published>2011-04-07T17:24:00.002-05:00</published><updated>2011-04-08T16:33:53.695-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Cómo definir un selector CSS que requiera dos clases</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ohce1BBDLOc/TZ45nfTCbfI/AAAAAAAABUc/WaAacOnK-QQ/s1600/css-icon.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Ohce1BBDLOc/TZ45nfTCbfI/AAAAAAAABUc/WaAacOnK-QQ/s1600/css-icon.png" /&gt;&lt;/a&gt;&lt;/div&gt;El problema que tenía involucraba bloques similares a:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;proyectos-vista_1&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="view view-proyectos view-display-id-page_1"&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;proyectos-vista_2&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="view view-proyectos view-display-id-page_2"&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;noticias-vista_1&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="view view-noticias view-display-id-page_1"&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;noticias-vista_2&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;div class="view view-noticias view-display-id-page_2"&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Necesitaba aplicar un estilo únicamente al bloque proyectos-vista_1. Podría ser más fácil si éste tuviera un id, pero no lo tenía (así lo construye Drupal, en este caso).&lt;br /&gt;&lt;br /&gt;La solución la encontré en &lt;a href="http://www.bennadel.com/blog/680-Defining-A-CSS-Selector-That-Requires-A-Multi-Class-Union.htm"&gt;este artículo&lt;/a&gt;. Consiste en usar un selector como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;.view-proyectos.view-display-id-page_1 {&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Qué sencillo. No me lo imaginaba :-) Ojalá te sirva de ayuda tambien.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referencia&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.bennadel.com/blog/680-Defining-A-CSS-Selector-That-Requires-A-Multi-Class-Union.htm"&gt;Defining A CSS Selector That Requires A Multi-Class Union&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6480852073053756860?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6480852073053756860/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/04/como-definir-un-selector-css-que.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6480852073053756860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6480852073053756860'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/04/como-definir-un-selector-css-que.html' title='Cómo definir un selector CSS que requiera dos clases'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Ohce1BBDLOc/TZ45nfTCbfI/AAAAAAAABUc/WaAacOnK-QQ/s72-c/css-icon.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5287339852224547915</id><published>2011-04-05T12:14:00.001-05:00</published><updated>2011-04-05T12:19:31.033-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Separación entre párrafos en Flash</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vrL9wPbQjSc/TZtMfP_6RgI/AAAAAAAABUU/jiFZ_gtcsSk/s1600/Adobe_Flash_Pro_CS5_icon-100.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-vrL9wPbQjSc/TZtMfP_6RgI/AAAAAAAABUU/jiFZ_gtcsSk/s1600/Adobe_Flash_Pro_CS5_icon-100.png" /&gt;&lt;/a&gt;&lt;/div&gt;Para aprovechar esta característica, el documento flash debe ser para Flash 10 y Actionscript 3.&lt;br /&gt;&lt;br /&gt;Cuando defina un texto, asegúrese de que es de tipo &lt;b&gt;TLF&lt;/b&gt; (no la opción &lt;b&gt;Classic Text&lt;/b&gt;). Esto permite acceder a propiedades avanzadas para el control de texto como &lt;b&gt;Spacing&lt;/b&gt;, que permite controlar el espaciado entre párrafos.&lt;br /&gt;&lt;br /&gt;Algo que hay que tomar en cuenta es que, a diferencia de la mayoría de procesadores de texto, donde el espaciado después del párrafo se suma al espaciado anterior del párrafo siguiente, en flash se solapan. Lo que significa que si el espaciado antes del párrafo es 12px y el espaciado despues del párrafo es 24px, el espaciado entre dos párrafos no será 36px, sino 24px.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Referencia:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.flashconf.com/flash-cs5/flash-cs5-paragraph-styles/"&gt;&lt;i&gt;http://www.flashconf.com/flash-cs5/flash-cs5-paragraph-styles/&lt;/i&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5287339852224547915?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5287339852224547915/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/04/separacion-entre-parrafos-en-flash.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5287339852224547915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5287339852224547915'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/04/separacion-entre-parrafos-en-flash.html' title='Separación entre párrafos en Flash'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vrL9wPbQjSc/TZtMfP_6RgI/AAAAAAAABUU/jiFZ_gtcsSk/s72-c/Adobe_Flash_Pro_CS5_icon-100.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-1461168264961065587</id><published>2011-03-23T18:24:00.001-05:00</published><updated>2011-03-23T18:27:46.443-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><title type='text'>Cómo evitar que Chrome abra un PDF</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-9VMqz_9QIts/TYqB5217jLI/AAAAAAAABTc/pqbrbTIhWx4/s1600/chrome-100.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-9VMqz_9QIts/TYqB5217jLI/AAAAAAAABTc/pqbrbTIhWx4/s1600/chrome-100.png" /&gt;&lt;/a&gt;&lt;/div&gt;Normalmente, Chrome abre los enlaces a documentos PDF en la misma ventana. Quizás esto le parezca cómodo a algunas personas pero, al menos para mí, no lo es.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;El problema&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Si el documento es muy pesado, podemos tener una página en blanco largo rato, sin mayor indicación de lo que esta pasando. Prefiero descargar el documento y luego abrirlo cuando yo quiera.&lt;br /&gt;&lt;br /&gt;Una forma es usando el clic secundario, Guardar como, en lugar de hacerle clic al enlace. El problema es que algunas veces no es obvio que el enlace va a abrir un PDF y es un poco molesto retroceder y corregir la acción.&lt;br /&gt;&lt;br /&gt;Además, algunas veces no hay enlace, sino un botón de formulario, y entonces no se puede usar el Guardar como.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Configurando Chrome&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Deshabilitar esto en Chrome no es tan obvio. No se encuentra la opción en la pantalla de configuración.&lt;br /&gt;&lt;br /&gt;Una forma de hacerlo es entrar a la dirección:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;chrome://plugins/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aparecerá una lista de los plugins instalados. Ubique&amp;nbsp;Chrome PDF Viewer y deshabilítelo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-1461168264961065587?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/1461168264961065587/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/03/como-evitar-que-chrome-abra-un-pdf.html#comment-form' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1461168264961065587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1461168264961065587'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/03/como-evitar-que-chrome-abra-un-pdf.html' title='Cómo evitar que Chrome abra un PDF'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-9VMqz_9QIts/TYqB5217jLI/AAAAAAAABTc/pqbrbTIhWx4/s72-c/chrome-100.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4290455474362334532</id><published>2011-02-19T01:31:00.000-05:00</published><updated>2011-02-19T01:31:10.537-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utilidades'/><category scheme='http://www.blogger.com/atom/ns#' term='ventanas'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Organizar ventanas en un snap</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-W1Hb_oChjZo/TV9iBZXdI_I/AAAAAAAABRU/2fU12CPVt_w/s1600/AquaSnapPortable_128.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-W1Hb_oChjZo/TV9iBZXdI_I/AAAAAAAABRU/2fU12CPVt_w/s1600/AquaSnapPortable_128.png" /&gt;&lt;/a&gt;&lt;/div&gt;AquaSnap es una utilidad que puede ser de mucha ayuda en el manejo de las ventanas.&lt;br /&gt;&lt;br /&gt;Puede descargarla de&amp;nbsp;&lt;a href="http://www.nurgo-software.com/products/aquasnap"&gt;http://www.nurgo-software.com/products/aquasnap&lt;/a&gt;, o también la versión portable desde&amp;nbsp;&lt;a href="http://portableapps.com/apps/utilities/aquasnap_portable"&gt;http://portableapps.com/apps/utilities/aquasnap_portable&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cuando la ejecuta, se coloca como tray icon (por la zona de su reloj) para que haciéndole doble clic pueda cambiar su configuración, si lo desea.&lt;br /&gt;&lt;br /&gt;La forma de usar aquasnap es simple:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si arrastra una ventana hacia uno de los bordes, la ventana se pegará hacia ese borde y, además, sus dimensiones ocuparán esa mitad de la pantalla.&lt;/li&gt;&lt;li&gt;Si arrastra una ventana hacia una de las esquinas, la ventana se pegará hacia esa esquina y, además, sus dimensiones ocuparán ese cuarto de la pantalla.&lt;/li&gt;&lt;li&gt;Si arrastra una ventana y la sacude, se tornará translúcida; podrá ver lo que hay debajo y se mantendrá así hasta que la sacuda otra vez.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Esto es con la configuración por default. Haciendo doble clic en el tray icon puede elegir otras opciones.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-4290455474362334532?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4290455474362334532/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/02/organizar-ventanas-en-un-snap.html#comment-form' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4290455474362334532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4290455474362334532'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/02/organizar-ventanas-en-un-snap.html' title='Organizar ventanas en un snap'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-W1Hb_oChjZo/TV9iBZXdI_I/AAAAAAAABRU/2fU12CPVt_w/s72-c/AquaSnapPortable_128.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4293440935591552607</id><published>2011-02-17T01:32:00.004-05:00</published><updated>2011-06-28T15:16:29.067-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>Resolviendo keys para Putty SSH a Hostmonster</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-K27t373uf-0/TVzEPyXZT1I/AAAAAAAABRQ/XoSLwFOuDCU/s1600/success-blogging-keys.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="148" src="http://2.bp.blogspot.com/-K27t373uf-0/TVzEPyXZT1I/AAAAAAAABRQ/XoSLwFOuDCU/s200/success-blogging-keys.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Hoy he pasado algunas horas resolviendo este tema.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ssh &lt;/b&gt;genera dos llaves (por ejemplo &lt;b&gt;&lt;i&gt;id_dsa&lt;/i&gt;&lt;/b&gt; -la privada-, e &lt;b&gt;&lt;i&gt;id_dsa.pub&lt;/i&gt;&lt;/b&gt; -la pública-).&lt;br /&gt;&lt;br /&gt;Se pueden generar con alguno de los comandos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ssh-keygen -t &lt;b&gt;dsa&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ssh-keygen -t &lt;b&gt;rsa&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Según&amp;nbsp;el tipo que se desee.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hostmonster &lt;/b&gt;también tiene un generador de llaves (al parecer ssh) que puede producir archivos similares.&lt;br /&gt;&lt;br /&gt;Uno puede producir llaves de diverso tipo (dsa, rsa), con o sin password.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[ssh]----&amp;gt; id_dsa     (llave privada)&lt;br /&gt;       +-&amp;gt; id_dsa.pub (llave pública)&lt;br /&gt;&lt;br /&gt;[ssh]----&amp;gt; id_rsa     (llave privada)&lt;br /&gt;       +-&amp;gt; id_rsa.pub (llave pública)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Los nombres pueden ser id_dsa, id_rsa, u otro cualquiera. Por ejemplo, yo estuve practicando con&amp;nbsp;&lt;i&gt;kobaonli_id_dsa&lt;/i&gt;, &lt;i&gt;hp_id_dsa&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Putty &lt;/b&gt;es un programa que permite hacer conexiones SSH usando estas llaves (&lt;i&gt;Connection/SSH/Auth&lt;/i&gt;).&lt;br /&gt;Pero no puede usar las llaves privadas así generadas, requiere que antes sean convertidas a &lt;b&gt;.ppk&lt;/b&gt;, con un programa como &lt;b&gt;puttygen&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Puttygen tiene la opción &lt;i&gt;Conversions/Import&lt;/i&gt; que permite importar una llave privada generada con ssh (u OpenSSH) y generar el &lt;b&gt;.ppk&lt;/b&gt; correspondiente.&lt;br /&gt;Sin embargo, tuve problemas para que puttygen (versión 0.60) reconociera llaves privadas que tuvieran password, así que generé llaves &lt;u&gt;sin password&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[ssh]----&amp;gt; id_dsa ----[puttygen]----&amp;gt; id_dsa.ppk&lt;br /&gt;       +-&amp;gt; id_dsa.pub&lt;br /&gt;&lt;br /&gt;[ssh]----&amp;gt; id_rsa ----[puttygen]----&amp;gt; id_rsa.ppk&lt;br /&gt;       +-&amp;gt; id_rsa.pub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Así que, en resúmen:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A) Usando llaves locales&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- Usé &lt;b&gt;ssh-keygen -t dsa&lt;/b&gt; para crear &lt;b&gt;&lt;i&gt;hp_id_dsa/hp_id_dsa.pub&lt;/i&gt;&lt;/b&gt;, sin password.&lt;br /&gt;- Usé &lt;b&gt;puttygen &lt;/b&gt;para importar &lt;b&gt;&lt;i&gt;hp_id_dsa&lt;/i&gt;&lt;/b&gt; y crear &lt;b&gt;&lt;i&gt;hp_id_dsa.ppk&lt;/i&gt;&lt;/b&gt;, sin password.&lt;br /&gt;- En &lt;b&gt;Hostmonster&lt;/b&gt;, &lt;i&gt;CPanel, SSH/Shell Access, Manage SSH Keys&lt;/i&gt;, importé &lt;b&gt;&lt;i&gt;hp_id_dsa/hp_id_dsa.pub&lt;/i&gt;&lt;/b&gt; y luego en &lt;i&gt;Manage Authorization&lt;/i&gt; autoricé su uso.&lt;br /&gt;- Indiqué a &lt;b&gt;putty &lt;/b&gt;que usara &lt;b&gt;&lt;i&gt;hp_id_dsa.ppk&lt;/i&gt;&lt;/b&gt; para el &lt;i&gt;SSH/Auth&lt;/i&gt;.&lt;br /&gt;- Me pude conectar a &lt;b&gt;Hostmonster &lt;/b&gt;usando las llaves &lt;b&gt;&lt;i&gt;hp_id_dsa[.ppk]/hp_id_dsa.pub&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[ssh]----&amp;gt; hp_id_dsa ----[puttygen]----&amp;gt; hp_id_dsa.ppk&lt;br /&gt;       +-&amp;gt; hp_id_dsa.pub&lt;br /&gt;           |&lt;br /&gt;           v&lt;br /&gt;          [hostmonster]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;B) Usando llaves remotas&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;- En &lt;b&gt;Hostmonster&lt;/b&gt;, &lt;i&gt;CPanel, SSH/Shell Access, Manage SSH Keys&lt;/i&gt;, creé &lt;b&gt;&lt;i&gt;kobaonli_id_dsa/kobaonli_id_dsa.pub&lt;/i&gt;&lt;/b&gt;, sin password. Descargué la llave privada &lt;b&gt;&lt;i&gt;kobaonli_id_dsa&lt;/i&gt;&lt;/b&gt; a mi &lt;b&gt;PC&lt;/b&gt;.&lt;br /&gt;- Usé &lt;b&gt;puttygen &lt;/b&gt;para importar &lt;b&gt;&lt;i&gt;kobaonli_id_dsa&lt;/i&gt;&lt;/b&gt; y crear &lt;b&gt;&lt;i&gt;kobaonli_id_dsa.ppk&lt;/i&gt;&lt;/b&gt;, sin password.&lt;br /&gt;- Indiqué a &lt;b&gt;putty &lt;/b&gt;que usara &lt;b&gt;&lt;i&gt;kobaonli_id_dsa.ppk&lt;/i&gt;&lt;/b&gt; para el &lt;i&gt;SSH/Auth&lt;/i&gt;.&lt;br /&gt;- Me pude conectar a &lt;b&gt;Hostmonster &lt;/b&gt;usando las llaves &lt;b&gt;&lt;i&gt;kobaonli_id_dsa[.ppk]/kobaonli_id_dsa.pub&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[hostmonster]----&amp;gt; hp_id_dsa ----&amp;gt;[pc]----[puttygen]----&amp;gt; hp_id_dsa.ppk&lt;br /&gt;               +-&amp;gt; hp_id_dsa.pub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;a href="https://www.hostmonster.com/cgi/help/555"&gt;Hostmonster Helpdesk: SSH Access - Generating a Public/Private Key&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Crédito de la imágen: &lt;a href="http://internetmarketingstrategydiva.com/wp-content/uploads/2009/12/success-blogging-keys.jpg"&gt;http://internetmarketingstrategydiva.com/wp-content/uploads/2009/12/success-blogging-keys.jpg&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-4293440935591552607?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4293440935591552607/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/02/resolviendo-keys-para-putty-ssh.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4293440935591552607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4293440935591552607'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/02/resolviendo-keys-para-putty-ssh.html' title='Resolviendo keys para Putty SSH a Hostmonster'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-K27t373uf-0/TVzEPyXZT1I/AAAAAAAABRQ/XoSLwFOuDCU/s72-c/success-blogging-keys.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6317476192451889192</id><published>2011-02-16T13:30:00.002-05:00</published><updated>2011-11-16T17:24:41.204-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='center'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Cómo centrar un bloque en una página 2</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-N0g311E0a9w/TDepqPckZoI/AAAAAAAABJQ/E9ODF_y8rf4/s1600/center_in_page.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-N0g311E0a9w/TDepqPckZoI/AAAAAAAABJQ/E9ODF_y8rf4/s1600/center_in_page.png" /&gt;&lt;/a&gt;&lt;/div&gt;En el artículo&amp;nbsp;&lt;a href="http://akcdev.blogspot.com/2010/07/como-centrar-un-bloque-en-una-pagina.html"&gt;Cómo centrar un bloque en una página&lt;/a&gt;,&amp;nbsp;contaba sobre un método que venía utilizando para lograr centrar un bloque en una página.&lt;br /&gt;&lt;br /&gt;Ayer, un amigo me mostró una página posicionada de ese modo que no cabía en la ventana de su navegador Safari. Este mostraba el centro pero no permitía alcanzar la cabecera, ni siquiera usando la barra de scroll. En otros navegadores, como Firefox, Chrome e incluso Internet Explorer, si un bloque no cabe en la ventana, se muestra lo que quepa, de arriba hacia abajo. Pero en el suyo lo hacía desde el centro hacia afuera.&lt;br /&gt;&lt;br /&gt;Comprobé que otras páginas que había hecho usando ese método presentaban el mismo problema cuando las veía con Safari y reducía las dimensiones de la ventana.&lt;br /&gt;&lt;br /&gt;Buscando la explicacion a esto, encontré el artículo&amp;nbsp;&lt;a href="http://www.search-this.com/2008/05/15/easy-vertical-centering-with-css/"&gt;Easy Vertical Centering with CSS&lt;/a&gt;, que muestra un método diferente a los usuales, bastante simple y que, sorprendentemente, funciona en todos los navegadores en los que lo he probado, incluyendo Firefox 3.6, Chrome 9, Safari 5, IE8 e IE6.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;La idea&lt;/b&gt;&lt;br /&gt;La idea básica es mover el top del bloque de contenido al centro de la página y luego corregir el desplazamiento subiéndolo la mitad de la altura del bloque de contenido.&lt;br /&gt;&lt;br /&gt;Usualmente, en el bloque de contenido, se usa algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#page {&lt;br /&gt;  width: 960px;&lt;br /&gt;  height: 684px;&lt;br /&gt;  position: absolute;&lt;br /&gt;  top: 50%;&lt;br /&gt;  left: 50%;&lt;br /&gt;  margin-top: -342px;&lt;br /&gt;  margin-left: -480px;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pero presenta el problema del que estamos hablando.&lt;br /&gt;&lt;br /&gt;Este otro método usa una técnica ingeniosa: usar un bloque flotante para jalar al bloque de contenido. Una propiedad del bloque flotante es que jalará mientras se pueda; si algo se interpone (como otro bloque o el borde de la ventana), dejara de hacerlo. Es justamente lo que se necesita.&lt;br /&gt;&lt;br /&gt;Aquí, el HTML de una página que usa ese método:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Page Center&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&amp;gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;html, body {&lt;br /&gt; height: 100%;&lt;br /&gt; margin: 0;&lt;br /&gt; padding: 0;&lt;br /&gt;}&lt;br /&gt;body {&lt;br /&gt; background-color: #eed;&lt;br /&gt; min-width: 960px;&lt;br /&gt; min-height: 683px;&lt;br /&gt;}&lt;br /&gt;#vertical-float {&lt;br /&gt; float: left;&lt;br /&gt; height: 50%;&lt;br /&gt; margin-top: -342px; /* half vertical height*/&lt;br /&gt; width: 100%;&lt;br /&gt;}&lt;br /&gt;#page {&lt;br /&gt; clear: both;&lt;br /&gt; background: #fff;&lt;br /&gt; width: 960px;&lt;br /&gt; height: 683px;&lt;br /&gt; margin: 0 auto;&lt;br /&gt; overflow: auto;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="vertical-float"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="page-wrapper"&amp;gt;&lt;br /&gt;  &amp;lt;div id="page"&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Content&amp;lt;/h1&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Observar que la información de la altura del bloque de contenido (#page) está presente tanto en el bloque de contenido como en el bloque auxiliar (#vertical-float).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.search-this.com/2008/05/15/easy-vertical-centering-with-css/"&gt;Easy Vertical Centering with CSS&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6317476192451889192?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6317476192451889192/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/02/como-centrar-un-bloque-en-una-pagina-2.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6317476192451889192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6317476192451889192'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/02/como-centrar-un-bloque-en-una-pagina-2.html' title='Cómo centrar un bloque en una página 2'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-N0g311E0a9w/TDepqPckZoI/AAAAAAAABJQ/E9ODF_y8rf4/s72-c/center_in_page.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3621958060134230553</id><published>2011-02-15T13:04:00.001-05:00</published><updated>2011-02-15T13:13:25.596-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='instalar'/><title type='text'>Instalando Git en Centos 5</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_z5yeJZuETw/TVrCEUiUoII/AAAAAAAABRM/qgkQE6nPhLw/s1600/git_tux.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-_z5yeJZuETw/TVrCEUiUoII/AAAAAAAABRM/qgkQE6nPhLw/s200/git_tux.png" width="171" /&gt;&lt;/a&gt;&lt;/div&gt;Para comprobar si se tiene instalado Git, ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;git --version&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si no está instalado, puede instalarlo usando yum. Pero, en Centos 5, normalmente no está disponible un repositorio que contenga el paquete git.&lt;br /&gt;&lt;br /&gt;Para comprobarlo, como usuario root, en la consola de comandos, ejecute:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;yum install git&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Obtendrá un mensaje que le dirá que el paquete git no está presente.&lt;br /&gt;&lt;br /&gt;Puede agregar el repositorio EPEL (Extra Packages for Enterprise Linux), creando el archivo /etc/yum.repos.d/epel.repo:&lt;br /&gt;&lt;br /&gt;/etc/yum.repos.d/epel.repo&lt;br /&gt;&lt;pre&gt;[epel]&lt;br /&gt;name=Extra Packages for Enterprise Linux 5 - $basearch&lt;br /&gt;#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch&lt;br /&gt;mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&amp;amp;arch=$basearch&lt;br /&gt;failovermethod=priority&lt;br /&gt;enabled=1&lt;br /&gt;gpgcheck=1&lt;br /&gt;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL&lt;br /&gt;&lt;br /&gt;[epel-debuginfo]&lt;br /&gt;name=Extra Packages for Enterprise Linux 5 - $basearch - Debug&lt;br /&gt;#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch/debug&lt;br /&gt;mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-debug-5&amp;amp;arch=$basearch&lt;br /&gt;failovermethod=priority&lt;br /&gt;enabled=0&lt;br /&gt;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL&lt;br /&gt;gpgcheck=1&lt;br /&gt;&lt;br /&gt;[epel-source]&lt;br /&gt;name=Extra Packages for Enterprise Linux 5 - $basearch - Source&lt;br /&gt;#baseurl=http://download.fedoraproject.org/pub/epel/5/SRPMS&lt;br /&gt;mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-source-5&amp;amp;arch=$basearch&lt;br /&gt;failovermethod=priority&lt;br /&gt;enabled=0&lt;br /&gt;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL&lt;br /&gt;gpgcheck=1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si se procediera a la instalación ahora, la instalación no se completaría porque yum solicitaría /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL.&lt;br /&gt;&lt;br /&gt;Para prevenir eso, descargue ese archivo antes:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd /etc/pki/rpm-gpg&lt;br /&gt;wget http://download.fedora.redhat.com/pub/epel/RPM-GPG-KEY-EPEL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Luego, ejecute:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;yum install git git-daemon&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Al final, debería aparecer una indicación de que el proceso se completó con éxito.&lt;br /&gt;&lt;br /&gt;Para comprobar si se tiene instalado Git, ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;git --version&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/19875758-3621958060134230553?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3621958060134230553/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/02/instalando-git-en-centos-5.html#comment-form' title='7 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3621958060134230553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3621958060134230553'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/02/instalando-git-en-centos-5.html' title='Instalando Git en Centos 5'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-_z5yeJZuETw/TVrCEUiUoII/AAAAAAAABRM/qgkQE6nPhLw/s72-c/git_tux.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4923538112743479952</id><published>2011-02-08T16:31:00.008-05:00</published><updated>2011-10-17T00:14:20.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='malware'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><title type='text'>Quitar Facemood de la búsqueda de Firefox</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/TIAOwQQJbJI/AAAAAAAABL8/nXh-_eXhiTU/s1600/firefox.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/TIAOwQQJbJI/AAAAAAAABL8/nXh-_eXhiTU/s1600/firefox.png" /&gt;&lt;/a&gt;&lt;/div&gt;De algún modo instalé Facemood. De pronto uno se da cuenta de que trata de ser la máquina de búsqueda por default de tus navegadores. Parece un malware.&lt;br /&gt;&lt;br /&gt;En Firefox, aunque el plugin de Facemood ya esté desinstalado, deja la barra de direcciones afectada. Si uno tipea allí alguna palabra, en lugar de enviarla a Google, como antes lo tenía configurado, lo envía a la página de Facemood.&lt;br /&gt;&lt;br /&gt;Felizmente, encontré un modo de solucionar esto último (probado en Firefox 5, al menos). En la barra de direcciones de Firefox, entrar &lt;b&gt;about:config&lt;/b&gt;. Luego de aceptar la advertencia, buscar&amp;nbsp;&lt;b&gt;keyword.URL&lt;/b&gt;. Verá que aparece la dirección de la página de Facemood. Reemplazarlo por &lt;b&gt;http://www.google.com/search?q=&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="312" src="http://www.screenr.com/embed/rxKs" width="512"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Referencia&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.flywithmysoul.com/2010/09/remove-facemood-from-firefox.html"&gt;http://www.flywithmysoul.com/2010/09/remove-facemood-from-firefox.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-4923538112743479952?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4923538112743479952/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/02/quitar-facemood-de-la-busqueda-de.html#comment-form' title='65 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4923538112743479952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4923538112743479952'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/02/quitar-facemood-de-la-busqueda-de.html' title='Quitar Facemood de la búsqueda de Firefox'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/TIAOwQQJbJI/AAAAAAAABL8/nXh-_eXhiTU/s72-c/firefox.png' height='72' width='72'/><thr:total>65</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4591710793463384234</id><published>2011-02-04T10:57:00.001-05:00</published><updated>2011-02-04T10:57:42.821-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>Cómo listar sólo directorios en bash</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/TUwhyQVJXyI/AAAAAAAABQ8/7Vr3QRUEWG8/s1600/tux-100.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/TUwhyQVJXyI/AAAAAAAABQ8/7Vr3QRUEWG8/s1600/tux-100.png" /&gt;&lt;/a&gt;&lt;/div&gt;Hay varias formas. La primera me parece la más elegante (cuenta el que la compartió que la descubrió recien a los tres años de usar Linux):&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ls -d */&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ls -l | grep ^d&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ls | grep /$&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Referencia: http://www.linuxquestions.org/questions/programming-9/how-can-i-list-directories-only-in-linux-375219/&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-4591710793463384234?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4591710793463384234/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/02/como-listar-solo-directorios-en-bash.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4591710793463384234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4591710793463384234'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/02/como-listar-solo-directorios-en-bash.html' title='Cómo listar sólo directorios en bash'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K2xwnQ4Llso/TUwhyQVJXyI/AAAAAAAABQ8/7Vr3QRUEWG8/s72-c/tux-100.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3197898050854484405</id><published>2011-01-18T14:51:00.001-05:00</published><updated>2011-07-13T17:52:29.022-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libertad'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><title type='text'>Software libre</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/TOX910qHpkI/AAAAAAAABOg/vfsS5u2gJfU/s1600/Volunteer_Helping_Hands1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/TOX910qHpkI/AAAAAAAABOg/vfsS5u2gJfU/s200/Volunteer_Helping_Hands1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Cuando alguien se entera que hay en el mundo del software gente que contribuye voluntariamente diseñando, programando y probando programas que se distribuyen líbremente, a menudo se oye la pregunta ¿y que ganan ellos haciendo eso?&lt;br /&gt;&lt;br /&gt;Puede ser difícil tratar de explicarle a alguien que te contempla con una mirada esceptica que es lo que ganan. Y la mirada esceptica se vuelve de confusión cuando no aparece mencionado el dinero. Porque eso es en realidad lo que preguntan, ¿de que forma ganan dinero por el trabajo que hacen?&lt;br /&gt;&lt;br /&gt;Cuando uno va comprendiendo la respuesta, se da cuenta de que hay varias cuestiones previas que hay que atender. Cuestiones que tienen que ver con nuestros hábitos culturales.&lt;br /&gt;&lt;br /&gt;La propia pregunta de cuánto dinero se gana por ese trabajo evidencia que damos por supuesto que trabajamos para ganar dinero. 'Por supuesto'. Si es lo que acaba de pensar, puede que al mirar un espejo descubra la mirada esceptica de la que hablo.&lt;br /&gt;&lt;br /&gt;Hay una historia que cuenta de un millonario que estaba de vacaciones paseando por una playa y conversa con un pescador que encontró descansando bajo la sombra. Quizás podrías tener un bote más, le sugirió. ¿Para qué?, le preguntó el pescador. Podrías pescar más y tener más dinero. ¿Para qué?. Con el tiempo podrías tener una flota de barcos, y mucho dinero. ¿Para qué?. Cuando te retiraras, podrías descansar tranquilo y pasar el tiempo que quisieras con tu familia. Pero, eso es lo que estoy haciendo ahora.&lt;br /&gt;&lt;br /&gt;A fin de cuentas, trabajamos por lo que queremos realizar con el dinero, pero llega a ser tan complicado obtenerlo y administrarlo que acabamos en medio del camino. Para dificultarlo más, realmente hay muchísima gente que, por diversas razones, trabaja en cosas que no les gusta, y llegan a pensar que el trabajo es simplemente algo que hay que hacer para obtener dinero.&lt;br /&gt;&lt;br /&gt;La razón por la que hay gente que realiza trabajo voluntario sin recibir dinero es que recibe algo más. Cuando alguien disfruta el trabajo que hace, diseñando, programando, probando, el sólo hacerlo ya es una recompensa en sí misma. A esto se suma el producto que se logra; algo único, que encontró su propio camino, con la sinergía de todos. Es como si todos juntos construyeran una casa. Una sola persona no haría mucho con el salario que podria recibir por su trabajo. Tampoco nadie podría pagar la suma de todos los salarios. En la cultura ortodoxa de trabajar por dinero, el proyecto es imposible. Sin embargo, al trabajar por lo que realmente se quiere realizar, se realiza la casa.&lt;br /&gt;&lt;br /&gt;Internet ha ayudado mucho a que este tipo de trabajo comunitario sea posible, porque facilita una forma de organización horizontal, distribuida, descentralizada. Es el tipo de organización con la capacidad de adaptación y el poder conjunto (pero no junto) que se necesita para cambiar el mundo en el lugar que queremos realizar. En estos proyectos, la libertad está no sólo en el software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3197898050854484405?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3197898050854484405/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/01/software-libre.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3197898050854484405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3197898050854484405'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/01/software-libre.html' title='Software libre'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/TOX910qHpkI/AAAAAAAABOg/vfsS5u2gJfU/s72-c/Volunteer_Helping_Hands1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2122159924631843762</id><published>2011-01-03T10:20:00.002-05:00</published><updated>2011-07-13T17:47:11.698-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gráficos'/><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><title type='text'>Pintar un grid con Photoshop</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TSHptmCRWCI/AAAAAAAABPs/h3_1N5t3j4k/s1600/photoshop-grid.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TSHptmCRWCI/AAAAAAAABPs/h3_1N5t3j4k/s1600/photoshop-grid.png" /&gt;&lt;/a&gt;&lt;/div&gt;1&lt;br /&gt;Definir el patrón del grid.&lt;br /&gt;Por ejemplo, para un grid de 100x100 se puede crear un nuevo documento, de 100x100 pixels. Luego hacer doble click en el layer Background (para desbloquearlo y se llame Layer 0). Después hacer doble click en el layer Layer 0 (para entrar a Layer Style) y allí elegir el estilo Stroke, Position: Center, Size: 1px.&lt;br /&gt;Finalmente, Menú, Edit, Define pattern..., y dar un nombre, por ejemplo, &lt;i&gt;Grid100x100&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;2&lt;br /&gt;Aplicar el patrón.&lt;br /&gt;Abrir la imagen sobre la que se quiere pintar el grid. Ir a Channels, agregar un nuevo canal. Puede cambiarle el nombre (por default Alpha 1) a algo como &lt;i&gt;Grid&lt;/i&gt;.&lt;br /&gt;Seleccionar el canal y rellenarlo con el patrón: Menú, Edit, Fill..., Contents {Use: Pattern, elegir el patrón previamente definido}. Volver a seleccionar todos los canales que se hubieran deseleccionado.&lt;br /&gt;Volver a Layers y agregar una nueva capa para pintar el grid. Se pintará usando una selección como máscara: Menú, Select, Load selection..., Source {Channel: Grid100x100}. Puede aprovechar y elegir Invert de una vez (para invertir la selección), o hacerlo en un siguiente paso (Menú, Select, Inverse).&lt;br /&gt;Colorear la seleccion. Una forma es usando ALT+BACKSPACE. Otra forma es Menú, Edit, Fill..., Contents {Use: Color, elegir un color}.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Referencias&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.bolducpress.com/tutorials/how-to-create-a-grid-quickly-and-easily-with-photoshop/"&gt;How to create a grid quickly and easily with Photoshop&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2122159924631843762?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2122159924631843762/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/01/pintar-un-grid-con-photoshop.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2122159924631843762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2122159924631843762'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/01/pintar-un-grid-con-photoshop.html' title='Pintar un grid con Photoshop'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TSHptmCRWCI/AAAAAAAABPs/h3_1N5t3j4k/s72-c/photoshop-grid.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-1877141106586257845</id><published>2011-01-02T16:31:00.001-05:00</published><updated>2011-01-02T16:34:05.900-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inicio'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Entrada directa al escritorio con Windows 7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S5ao77NwGDI/AAAAAAAAAYo/O3iLMZ_jSRw/s1600/windows7_01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S5ao77NwGDI/AAAAAAAAAYo/O3iLMZ_jSRw/s200/windows7_01.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Al iniciarse Windows 7, puede ser que se detenga en una pantalla de usuarios antes de llegar al escritorio. Allí aparecen los iconos de cada usuario disponible, permitiendo elegir alguno para entrar, posiblemente con una contraseña.&lt;br /&gt;&lt;br /&gt;Sin embargo, puede ser que, en su caso, no requiera esta seguridad, y esa pantalla signifique en el proceso de inicio una etapa extra que quisiera evitar.&lt;br /&gt;&lt;br /&gt;Si es así, puede lograrlo ejecutando (Menú Inicio, Ejecutar) la orden:&lt;br /&gt;&lt;br /&gt;control userpasswords2&lt;br /&gt;&lt;br /&gt;Esto abrirá una caja de diálogo que muestra las cuentas del usuario. Hay que elegir el nombre de usuario con que usualmente ingresa (si hubiera más de uno), y desmarcar ahí la casilla que indica que los usuarios deben ingresar un nombre y contraseña para entrar. Cuando se le solicite una contraseña para asignar al usuario que seleccionó, puede dejar en blanco tanto el primer campo como su confirmación para indicar que no usará contraseña.&lt;br /&gt;&lt;br /&gt;Luego de eso, salga de Windows y vuelva a entrar. Notará que la pantalla de selección de usuarios ya no aparece y se ingresa directo al escritorio.&lt;br /&gt;&lt;br /&gt;Si, de pronto, quisiera volver a habilitar las contraseñas, use la misma orden y vuelva a marcar la casilla que indica que así sea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-1877141106586257845?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/1877141106586257845/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2011/01/entrada-directa-al-escritorio-con.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1877141106586257845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1877141106586257845'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2011/01/entrada-directa-al-escritorio-con.html' title='Entrada directa al escritorio con Windows 7'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/S5ao77NwGDI/AAAAAAAAAYo/O3iLMZ_jSRw/s72-c/windows7_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3119808160547380289</id><published>2010-11-30T16:06:00.002-05:00</published><updated>2010-11-30T16:08:54.266-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='cs5'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><title type='text'>Solucionando problema de visualización en Photoshop CS5</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TPVnMNKjYoI/AAAAAAAABOs/1Cnp4Mt5ixc/s1600/ps_cs5_startup_logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TPVnMNKjYoI/AAAAAAAABOs/1Cnp4Mt5ixc/s1600/ps_cs5_startup_logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Usando Photoshop CS5 (instalado en Windows 7 con 2 GB de RAM, tarjeta Nvidia Geforce), encontré que al usar CTRL+0 (para hacer que encajara el lienzo en la pantalla) a veces desaparecían los elementos de la imagen.&lt;br /&gt;&lt;br /&gt;Para volverlos a ver, lo solucionaba probando otras opciones de zoom, como CTRL+1 o CTRL++ o CTRL+-, o desmarcando/marcando los iconos de visualización de los layers.&lt;br /&gt;&lt;br /&gt;Busqué un poco en Google y me pareció que podía deberse a un problema con la tarjeta gráfica. Tal vez no tenía tanta memoria.&lt;br /&gt;&lt;br /&gt;Entré al menú de Photoshop, Edit, Preferences, Performance, GPU Settings, Advanced Settings, Mode: Basic (antes estaba en Normal) para que use menos memoria.&lt;br /&gt;&lt;br /&gt;Reinicié el programa y ahora funciona bien el zoom con CTRL+0.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Referencia:&amp;nbsp;&lt;a href="http://kb2.adobe.com/cps/404/kb404898.html"&gt;http://kb2.adobe.com/cps/404/kb404898.html&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3119808160547380289?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3119808160547380289/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/11/solucionando-problema-de-visualizacion.html#comment-form' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3119808160547380289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3119808160547380289'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/11/solucionando-problema-de-visualizacion.html' title='Solucionando problema de visualización en Photoshop CS5'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TPVnMNKjYoI/AAAAAAAABOs/1Cnp4Mt5ixc/s72-c/ps_cs5_startup_logo.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3749344899444836269</id><published>2010-11-30T14:27:00.005-05:00</published><updated>2011-07-13T17:41:32.192-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Cómo obtener las partes de una ruta usando javascript</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/TPVPigkfQ2I/AAAAAAAABOo/gEH24HFUdLY/s1600/split.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/TPVPigkfQ2I/AAAAAAAABOo/gEH24HFUdLY/s1600/split.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Una ruta como http://par1/par2/par3/par4/par5 se puede separar en php usando algo como &lt;a href="http://www.php.net/manual/es/function.explode.php"&gt;explode()&lt;/a&gt;.&lt;br /&gt;En javascript, una forma de hacerlo es usando &lt;a href="http://www.w3schools.com/jsref/jsref_split.asp"&gt;split()&lt;/a&gt;.&amp;nbsp;Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var path = 'http://par1/par2/par3/par4/par5';&lt;br /&gt;var parts = path.split('/');&lt;br /&gt;var n = parts.length;&lt;br /&gt;var par5 = parts[n-1];&lt;br /&gt;var par4 = parts[n-2];&lt;br /&gt;var par3 = parts[n-3]; // y así sucesivamente...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;&lt;a href="http://drupalab.kobaonline.com/portal/content/como-obtener-partes-ruta-usando-javascript"&gt;Vea el artículo original en DrupaLab&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3749344899444836269?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3749344899444836269/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/11/como-obtener-las-partes-de-una-ruta.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3749344899444836269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3749344899444836269'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/11/como-obtener-las-partes-de-una-ruta.html' title='Cómo obtener las partes de una ruta usando javascript'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/TPVPigkfQ2I/AAAAAAAABOo/gEH24HFUdLY/s72-c/split.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-8577014326746499189</id><published>2010-09-23T15:16:00.003-05:00</published><updated>2010-09-23T15:19:21.007-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Conociendo PHP (actualizado)</title><content type='html'>ESTE AÑO repetí en el Insituto José Pardo la conferencia sobre PHP que hice el año pasado.&lt;br /&gt;&lt;br /&gt;Actualicé un poco el powerpoint, que está disponible en SlideShare y tambien en &lt;a href="http://www.scribd.com/doc/38023886/Conociendo-PHP-201009"&gt;Scribd.&lt;/a&gt;&lt;br /&gt;&lt;div id="__ss_5253311" style="width: 425px;"&gt;&lt;b style="display: block; margin: 12px 0pt 4px;"&gt;&lt;a href="http://www.slideshare.net/akobashikawa/conociendo-php-201009" title="Conociendo php (201009)"&gt;Conociendo php (201009)&lt;/a&gt;&lt;/b&gt;&lt;object height="355" id="__sse5253311" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=conociendophp-201009-100921183415-phpapp02&amp;stripped_title=conociendo-php-201009&amp;userName=akobashikawa" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5253311" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=conociendophp-201009-100921183415-phpapp02&amp;stripped_title=conociendo-php-201009&amp;userName=akobashikawa" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0pt 12px;"&gt;Vea más &lt;a href="http://www.slideshare.net/"&gt;presentaciones&lt;/a&gt; de &lt;a href="http://www.slideshare.net/akobashikawa"&gt;Antonio Kobashikawa Carrasco&lt;/a&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/19875758-8577014326746499189?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/8577014326746499189/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/09/conociendo-php-actualizado.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8577014326746499189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8577014326746499189'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/09/conociendo-php-actualizado.html' title='Conociendo PHP (actualizado)'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7350948386441985431</id><published>2010-09-17T23:34:00.001-05:00</published><updated>2010-09-17T23:35:26.516-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gadget'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><category scheme='http://www.blogger.com/atom/ns#' term='sidebar'/><title type='text'>Solucionando los gadgets flash de Windows 7 64b</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TJRBQ9wcVvI/AAAAAAAABNU/FjL55y8lWoo/s1600/windows7_01.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TJRBQ9wcVvI/AAAAAAAABNU/FjL55y8lWoo/s200/windows7_01.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Ocurre que en Windows 7-64b puede haber algunos problemas para correr gadgets que requieran flash.&lt;br /&gt;&lt;br /&gt;Al intentar correrlos aparece un diálogo pidiéndonos permiso para correr Flash, acepto, pero nada parece ocurrir.&lt;br /&gt;&lt;br /&gt;La solución la encontré en este post:&amp;nbsp;&lt;a href="http://www.sevenforums.com/customization/1499-windows-7-7000-x64-sidebar-flash-player-fix.html#post863632"&gt;http://www.sevenforums.com/customization/1499-windows-7-7000-x64-sidebar-flash-player-fix.html#post863632&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Allí, se facilita un parche que, al ser ejecutado, soluciona el problema:&amp;nbsp;&lt;a href="http://www.sevenforums.com/attachments/customization/87586d1280161565-windows-7-7000-x64-sidebar-flash-player-fix-windows_64bit_sidebar_flash_support.exe"&gt;http://www.sevenforums.com/attachments/customization/87586d1280161565-windows-7-7000-x64-sidebar-flash-player-fix-windows_64bit_sidebar_flash_support.exe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A mi me ocurrió que el archivo que descargué tenía la extensión .download, en lugar del .exe esperado. Felizmente fue cuestión de renombrarlo y ponerle la extensión correcta para poder ejecutarlo.&lt;br /&gt;&lt;br /&gt;Por si acaso, también está disponible en este enlace:&amp;nbsp;&lt;a href="http://ifile.it/q456acu/Windows_64bit_Sidebar_Flash_Support.exe"&gt;http://ifile.it/q456acu/Windows_64bit_Sidebar_Flash_Support.exe&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7350948386441985431?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7350948386441985431/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/09/solucionando-los-gadgets-flash-de.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7350948386441985431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7350948386441985431'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/09/solucionando-los-gadgets-flash-de.html' title='Solucionando los gadgets flash de Windows 7 64b'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TJRBQ9wcVvI/AAAAAAAABNU/FjL55y8lWoo/s72-c/windows7_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6304213447241053138</id><published>2010-09-17T16:35:00.001-05:00</published><updated>2010-09-17T16:38:51.667-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ebook'/><title type='text'>jQuery Fundamentals</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TJPfxG0QArI/AAAAAAAABNM/p-rfo-af2-A/s1600/jquery-logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TJPfxG0QArI/AAAAAAAABNM/p-rfo-af2-A/s1600/jquery-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://jqfundamentals.com/book/book.html"&gt;jQuery Fundamentals&lt;/a&gt;&lt;br /&gt;Por Rebecca Murphey. Es un libro online introductorio a jQuery. Me parece muy bueno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6304213447241053138?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6304213447241053138/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/09/jquery-fundamentals.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6304213447241053138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6304213447241053138'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/09/jquery-fundamentals.html' title='jQuery Fundamentals'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TJPfxG0QArI/AAAAAAAABNM/p-rfo-af2-A/s72-c/jquery-logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3493894875294637339</id><published>2010-09-08T13:56:00.003-05:00</published><updated>2010-09-08T13:59:51.631-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agil'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Ágiles 2010: 3ras Jornadas Latinoamericanas sobre Metodologías Ágiles</title><content type='html'>Ágiles 2010 es una excelente oportunidad para encontrase con&lt;br /&gt;profesionales de IT de la región, interesados en compartir sus&lt;br /&gt;experiencias, debatir y capacitarse en temas relacionados con el&lt;br /&gt;desarrollo de software a través del uso de metodologías ágiles.&lt;br /&gt;&lt;br /&gt;Esta tercera edición, con sede en la ciudad de Lima, Perú, contará&lt;br /&gt;con la presencia de especialistas locales e internacionales, quienes&lt;br /&gt;compartirán su conocimiento durante los cuatro días que durará el&lt;br /&gt;evento.&lt;br /&gt;&lt;br /&gt;El programa incluye distintos tipos de actividades: presentaciones,&lt;br /&gt;sesiones interactivas, talleres y espacios abiertos de debate.&lt;br /&gt;&lt;br /&gt;Entre los invitados internacionales se encuentran los keynote&lt;br /&gt;speakers Lee Devin y Joshua Kerievsky, que también estarán brindando&lt;br /&gt;cursos durante el evento.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://agiles2010.agiles.org/wp-content/uploads/2010/04/banner-es.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://agiles2010.agiles.org/wp-content/uploads/2010/04/banner-es.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;¡&lt;a href="http://agiles2010.agiles.org/lang/es/inscripcion/"&gt;Inscríbete&lt;/a&gt; y se parte de Ágiles 2010! &lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3493894875294637339?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3493894875294637339/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/09/agiles-2010-3ras-jornadas.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3493894875294637339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3493894875294637339'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/09/agiles-2010-3ras-jornadas.html' title='Ágiles 2010: 3ras Jornadas Latinoamericanas sobre Metodologías Ágiles'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4129284503275732796</id><published>2010-09-02T15:56:00.004-05:00</published><updated>2010-09-02T17:04:48.620-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><title type='text'>CHM Reader en Firefox</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/TIAPbFXZQaI/AAAAAAAABME/ip3EjCqby28/s1600/chm.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/TIAPbFXZQaI/AAAAAAAABME/ip3EjCqby28/s320/chm.png" /&gt;&lt;/a&gt;&lt;/div&gt;El tipo de archivo .chm es el que tienen típicamente los archivos de ayuda en Windows. También hay algunos textos que se distribuyen de ese modo. Allí, basta con hacerles doble clic y aparecerá dentro de un navegador especial (el Control de Ayuda HTML), que nos permite explorar el documento y leerlo.&lt;br /&gt;&lt;br /&gt;Sin embargo, puede ser algo bastante incómodo. A veces las letras son demasiado pequeñas. Para hacer crecer la fuente del navegador CHM hay que hacer un cambio en las opciones de Internet del sistema, lo que afectará a Internet Explorer, por ejemplo.&lt;br /&gt;&lt;br /&gt;Otras veces, podemos toparnos con un CHM que, por alguna razón, no son abiertos adecuadamente por el navegador CHM.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Esto puede ocurrir porque el CHM está bloqueado. Para desbloquearlo, hacerle click con el botón secundario del mouse, entrar a Propiedades y elegir Desbloquear.&lt;/i&gt;&lt;/blockquote&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/TIAOwQQJbJI/AAAAAAAABL8/nXh-_eXhiTU/s1600/firefox.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/TIAOwQQJbJI/AAAAAAAABL8/nXh-_eXhiTU/s320/firefox.png" /&gt;&lt;/a&gt;Una alternativa bastante útil es usar CHM Reader, una extensión para Firefox (un motivo más para usarlo). Luego de instalar &lt;a href="http://www.mozilla.com/firefox"&gt;Firefox&lt;/a&gt;, si es que no lo está usando aún, puede instalar CHM Reader entrándo a &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3235/"&gt;https://addons.mozilla.org/en-US/firefox/addon/3235/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Después de eso, aparecera en el menú la nueva opción File, Open CHM File (Archivo, Abrir archivo CHM).&lt;br /&gt;&lt;br /&gt;Luego podrá usar CTRL+ y CTRL- para aumentar o disminuir el tamaño de las fuentes. También podrá abrir los CHM problemáticos (al menos como con los que me he topado).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-4129284503275732796?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4129284503275732796/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/09/chm-reader-en-firefox.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4129284503275732796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4129284503275732796'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/09/chm-reader-en-firefox.html' title='CHM Reader en Firefox'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/TIAPbFXZQaI/AAAAAAAABME/ip3EjCqby28/s72-c/chm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-4518558289845776172</id><published>2010-08-27T00:17:00.008-05:00</published><updated>2010-10-26T08:38:50.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='gráficos'/><title type='text'>Un mapa con Raphael</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/THdVyweqr6I/AAAAAAAABLc/BSf1k8xASfE/s1600/Raphael_1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/THdVyweqr6I/AAAAAAAABLc/BSf1k8xASfE/s200/Raphael_1.jpg" width="146" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://raphaeljs.com/"&gt;Raphäel&lt;/a&gt;&amp;nbsp;es una biblioteca javascript que permite incorporar a la página imágenes vectoriales.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Píxeles y vectores&lt;/h2&gt;A diferencia de una fotografía formada por pixeles, una imagen vectorial está determinada por vectores. Mientras que hay que guardar la información de cada pixel, en el caso de los vectores sólo hay que guardar la información de sus extremos o puntos notables; los demás serán calculados a partir de ellos.&lt;br /&gt;&lt;br /&gt;Eso permite que una imagen vectorial ocupe, en general, mucho menos espacio en disco que una imagen fotográfica. Además, se escala y siempre está nítida. No ocurre el 'pixeleo' que se suele notar en las fotos cuando se fuerza una ampliación.&lt;br /&gt;&lt;br /&gt;Esas características hacen que sean una opción atractiva para gráficos web. Flash, por ejemplo, usa imágenes vectoriales.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;SVG&lt;/h2&gt;SVG es un estándar XML para imágenes vectoriales en web. Raphael se apoya príncipalmente en ese estandar, de modo que cada elemento gráfico sea parte del DOM (el árbol XML que representa la página web), y provee adaptadores para compatibilidad entre navegadores (todavía no todos los navegadores soportan SVG del mismo modo).&lt;br /&gt;&lt;br /&gt;El que un elemento gráfico sea parte del DOM permite manipularlo con javascript.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Usando Raphael&lt;/h2&gt;¿Qué tan fácil de usar es Raphael? Bueno, la entrada me pareció relativamente sencilla. Declarar la biblioteca raphael.js, un canvas y luego crear elementos gráficos como rectángulos, círculos, etc.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script type="text/javascript" src="js/jquery-1.4.2.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script type="text/javascript" src="js/raphael-min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$(function() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var paper = Raphael('canvas', 800, 600);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var circle = paper.circle(150, 150, 100);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var circle2 = paper.circle(150, 450, 100);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var ellipse = paper.ellipse(150, 150, 100, 50);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var ellipse2 = paper.ellipse(150, 150, 50, 100);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var ellipse3 = paper.ellipse(350, 350, 50, 100);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var rect = paper.rect(0, 0, 800, 600);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var rect2 = paper.rect(50, 50, 200, 200);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var rect3 = paper.rect(270, 50, 200, 200, 20);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var image = paper.image('images/bee.jpg', 490, 50, 100, 75);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var set = paper.set();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;set.push(circle, rect3);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;set.attr({fill: "gold"});&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var text = paper.text(150, 280, 'Hello World!\nLos niños de Andalucía');&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var path = paper.path("M50 50L250 250");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var path2 = paper.path("M250 50L50 250");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;//paper.clear();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;circle.paper.path("M10,10L50,50M50,10L10,50")&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.attr({stroke: "red"});&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;ellipse2.remove();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;ellipse2.show(); // not show because previous remove&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;ellipse.hide();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;ellipse.show();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;rect3.rotate(10);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;image.rotate(80, 490, 50);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;image.translate(100, 0);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;image.scale(1.1, 1.1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;image.animate({'translation':'-100, 10'}, 1000, 'bounce');&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;circle2.animate({&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"20%": {cx: 20, r: 20, easing: "&amp;gt;"},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"50%": {cx: 70, r: 120, callback: function () {}},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"100%": {cx: 10, r: 10}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}, 2000);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var c = paper.circle(200, 200, 50),&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = paper.rect(200, 200, 50, 50);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;c.animate({cx: 20, r: 20}, 2000);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;r.animateWith(c, {x: 20}, 2000);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var path3 = paper.path("M300,300c0,100 100-100 100,0c0,100 -100-100 -100,0z");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;var spot = paper.circle(300, 300, 4).attr({fill: 'red'});&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;spot.animateAlong(path3, 4000);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div id="canvas"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;El paso siguiente, la interactividad y el manejo de eventos sí me pareció más complicado:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;circle.drag(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;function(dx, dy) {// move&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;this.attr({cx: this.ox + dx, cy: this.oy + dy, opacity: .5});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;function() {// start&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;this.ox = this.attr("cx");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;this.oy = this.attr("cy");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;this.attr({opacity: .5});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;function() {// up&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;this.attr({opacity: 1});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;La propiedad .node permite manipular un elemento con jQuery. Sin embargo, tardé un poco en comprender que es mejor usar las funciones de manejo de eventos que provee Raphael, al menos para los gráficos. Resulta más simple y claro.&lt;br /&gt;&lt;br /&gt;En el caso del drag, notar que se requieren tres funciones, que definen las acciones para move, start y up (en ese orden). La función que corresponde a move tiene los parámetros dx y dy (los diferenciales de movimiento), y la que corresponde a start tiene los parámetros ox y oy (el punto donde se hace click). Mientras se arrastra el objeto, dx y dy crecen contínuamente, así que implementar el drag no es tan simple como hacer un translate(dx, dy) (hacerlo provoca un desconcertante efecto acelerado), sino que hay que reflexionar un poco, como en el ejemplo, que los suma a la posición inicial.&lt;br /&gt;&lt;br /&gt;Para el ejemplo del mapa, tardé varios días en descubrir el modo de usar hover y drag para que funcionaran como quería.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-size: 24px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: medium; font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;El mapa&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/THdW3rmxIoI/AAAAAAAABLk/aQLK1BnMGQE/s1600/mapa_raphael.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/THdW3rmxIoI/AAAAAAAABLk/aQLK1BnMGQE/s320/mapa_raphael.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La idea es tener el mapa del Perú con sus departamentos, y que estos se resalten al pasar el mouse sobre ellos. Al hacer click en alguno, se dispara alguna acción, por ejemplo mostrar su nombre en una caja.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Puede ver el demo&amp;nbsp;&lt;a href="http://www.kobaonline.com/rulo/jquery/jquery_garden/mapa-peru-raphael/"&gt;aquí&lt;/a&gt;, y descargar el código fuente&amp;nbsp;&lt;a href="http://www.kobaonline.com/rulo/jquery/"&gt;aquí&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Raphael se puede usar sólo, pero es de ayuda ayuda usar también jquery.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;style type="text/css"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;body {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background-color: #222;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;color: white;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;#wrapper {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_position: absolute;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_top: 50%;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;#container {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;background-color: black;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;width: 700px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;height: 500px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;position: absolute;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;top: 0; right: 0; bottom: 0; left: 0;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;margin: auto;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;overflow: hide;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_position: relative;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_margin: 0 auto;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_top: -50%;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;_overflow: none;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;.info {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;display: none;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;text-align: center;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;font-family: "Century Gothic", Helvetica, "Bitstream Vera Sans", sans-serif;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;font-size: 24pt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;line-height: 100px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;#infobox {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;border: 1px solid #ccc;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;position: absolute;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;top: 150px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;left: 350px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;width: 300px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;height: 100px;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;overlay: auto;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;#test {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;display: none;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;color: #0f0;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;$(function() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//http://www.switchonthecode.com/tutorials/xml-parsing-with-jquery&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$.ajax({&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;type: 'GET',&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;url: 'images/peru-h500.xml',// .svg renamed .xml for IE support&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;dataType: 'xml',&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;success: function(xml) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var r = Raphael('canvas', 700, 500);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var map = {};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var map_set = r.set();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var active_fill = 'gold';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var active_stroke = 'white';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var normal_fill = $('body').css('background-color');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var normal_stroke = '#ccc';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var active = null;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$(xml).find('path').each(function() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var id = (String)($(this).attr('id'));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var path = (String)($(this).attr('d'));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map[id] = r.path(path)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.attr({fill:normal_fill, stroke: normal_stroke})&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.drag(&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// dx,dy van incrementandose&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// aqui calculo el diferencial continuamente&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;function(dx, dy) {// move&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.translate(dx-this.dx, dy-this.dy);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.dx = dx;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.dy = dy;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//$('#test').html(dx+'--'+dy);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;},&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;function(ox, oy) {// start&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//this.ox = ox;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//this.oy = oy;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.dx = 0;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.dy = 0;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.toFront();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.attr({opacity: .5});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//$('#test').html(ox+'-'+oy);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;},&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;function() {// up&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// regresa a la posición original&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.translate(-this.dx, -this.dy);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.attr({opacity: 1});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Este bloque lo hacia en un .click()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// pero mejor aqui para que tambien funcione en IE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// restablecer activo previo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (active) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active.animate({fill: normal_fill, stroke: normal_stroke}, 500, '&amp;gt;');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// activar actual&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = this;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active.animate({fill: this.color, opacity: 1}, 500, '&amp;gt;');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ocultar otras info&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$('.info').hide();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// mostrar info actual&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$('#'+id).show().css('background-color', this.color);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.hover(function() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.color = Raphael.getColor();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (this!=active) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.animate({fill: this.color, stroke: active_stroke}, 500, '&amp;gt;');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}, function() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (this!=active) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.animate({fill: normal_fill, stroke: normal_stroke}, 500, '&amp;gt;');&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;})&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_set.push(map[id]);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});// end each&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;} // end success&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;});&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/script&amp;gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;div id="wrapper"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div id="container"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;div id="canvas"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;div id="test"&amp;gt;[TEST]&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;div id="infobox"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div class="info" style="display:block;"&amp;gt;Perú&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Arequipa" class="info"&amp;gt;Arequipa&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Ancash" class="info"&amp;gt;Ancash&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Apurimac" class="info"&amp;gt;Apurímac&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Ica" class="info"&amp;gt;Ica&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Lima" class="info"&amp;gt;Lima&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Ayacucho" class="info"&amp;gt;Ayacucho&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Piura" class="info"&amp;gt;Piura&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Lambayeque" class="info"&amp;gt;Lambayeque&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Tumbes" class="info"&amp;gt;Tumbes&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Tacna" class="info"&amp;gt;Tacna&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Puno" class="info"&amp;gt;Puno&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Huancavelica" class="info"&amp;gt;Huancavelica&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Cuzco" class="info"&amp;gt;Cuzco&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Junin" class="info"&amp;gt;Junín&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Ucayali" class="info"&amp;gt;Ucayali&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Pasco" class="info"&amp;gt;Pasco&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Huanuco" class="info"&amp;gt;Huánuco&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="San_Martin" class="info"&amp;gt;San Martín&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Cajamarca" class="info"&amp;gt;Cajamarca&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Amazonas" class="info"&amp;gt;Amazonas&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="La_Libertad" class="info"&amp;gt;La Libertad&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Loreto" class="info"&amp;gt;Loreto&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Moquegua" class="info"&amp;gt;Moquegua&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Madre_de_Dios" class="info"&amp;gt;Madre de Dios&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div id="Titicaca" class="info"&amp;gt;Lago Titicaca&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;En los estilos aparecen #wrapper y #container para la técnica que permite centrar el #container absolutamente en la ventana.&lt;/li&gt;&lt;li&gt;También verá un div #test, que uso durante el desarrollo como consola de salida.&lt;/li&gt;&lt;li&gt;En un comienzo, copié a mano cada path (el atributo path.d dentro del .svg). Luego me pareció más práctico cargarlos desde un archivo.&lt;br /&gt;Aquí los he cargado de un archivo svg externo&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;peru-h500.xml&lt;br /&gt;Originalmente se llamaba peru-h500.svg, pero lo renombré cuando descubrí que IE8 no lo procesaba como .svg.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;El svg base lo obtuve de &lt;a href="http://en.wikipedia.org/wiki/File:Scalable_Vectorized_Adminstrative_Map_of_Per%C3%BA_JMK.SVG"&gt;Wikipedia&lt;/a&gt;. Luego use &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt; para dejar sólo los paths que necesitaba.&lt;br /&gt;También corregí los id de los path para que fueran cadenas sin acentos ni espacios en blanco, ya que los iba a usar como claves de los arrays de propiedades que iba a crear.&lt;br /&gt;Algo especialmente complicado en Inkscape fue lograr que desapareciera la transformación translate() para el grupo de paths, y que en su lugar se aplicara a cada valor.&lt;br /&gt;Para ser sinceros, no estoy seguro de como lo logré, pero me parece que funcionó cuando desagrupé, seleccioné los paths, y elegí alinearlos respecto a la página (top y left).&lt;br /&gt;Previamente, para cambiar el tamaño escalé y para cambiar el tamaño del canvas entré a propiedades del documento, fit.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Cuando pruebe el demo, arrastre uno de los departamentos para comprobar el efecto del drag.&lt;/li&gt;&lt;li&gt;He probado esta aplicación en FF5 (3.6.8), Chrome 6, y IE8.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Para mí es muy interesante las cosas que se pueden hacer con SVG y con Raphael. Ojalá este material le sirva de ayuda.&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/19875758-4518558289845776172?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/4518558289845776172/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/08/un-mapa-con-raphael.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4518558289845776172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/4518558289845776172'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/08/un-mapa-con-raphael.html' title='Un mapa con Raphael'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K2xwnQ4Llso/THdVyweqr6I/AAAAAAAABLc/BSf1k8xASfE/s72-c/Raphael_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-198255348766573815</id><published>2010-08-13T15:39:00.001-05:00</published><updated>2010-08-13T15:40:59.005-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Personalizando la pantalla 404 en Apache</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/TGWtYyRGDTI/AAAAAAAABLU/YNdIoSOmytk/s1600/custom_404.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/TGWtYyRGDTI/AAAAAAAABLU/YNdIoSOmytk/s320/custom_404.png" /&gt;&lt;/a&gt;&lt;/div&gt;Cuando se intenta acceder a una dirección que no se reconoce en el site, el webserver responde con una página de Error 404: Document Not Found.&lt;br /&gt;&lt;br /&gt;Es posible personalizar esta página para que sea más informativa o, al menos, más agradable de ver que el mensaje en blanco y negro que viene por default.&lt;br /&gt;&lt;br /&gt;En un servidor web Apache , es posible hacerlo modificando la página de error 404 del sistema, o indicando en su archivo de configuración el nombre de otra que preparemos para usar en su lugar.&lt;br /&gt;&lt;br /&gt;Sin embargo, hay una opción que me parece mas flexible. Es usar un archivo &lt;b&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;.htaccess&lt;/span&gt;&lt;/b&gt; en el directorio, indicando cuál será el archivo que se presentara para el error 404.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;Esto requiere que Apache tenga activado el módulo mod_rewrite y permita el rewrite en ese directorio&lt;/span&gt;. Me parece que suele estar configurado de ese modo en la mayoría de hostings.&lt;br /&gt;&lt;br /&gt;Si se tiene acceso a la configuración de Apache (&lt;b&gt;/etc/httpd/conf/httpd.conf&lt;/b&gt; en Linux CentOS), debe haber un bloque similar a:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;Directory "/var/www/html/mydir"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Options Includes Indexes FollowSymLinks MultiViews&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AllowOverride FileInfo&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Order allow,deny&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Allow from all&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;/Directory&amp;amp;gt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Donde mydir es el directorio donde queremos colocar el .htaccess. También puede ser&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AllowOverride All&lt;/span&gt;, que incluye la opción &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;FileInfo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La configuración afecta al directorio y todos sus subdirectorios, a menos que para ellos se indique otra cosa.&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;.htaccess&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ErrorDocument 404 /error-docs/HTTP_NOT_FOUND.html&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esto indica la página que se presentará cuando ocurra el error 404. &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;La ruta es relativa a la raíz del servidor web, como en un URL&lt;/span&gt;. Por ejemplo, la ruta&amp;nbsp;&lt;b&gt;/error-docs/HTTP_NOT_FOUND.html&lt;/b&gt;, puede corresponder al archivo &lt;b&gt;/var/www/html/error-docs/HTTP_NOT_FOUND.html&lt;/b&gt;.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;En la página 404.html, ya que puede ser llamada desde cualquier ubicación, los url que se usen deben ser absolutos&lt;/span&gt;.&lt;br /&gt;&lt;h2&gt;Páginas de error&lt;/h2&gt;Las principales son:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;b&gt;400: Bad request&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;Cuando el servidor no entiende la solicitud por un error de sintaxis.&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;401: Unauthorized&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;Cuando el usuario no ha sido autenticado para acceder.&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;403: Forbidden&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;El servidor no puede ejecutar la solicitud.&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;404: Not Found&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;El servidor no puede encontrar la direccion solicitada.&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;500: Internal Server Error&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;El servidor ha encontrado una situacion inesperada que no le concretar la respuesta.&lt;/dd&gt; &lt;/dl&gt;Esta es una lista más completa que se podría incluir en el .htaccess:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 400 /error-docs/HTTP_BAD_REQUEST.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 401 /error-docs/HTTP_UNAUTHORIZED.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 403 /error-docs/HTTP_FORBIDDEN.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 404 /error-docs/HTTP_NOT_FOUND.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 405 /error-docs/HTTP_METHOD_NOT_ALLOWED.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 408 /error-docs/HTTP_REQUEST_TIME_OUT.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 410 /error-docs/HTTP_GONE.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 411 /error-docs/HTTP_LENGTH_REQUIRED.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 412 /error-docs/HTTP_PRECONDITION_FAILED.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 413 /error-docs/HTTP_REQUEST_ENTITY_TOO_LARGE.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 414 /error-docs/HTTP_REQUEST_URI_TOO_LARGE.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 415 /error-docs/HTTP_UNSUPPORTED_MEDIA_TYPE.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 500 /error-docs/HTTP_INTERNAL_SERVER_ERROR.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 501 /error-docs/HTTP_NOT_IMPLEMENTED.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 502 /error-docs/HTTP_BAD_GATEWAY.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 503 /error-docs/HTTP_SERVICE_UNAVAILABLE.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;ErrorDocument 506 /error-docs/HTTP_VARIANT_ALSO_VARIES.html&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;Notas de compatibilidad&lt;/h2&gt;Cuando no se define una página de error, el navegador puede presentar su propia versión personalida. Seguramente lo habra notado. Los mensajes de "Página no existe" son diferentes en IE, Firefox, Chrome, etc.&lt;br /&gt;&lt;br /&gt;Algo curioso es que Chrome insistira en presentar su propia versión, a menos que la nuestra tenga al menos 512 bytes de tamaño.&lt;br /&gt;IE7, Firefox 3.6.8 y Safari 5 sí muestran nuestra versión si estuviera disponible.&lt;/div&gt;&lt;h2&gt;Referencias&lt;/h2&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codestyle.org/sitemanager/apache/errors-404.shtml"&gt;http://www.codestyle.org/sitemanager/apache/errors-404.shtml&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.webreference.com/programming/apache_errors/"&gt;http://www.webreference.com/programming/apache_errors/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.thesitewizard.com/webdesign/google-chrome.shtml"&gt;http://www.thesitewizard.com/webdesign/google-chrome.shtml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-198255348766573815?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/198255348766573815/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/08/personalizando-la-pantalla-404-en.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/198255348766573815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/198255348766573815'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/08/personalizando-la-pantalla-404-en.html' title='Personalizando la pantalla 404 en Apache'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/TGWtYyRGDTI/AAAAAAAABLU/YNdIoSOmytk/s72-c/custom_404.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2071811220630364262</id><published>2010-08-13T02:23:00.001-05:00</published><updated>2011-07-13T17:45:13.209-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Una forma de maquetear</title><content type='html'>&lt;div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;h1 id="internal-source-marker_0.5854733549058437"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; font-weight: normal; white-space: pre-wrap;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TGTy_vxpRYI/AAAAAAAABLM/5F-_bU1lVyo/s1600/bola8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TGTy_vxpRYI/AAAAAAAABLM/5F-_bU1lVyo/s320/bola8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="background-color: transparent; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; white-space: normal;"&gt;&lt;span id="internal-source-marker_0.5854733549058437" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;El patrón base de la técnica que describo es usar un elemento posicionado absolutamente dentro de otro posicionado relativamente o absolutamente.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;El uso de una imagen guía de fondo y la aplicación de transparencia a los elementos que queremos calzar es de mucha ayuda para posicionarlos con precisión.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Ojalá le sirva de ayuda en este tipo de tareas. Se agradecen comentarios y sugerencias.&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 id="internal-source-marker_0.5854733549058437"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; font-weight: normal; white-space: pre-wrap;"&gt;Lea más aquí: &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium; font-weight: normal;"&gt;&lt;a href="http://www.scribd.com/doc/35824410/Una-forma-de-maquetear"&gt;http://www.scribd.com/doc/35824410/Una-forma-de-maquetear&lt;/a&gt;&lt;/span&gt;&lt;/h1&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;div id="container"&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/19875758-2071811220630364262?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2071811220630364262/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/08/una-forma-de-maquetear.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2071811220630364262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2071811220630364262'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/08/una-forma-de-maquetear.html' title='Una forma de maquetear'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TGTy_vxpRYI/AAAAAAAABLM/5F-_bU1lVyo/s72-c/bola8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3188052163395293392</id><published>2010-08-10T10:42:00.002-05:00</published><updated>2011-07-13T17:42:47.913-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MockApp: Maquetas para iPhone</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://mockapp.com/wp-content/themes/atahualpa/images/mockapp_logoblue.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://mockapp.com/wp-content/themes/atahualpa/images/mockapp_logoblue.gif" /&gt;&lt;/a&gt;&lt;/div&gt;MockApp ayuda en la tarea de hacer la maqueta de una aplicación para iPhone.&lt;br /&gt;&lt;br /&gt;Hay versiones para Keynote y Powerpoint.&lt;br /&gt;&lt;br /&gt;Básicamente, son presentaciones que podemos reutilizar. Contienen los elementos tipicos de una aplicación para iPhone.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TGF0Nrx8UPI/AAAAAAAABKk/Dybve6dKK-M/s1600/mockapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TGF0Nrx8UPI/AAAAAAAABKk/Dybve6dKK-M/s320/mockapp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Puede descargarla &lt;a href="http://mockapp.com/download/"&gt;aquí&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3188052163395293392?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3188052163395293392/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/08/mockapp-maquetas-para-iphone.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3188052163395293392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3188052163395293392'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/08/mockapp-maquetas-para-iphone.html' title='MockApp: Maquetas para iPhone'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TGF0Nrx8UPI/AAAAAAAABKk/Dybve6dKK-M/s72-c/mockapp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-389684488553036265</id><published>2010-08-04T13:39:00.002-05:00</published><updated>2011-06-28T15:12:30.432-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Desbloquear archivo en Windows 7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/TFmzwAovvbI/AAAAAAAABKU/N4iNGCs3gvQ/s1600/img_locked_file.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/TFmzwAovvbI/AAAAAAAABKU/N4iNGCs3gvQ/s200/img_locked_file.jpg" width="191" /&gt;&lt;/a&gt;&lt;/div&gt;A veces es frustrante cuando se quiere eliminar un archivo y el sistema responde que no es posible porque está siendo usado por otra aplicación. Sobre todo cuando no es evidente cuál es la otra aplicación.&lt;br /&gt;&lt;br /&gt;LockHunter es un programa gratuito que se puede instalar para ayudar a encontrar cuál es la aplicación por la que se realiza el bloqueo, y permitir la eliminación si así lo queremos.&lt;br /&gt;&lt;br /&gt;Disponible tanto para 32 bit como para 64 bit, lo puede encontrar en &lt;a href="http://www.blogger.com/lockhunter.com"&gt;LockHunter.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Crédito de la imágen: &lt;a href="http://www.mysystemtech.com/DataBackup.html"&gt;My System Tech&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-389684488553036265?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/389684488553036265/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/08/desbloquear-archivo-en-windows-7.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/389684488553036265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/389684488553036265'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/08/desbloquear-archivo-en-windows-7.html' title='Desbloquear archivo en Windows 7'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K2xwnQ4Llso/TFmzwAovvbI/AAAAAAAABKU/N4iNGCs3gvQ/s72-c/img_locked_file.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7319978950878939438</id><published>2010-07-28T15:15:00.007-05:00</published><updated>2011-07-13T17:52:54.073-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><title type='text'>Programando una mejor sociedad</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/TFCPr7LDwlI/AAAAAAAABJo/r89IEVJeVE4/s1600/CivilSocietyIcon.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/TFCPr7LDwlI/AAAAAAAABJo/r89IEVJeVE4/s320/CivilSocietyIcon.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Hoy, en Perú, como cada año, el Presidente da un mensaje a la nación.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Mientras lo escucho, reflexiono sobre el significado de las cosas que se hacen. Y el por qué se hacen de ese modo.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Yo no sigo con mucho detalle los acontecimientos políticos ni las noticias. Quizás podría decir que contemplo el panorama, y trato de entender.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;Nacemos siendo habitantes del país de nuestros padres. Aprendemos a ser gobernados por reglas que alguien más creó. Pero luego vamos notando que podemos hacer algo al respecto.&lt;br /&gt;&lt;br /&gt;Nuestro destino está influido por una sociedad que sigue reglas acordadas por ella misma. Es como si la sociedad se programara a sí misma.&lt;br /&gt;&lt;br /&gt;En los detalles, tal vez la mayoría de la gente encuentre que la política y la programación son dos cosas muy diferentes, pero pienso que tienen algunas similitudes que podrían ayudarnos en la búsqueda de una sociedad mejor.&lt;br /&gt;&lt;br /&gt;Qué tan buena es una sociedad. Cómo debería construirse. Qué tan bueno es un programa. Cómo debe construirse.&lt;br /&gt;&lt;br /&gt;En el mundo de la programación tenemos experiencias y propuestas que quizás podrían aplicarse a la construcción de las reglas que guían nuestra sociedad. Principalmente las provenientes del movimiento de software libre, que han mostrado como cosas que antes parecían imposibles en realidad son muy posibles y prácticas. Se decía, por ejemplo, que, como cada vez que se agregaba un programador a un equipo se observaba un retraso en el avance y un aumento en la complejidad del proyecto, había un tamaño que jamás podría superarse. Los proyectos open source, como Linux, con miles de colaboradores alrededor del mundo, mostraron que el límite está determinado por la forma de organizarse. Una forma diferente de organizar el trabajo permitió coordinar el trabajo de muchísima más gente.&lt;br /&gt;&lt;br /&gt;En nuestros proyectos locales, podemos tener la oportunidad de ver como nuestras decisiones afectan el trabajo que hacemos.&amp;nbsp;Podemos ser como el soberano del proyecto de programación que implementamos. Ser el presidente de nuestro código. Y desempeñar también roles equivalentes al del legislador, magistrado, policía, etc. (quizás, cualquier sistema, alcanzado cierto nivel de complejidad, pueda generar roles como esos)&lt;br /&gt;&lt;br /&gt;Algunas veces tenemos las mejores intenciones, y planteamos resolver las cosas de un modo que nos parece bueno, pero luego nos estrellamos con muros que nosotros mismos construimos.&lt;br /&gt;&lt;br /&gt;Después de mucha prueba y error, los programadores han reunido un conjunto de buenas prácticas que sirven como pautas en nuestro trabajo.&amp;nbsp;La experiencia de los miles de programadores en proyectos extensos también ha sido util para los programadores de proyectos más pequeños. Aquí menciono algunas:&lt;br /&gt;&lt;br /&gt;El principio KISS (Keep It Simple as poSible*). Si hay dos maneras de hacer algo, es mejor usar la más simple. ¿Por qué? Cuando algo puede fallar, falla; así que es mejor minimizar el número de cosas que pueden fallar para facilitar el inevitable proceso de mantenimiento y mejora. Además, hay cierto grado de complejidad que los humanos podemos manejar con comodidad. Cuanto más simple, hay más capacidad mental disponible para la creatividad.&lt;br /&gt;&lt;br /&gt;Reutilizar las cosas tanto como sea posible. Si algo funciona bien, no hay que estar repitiendo una y otra vez el mismo trabajo. Sin embargo, tener al mismo tiempo la libertad de reinventar la rueda y proponer alternativas, porque así es como se encuentran mejores opciones que puedan reemplazar a la anterior.&lt;br /&gt;&lt;br /&gt;Minimizar el acoplamiento. Es decir procurar que el cambio que se hace en un componente no requiera hacer cambios coordinados en los demás. Esto facilita su mantenimiento y evolución.&lt;br /&gt;&lt;br /&gt;Me pregunto por los montones de procedimientos que hay en nuestra sociedad. Por las duplicidades y los acoplamientos en las funciones municipales y ministeriales, en la policía y en el serenazgo. Por los pequeños feudos administrativos en los que se convierten las universidades, e incluso las facultades dentro de la misma universidad aunque sea pública. Por las absurdas reglas que se plantean y no se evalúan. Por el sistema de justicia que obliga a pelear una y otra vez las mismas batallas (¿por qué, si la justicia debiera ser igual para todos?). Por las reglas que no se siguen y las coordinaciones que no se hacen porque el protocolo resulta más complejo que el problema que se quiere resolver.&lt;br /&gt;&lt;br /&gt;Las leyes y reglas mál dadas se observan en la práctica, al tratar de ejecutarlas. Igual que los frameworks en programación. Por más buenas intenciones que se hayan tenido al momento de darlas, por más que hayan funcionado en otros casos, para otras personas y otras circunstancias, cuando vemos que no funcionan en nuestro caso particular, debemos aceptar los hechos y tratar de hacer algo constructivo al respecto.&lt;br /&gt;&lt;br /&gt;Es importante que las reglas sean simples, claras en sus intenciones, transparentes en su funcionamiento, y corregibles en su evolución. ¿Son así las leyes que tratan de aplicar en nuestra sociedad?.&lt;br /&gt;&lt;br /&gt;Me parece también importante reconocer que telarañas de complejidad se pueden tejer cuando se trata de aplicar una regla que no se puede cumplir. Imaginemos el ejemplo absurdo de alguien que pusiera la regla de no respirar más de 30 veces por minuto. De pronto, todo el comportamiento de la gente cambiaría radicalmente. La gente no podría correr o hacer mucho esfuerzo porque la conduciría a un acto ilegal. Para verificar el cumplimiento de la norma se necesitaría policías que eligieran individuos sospechos (quizás demasiado chaposos) y les hicieran una auditoría. Seguramente habría excepciones para esos policías (que a veces tendrían que perseguir a los criminales) y los militares y agentes secretos. Aumentaría el trabajo de los jueces y abogados. Líderes sociales reclamarían ampliar el número a 31. Fuerzas conservadoras presionarían para disminuirlo a 29. Aparecerían libros y películas contando anécdotas y actos heroicos al respecto. Con el tiempo, tendríamos demasiada gente cuyo bienestar depende de la existencia de tal regla que, si alguien se preguntara por ella, nos tildarían primero de soñadores, luego de locos, y después de subversivos. Nos amedentrarían hasta que ellos mismos tuvieran una razón para hacerse la misma cuestión. He visto reglas así surgir incluso familias y en pequeños grupos de amigos. ¿Cuántas reglas como esa habrán en nuestra sociedad? Incluso las podrá reconocer en algunos dogmas religiosos.&lt;br /&gt;&lt;br /&gt;Como programadores, podemos experimientar con reglas en las sociedades que representamos en un proyecto de desarrollo de software y aceptar con humildad que funciona y qué no funciona. Podemos tomar nota de ello, ganar experiencia, y desarrollar una intuición que puede servirnos para hacer una mejor tarea cuando tengamos la oportunidad de contribuir por una sociedad mejor.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;* KISS, Keep It Simple, Stupid, era la versión original. Creo que el tono tenía la intención de llamar la atención entre amigos. Aquí uso una versión más cordial.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Crédito de la imágen:&amp;nbsp;&lt;/i&gt;&lt;a href="http://www.canada.com/vancouversun/features/civilsociety/story.html?id=49664dde-c355-4dad-bb9d-1d5232c65a26"&gt;&lt;i&gt;canada.com&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7319978950878939438?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7319978950878939438/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/07/programando-una-mejor-sociedad.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7319978950878939438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7319978950878939438'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/07/programando-una-mejor-sociedad.html' title='Programando una mejor sociedad'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/TFCPr7LDwlI/AAAAAAAABJo/r89IEVJeVE4/s72-c/CivilSocietyIcon.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2206096849584559654</id><published>2010-07-26T23:53:00.002-05:00</published><updated>2010-07-26T23:57:59.797-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='background'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Fondo de página redimensionable</title><content type='html'>&lt;h2&gt;PROBLEMA&lt;/h2&gt;Cómo lograr que el fondo de una página sea redimensionable.&lt;br /&gt;&lt;h2&gt;SOLUCION&lt;/h2&gt;La técnica consiste en colocar un img con un width=100%:&lt;br /&gt;&lt;br /&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;lt;img src="friends-and-moon.jpg" width="100%"/&amp;gt;&lt;/pre&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/pre&gt;&lt;br /&gt;Sin embargo, a menos que se trate de un popup, aparecerán barras  de scroll para permitir ver el resto de la imagen que no esté en  pantalla.&lt;br /&gt;&lt;br /&gt;Para evitar eso, se coloca el img dentro de un div con estilos  adecuados:       &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;body {&lt;br /&gt;  margin:0;&lt;br /&gt;}&lt;br /&gt;#bg {&lt;br /&gt;  width: 100%; height: 100%; left: 0px; top: 0px; position: fixed;&lt;br /&gt;}&lt;br /&gt;#container {&lt;br /&gt;  position: absolute; top: 0; left: 0; width: 100%;&lt;br /&gt;}&lt;br /&gt;&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;&amp;lt;div id="bg"&amp;gt;&amp;lt;img src="friends-and-moon.jpg" width="100%"/&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="container"&amp;gt;&lt;br /&gt;&amp;lt;!-- content --&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;Como se observa, luego el contenido de la página se puede colocar en un div posicionado absolutamente sobre la imagen. De ese modo se simula un fondo de página redimensionable.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;El problema de la presentación del scroll se soluciona de este modo en los navegadores estandar, pero persiste en IE6.&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Puede ver un demo &lt;a href="http://www.kobaonline.com/rulo/demos/resizable-background/"&gt;aquí&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;REFERENCIAS&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://css-tricks.com/how-to-resizeable-background-image/"&gt;How To: Resizeable Background Image&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2206096849584559654?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2206096849584559654/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/07/fondo-de-pagina-redimensionable.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2206096849584559654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2206096849584559654'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/07/fondo-de-pagina-redimensionable.html' title='Fondo de página redimensionable'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6154011392600327534</id><published>2010-07-23T17:51:00.007-05:00</published><updated>2011-07-13T17:40:21.937-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Personalizando bullets</title><content type='html'>&lt;h1&gt;&lt;/h1&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/TEohBxEEVHI/AAAAAAAABJg/VqKW0rvixoU/s1600/us-games-juggling-balls.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/TEohBxEEVHI/AAAAAAAABJg/VqKW0rvixoU/s200/us-games-juggling-balls.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Normalmente, una lista tipo &lt;b&gt;ul&lt;/b&gt; luce así:   &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Item 1&lt;/li&gt;&lt;li&gt;Item 2&lt;/li&gt;&lt;li&gt;Item 3&lt;/li&gt;&lt;/ul&gt;Se puede usar CSS para cambiar el tipo del bullet (que por default es &lt;i&gt;disc&lt;/i&gt;):   &lt;br /&gt;&lt;b&gt;list-style:disc&lt;/b&gt;   &lt;br /&gt;&lt;ul style="list-style: disc outside none;"&gt;&lt;li&gt;Item 1&lt;/li&gt;&lt;li&gt;Item 2&lt;/li&gt;&lt;li&gt;Item 3&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;list-style:circle&lt;/b&gt;   &lt;br /&gt;&lt;ul style="list-style: circle outside none;"&gt;&lt;li&gt;Item 1&lt;/li&gt;&lt;li&gt;Item 2&lt;/li&gt;&lt;li&gt;Item 3&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;list-style:square&lt;/b&gt;   &lt;br /&gt;&lt;ul style="list-style: square outside none;"&gt;&lt;li&gt;Item 1&lt;/li&gt;&lt;li&gt;Item 2&lt;/li&gt;&lt;li&gt;Item 3&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;list-style:none&lt;/b&gt;   &lt;br /&gt;&lt;ul style="list-style: none outside none;"&gt;&lt;li&gt;Item 1&lt;/li&gt;&lt;li&gt;Item 2&lt;/li&gt;&lt;li&gt;Item 3&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;list-style:url(flecha_roja.gif)&lt;/b&gt;   &lt;br /&gt;&lt;ul style="list-style: disc outside url(&amp;quot;http://2.bp.blogspot.com/_K2xwnQ4Llso/TEoakDXJotI/AAAAAAAABJY/-va0l4iHyzI/s1600/flecha_roja.gif&amp;quot;);"&gt;&lt;li&gt;Item 1&lt;/li&gt;&lt;li&gt;Item 2&lt;/li&gt;&lt;li&gt;Item 3&lt;/li&gt;&lt;/ul&gt;Para controlar la posición del bullet, se puede usar la técnica de poner la imagen como fondo del item.&lt;br /&gt;En este ejemplo aplico los estilos en línea, para ilustrar la idea. Sin embargo, en un caso real, lo usual es que use clases y bloques u hojas de estilo para indicar lo mismo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;ul style="list-style:none;"&amp;gt;&lt;br /&gt;&amp;lt;li &lt;br /&gt;  style="background:url(flecha_roja.gif) 1px 2px&lt;br /&gt;  no-repeat; padding-left:10px;"&amp;gt;&lt;br /&gt;  Item 1: Bullet más cerca y centrado&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&lt;br /&gt;  style="background:url(flecha_roja.gif) right 2px&lt;br /&gt;  no-repeat; width: 250px;"&amp;gt;&lt;br /&gt;  Item 2: Bullet a la derecha&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul style="list-style: none outside none;"&gt;&lt;li style="background: url(&amp;quot;http://2.bp.blogspot.com/_K2xwnQ4Llso/TEoakDXJotI/AAAAAAAABJY/-va0l4iHyzI/s1600/flecha_roja.gif&amp;quot;) no-repeat scroll 1px 2px transparent; padding-left: 10px;"&gt;Item 1: Bullet más cerca y centrado&lt;/li&gt;&lt;li style="background: url(&amp;quot;http://2.bp.blogspot.com/_K2xwnQ4Llso/TEoakDXJotI/AAAAAAAABJY/-va0l4iHyzI/s1600/flecha_roja.gif&amp;quot;) no-repeat scroll right 2px transparent; width: 250px;"&gt;Item 2: Bullet a la derecha&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Puede ver un demo en &lt;a href="http://www.kobaonline.com/rulo/demos/html-bullets/"&gt;aquí&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Crédito de la imagen: &lt;a href="http://www.robbinssports.com/sporting-goods-store/images/us-games-juggling-balls.jpg"&gt;http://www.robbinssports.com&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6154011392600327534?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6154011392600327534/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/07/personalizando-bullets.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6154011392600327534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6154011392600327534'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/07/personalizando-bullets.html' title='Personalizando bullets'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/TEohBxEEVHI/AAAAAAAABJg/VqKW0rvixoU/s72-c/us-games-juggling-balls.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3659353697646830763</id><published>2010-07-09T18:01:00.014-05:00</published><updated>2011-04-14T11:10:15.789-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='center'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Cómo centrar un bloque en una página</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TDepqPckZoI/AAAAAAAABJQ/-vgohjV6SS4/s1600/center_in_page.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TDepqPckZoI/AAAAAAAABJQ/-vgohjV6SS4/s320/center_in_page.png" /&gt;&lt;/a&gt;&lt;/div&gt;Centrar un bloque tanto horizontal como verticalmente es algo que se requiere a veces. Lo ideal es que el centrado se acomode automáticamente cuando la ventana del navegador se redimensiona. La solución podría ser más fácil, pero la familia IE, dificulta un poco el problema.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;&lt;i&gt;Nota&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;Estas soluciones funcionan en la mayoría de navegadores, incluso en IE6, pero recientemente encontré que no es así en Safari. Puede encontrar un método alternativo, que funciona en todos los navegadores, en el artículo&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;a href="http://akcdev.blogspot.com/2011/02/como-centrar-un-bloque-en-una-pagina-2.html"&gt;Cómo centrar un bloque en una página 2&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;Soluciones&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;En los navegadores estandar&lt;/b&gt; (principalmente no-IE6), para lograr que un bloque, por ejemplo #content, de 400px por 100px, quede centrado en la página, se le puede aplicar los siguientes estilos:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#content {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 400px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: absolute;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top: 0; right: 0; bottom: 0; left: 0;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin: auto;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; overflow: auto;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El truco aquí es que el margin: auto también sirve para el centrado vertical si se especifica height, position: absolute, y además  top: 0; right: 0; bottom: 0; left: 0;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;Una limitacion de esta solución es que la altura es fija.&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt; El over&lt;/span&gt;flow: auto es para que, cuando el contenido haga que #content sobrepase la altura especificada, aparezca un scroll.&lt;/li&gt;&lt;li&gt;&lt;b&gt;En IE6&lt;/b&gt;, lo anterior no funciona. E&lt;span class="Apple-style-span" style="background-color: white;"&gt;s necesario colocar #content dentro de un #container&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;, &lt;/span&gt;y usar los siguientes estilos:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#container {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: absolute;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top: 50%;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; #content {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 400px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100px;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: relative;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin: 0 auto;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; top: -50%;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; overflow: none;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aqui se usa la técnica de mover el top del #container hacia abajo el 50% de la altura de su contenedor, body, y luego el top del #content 50% hacia arriba de la altura del &lt;b&gt;mismo #content&lt;/b&gt; (debería ser de su contenedor, #container, pero&lt;span class="Apple-style-span" style="background-color: white;"&gt;&amp;nbsp;este es un bug de IE6&lt;/span&gt;, paradójicamente util para resolver este problema mejor que en el caso estándar, pues permite que la altura vaya más allá del inicial de 100px mientras el bloque se acomoda automáticamente siempre en el centro).&lt;/li&gt;&lt;li&gt;&lt;b&gt;En IE7&lt;/b&gt;, lo anterior no funciona (así que hay cosas que funcionan diferente en IE6, IE7 y IE8). Es necesario agregar un #container2, y usar los siguientes estilos:&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#container {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;position: absolute;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;height: 50%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;width: 100%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#container2 {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;width: 100%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;position: absolute;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;bottom: 0; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#content {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;background-color: gold;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;width: 400px;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;height: 100px;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;overflow: auto;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;position: relative;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;margin: 0 auto;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;top: 50%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Para combinar estas soluciones&lt;/b&gt; en un paquete que funcione para ambos casos, se puede usar la &lt;a href="http://wellstyled.com/css-underscore-hack.html"&gt;técnica del hack underscore&lt;/a&gt;.&lt;br /&gt;La idea de la técnica es simple e ingeniosa: Normalmente, una propiedad css que comienza con un _, #, un punto, o un número es ignorada por los navegadores estándar (de hecho, anteponer un número al nombre de la propiedad es un truco util para desactivarla), pero IE6 filtra la cadena quitándole ese primer caracter, si es _ o #, para usárla normalmente. De ese modo, sólo para IE6, &lt;i&gt;_position&lt;/i&gt;, o &lt;i&gt;#position&lt;/i&gt;, se vuelven &lt;i&gt;position&lt;/i&gt;, por ejemplo. Del mismo modo, IE7 filtra el punto y &lt;i&gt;.position&lt;/i&gt; se vuelve &lt;i&gt;position&lt;/i&gt;.&lt;br /&gt;Asi, luego de tener las cosas listas para los navegadores estándar, se puede intentar agregar o sobrescribir lo que necesitemos para IE6 e IE7, como se muestra a continuación:&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#container {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;_position: absolute;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;_top: 50%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.position: absolute;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.height: 50%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.width: 100%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#container2 {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.width: 100%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.position: absolute;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.bottom: 0; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#content {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;background-color: gold;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;width: 400px;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;height: 100px;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;position: absolute;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;top: 0; right: 0; bottom: 0; left: 0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;margin: auto;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;overflow: auto;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;_position: relative;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;_margin: 0 auto;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;_top: -50%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;_overflow: none;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.position: relative;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.margin: 0 auto;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;.top: 50%;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;Referencias&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jakpsatweb.cz/css/css-vertical-center-solution.html"&gt;Vertical Centering in CSS&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-3659353697646830763?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3659353697646830763/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/07/como-centrar-un-bloque-en-una-pagina.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3659353697646830763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3659353697646830763'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/07/como-centrar-un-bloque-en-una-pagina.html' title='Cómo centrar un bloque en una página'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TDepqPckZoI/AAAAAAAABJQ/-vgohjV6SS4/s72-c/center_in_page.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6452197907103329300</id><published>2010-07-04T22:45:00.012-05:00</published><updated>2011-07-13T17:43:03.155-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><title type='text'>Numberguess en Drupal</title><content type='html'>Lea el artículo en &lt;a href="http://drutacora.blogspot.com/2010/07/numberguess-en-drupal.html"&gt;Drutacora: Numberguess en Drupal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6452197907103329300?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6452197907103329300/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/07/numberguess-en-drupal.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6452197907103329300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6452197907103329300'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/07/numberguess-en-drupal.html' title='Numberguess en Drupal'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-787576549585925199</id><published>2010-06-11T15:00:00.001-05:00</published><updated>2010-06-11T15:01:26.958-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='código'/><category scheme='http://www.blogger.com/atom/ns#' term='zen'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Zen Coding para editar HTML+CSS</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://code.google.com/p/zen-coding/logo?cct=1257697522" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://code.google.com/p/zen-coding/logo?cct=1257697522" /&gt;&lt;/a&gt;&lt;/div&gt;Zen Coding permite construir rápidamente bloques de código HTML y CSS a partir de secuencias mnemotecnicas.&lt;br /&gt;&lt;br /&gt;Por ejemplo, html:4s puede expandirse para producir todo el esqueleto de una página HTM4 strict.&lt;br /&gt;&lt;br /&gt;La siguiente secuencia:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;div#page&amp;gt;div.logo+ul#navigation&amp;gt;li*5&amp;gt;a&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Puede ser expandida para producir:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;div id="page"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;div class="logo"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;ul id="navigation"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;li&amp;gt;&amp;lt;a href=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zen Coding es un plugin disponible para Notepad++, Aptana y Dreamweaver, entre otros. Está disponible en&amp;nbsp;&lt;a href="http://code.google.com/p/zen-coding/"&gt;Zen Coding&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Zen Coding con Notepad++&lt;/h2&gt;La versión para Notepad++ puede descargarse de&amp;nbsp;&lt;a href="http://code.google.com/p/zen-coding/downloads/list"&gt;http://code.google.com/p/zen-coding/downloads/list&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En mi caso, descargue&amp;nbsp;Zen.Coding-Notepad++.v0.6.1.zip, cuyo contenido copié en el directorio plugins del árbol de Npp (C:\Program Files (x86)\Dev\Notepad++\plugins).&lt;br /&gt;&lt;blockquote&gt;Zen Coding usa Npp Scripting, que permite extender Npp mediante javascript.&lt;/blockquote&gt;Luego de eso, la siguiente vez que se inicie Npp encontrará el menú Zen Coding.&lt;br /&gt;&lt;br /&gt;El uso básico es sencillo. Puede escribir una secuencia y luego expandirla presionando CTRL+E.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-787576549585925199?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/787576549585925199/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/06/zen-coding-para-editar-htmlcss.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/787576549585925199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/787576549585925199'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/06/zen-coding-para-editar-htmlcss.html' title='Zen Coding para editar HTML+CSS'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-1386455040595055702</id><published>2010-06-01T16:13:00.006-05:00</published><updated>2011-07-13T17:48:37.612-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Montando HTML sobre un flash</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/TAV3-Lpy3DI/AAAAAAAABHw/Q3yFy4RCD20/s1600/flash_html_popup.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/TAV3-Lpy3DI/AAAAAAAABHw/Q3yFy4RCD20/s320/flash_html_popup.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Problema&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;Hay un objeto flash que debe funcionar como un botón que abra una ventana html flotante.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Solución:&lt;/b&gt;&lt;/div&gt;Para abrir una ventana html flotante usaría window.open().&lt;br /&gt;Encuentro que no es posible asociar a un objeto flash (definido con el tag object),un evento onclick.&lt;br /&gt;&lt;br /&gt;Se me ocurre que podría cubrir el objeto flash con un bloque html de las mismas dimensiones al que si pudiera asociar un evento onclick.&lt;br /&gt;&lt;br /&gt;Para eso, me baso en un patrón que aparece en &lt;a href="http://www.cssdesignpatterns.com/Chapter%2001%20-%20MAKING%20CSS%20EASY/index.html"&gt;Pro CSS and HTML Design Patterns&lt;/a&gt;, de Michael Bowers.&lt;br /&gt;Consiste en posicionar absolutamente un div dentro de otro.&lt;br /&gt;&lt;br /&gt;Hago que el div banner_container contenga al objeto flash, pero también al div banner_overlay, que lo cubrirá:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;div id="banner_container"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;div id="banner_overlay"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;object...&amp;gt;...&amp;lt;/object&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;amp;gt&lt;/div&gt;&lt;br /&gt;La clave está en hacer que banner_container tenga position:relative y banner_overlay tenga position:absolute. Además, ambos deben tener las mismas dimensiones del objeto flash, para que lo cubran exactamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#banner_container {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: relative;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 200px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#banner_overlay {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; position: absolute;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 200px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; border: 1px solid #abe;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego, se puede usar javascript sobre el div banner_overlay. Por ejemplo, con jquery:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$(document).ready(function() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#banner_overlay').click(function() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var w = window.open('ventana1.html', 'Ventana 1', 'width=400,height=300');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Puede encontrar un demo &lt;a href="http://www.kobaonline.com/rulo/jquery/"&gt;aquí&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-1386455040595055702?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/1386455040595055702/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/06/montando-html-sobre-un-flash.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1386455040595055702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/1386455040595055702'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/06/montando-html-sobre-un-flash.html' title='Montando HTML sobre un flash'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/TAV3-Lpy3DI/AAAAAAAABHw/Q3yFy4RCD20/s72-c/flash_html_popup.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-831446269045033188</id><published>2010-05-18T11:12:00.000-05:00</published><updated>2010-05-18T11:12:15.555-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='lenguaje'/><category scheme='http://www.blogger.com/atom/ns#' term='código'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>A través del código</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/S_K8TzEnlHI/AAAAAAAABHg/Ws4CQG5PSLA/s1600/seethematrix.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/S_K8TzEnlHI/AAAAAAAABHg/Ws4CQG5PSLA/s320/seethematrix.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Dicen que quien no conoce la historia está condenado a repetirla. Es importante registrar las cosas.&lt;br /&gt;Sin embargo, tiene que haber una forma de visualizar fácilmente aquello que se ha registrado. Para comprenderla. Quizás se debería decir, en realidad, que quien no comprende la historia es quien está condenado a repetirla.&lt;br /&gt;&lt;br /&gt;Por ejemplo, uno puede tener un log con el tráfico de un website, o los mensajes de depuración de un programa, pero si no logra visualizar fácilmente la información contenida en esos registros, no la comprenderá, y se perderá en el papeleo.&lt;br /&gt;&lt;br /&gt;En general, no se trata sólo de la historia. Para comprender algo es importante visualizarlo fácilmente, de alguna manera. La evolución de los lenguajes de programación pueden ser una manifestación de la necesidad de los programadores de comprender más fácilmente un programa. Assembler en lugar de binario. Cobol en lugar de Assembler. O C, Pascal, Basic, Smalltalk, Java, Ruby. Y, dentro de cada uno, algún framework o manera de organizar el código. Diagramas de flujo. UML. Herramientas visuales. Generadores de código. Vamos buscando una manera simple de ver el programa.&lt;br /&gt;&lt;br /&gt;Es tan facil introducir complejidades en la organización del código que los hackers acuñaron la frase KISS ('Keep It Simple, Stupid', 'Mantenlo simple, estúpido'), para recordárnoslo, en tono de broma, pero muy en serio.&lt;br /&gt;&lt;br /&gt;Del mismo modo que es difícil hacer reparaciones en una casa donde las tuberías están ocultas, es difícil reparar código que no está organizado convenientemente.&lt;br /&gt;&lt;br /&gt;Cuando un programa falla, no suele ser una tarea fácil encontrar la causa. Esta no es inmediatamente visible. Hay que bucear en el código. Por eso los buenos programadores tratan que esté limpio y claro. El código que se optimiza y compacta para que quepa en un hardware económico, es uno que ha sido muy probado, porque es demasiado costoso de depurar en esa forma. Es mejor que haya una versión más amplia y clara, donde ocurra el desarrollo, y se haga el empaque de versiones seguras sólamente.&lt;br /&gt;&lt;br /&gt;Es la misma idea que con los programas compilados. Programamos en texto, pero se usa el compilado binario, para que quepa mejor en el hardware. Imagínese tener que depurar diréctamente en el compilado. Por eso la mayoría depura en el texto fuente.&lt;br /&gt;&lt;br /&gt;Quizás lo ideal sería que un programa pudiera ser visualizado como una caja transparente, con el flujo ocurriendo de manera obvia, de modo que fuera fácil encontrar la causa de cierto comportamiento. Quizás lo más importante sería que, al ver con más claridad lo que hay, imaginaríamos con más facilidad lo que podría haber.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-831446269045033188?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/831446269045033188/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/05/traves-del-codigo.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/831446269045033188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/831446269045033188'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/05/traves-del-codigo.html' title='A través del código'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K2xwnQ4Llso/S_K8TzEnlHI/AAAAAAAABHg/Ws4CQG5PSLA/s72-c/seethematrix.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6862909947896074066</id><published>2010-04-30T00:15:00.002-05:00</published><updated>2011-07-13T17:43:29.962-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>La falacia de optimizar a cada paso</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;i&gt;De buenas intenciones está empedrado el camino al infierno.-- refrán popular&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;La optimización prematura es la raíz de todo lo maligno.-- Donald Knuth&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;i&gt;Primero que funcione, luego se mejora.-- refrán hacker&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Hay cierta forma de pensar, cierta filosofía, que convence a las personas de que es bueno optimizar cada paso antes de dar el siguiente. Programar, limpiar, programar, limpiar lo nuevo y lo anterior, programar... y así sucesivamente. Como si dar cada paso marcado perfecto fuera garantía de un buen trabajo.&lt;br /&gt;&lt;br /&gt;Y no es así. Uno podría empeñarse, dando lo mejor de sí, su mejor esfuerzo, para ir derechito al abismo. Es un ejemplo algo extremo, pero ilustra la idea.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Hacer algo y limpiar, hacer algo y limpiar, es una muestra de ese tipo de pensamiento del que hablo. Obsesionado en el control. Imaginando la peor de las posibilidades. Sin confiar. Arrastrándose como esclavo.&lt;br /&gt;&lt;br /&gt;Es algo que está presente no solo en la programación, sino en muchas otras actividades humanas. Hay supervisores que necesitan convencerse de que cada persona esta enfocada en su trabajo para poder estar tranquilos. Parejas que necesitan conocer cada movimiento diario de la otra persona. Padres que no dejan respirar a sus hijos. Es un estilo de pensar desafortunado que muchos heredan y transmiten sin reflexionar mucho en eso. O hasta pensando que es la mejor de las opciones.&lt;br /&gt;&lt;br /&gt;Alguien criado de ese modo, que haya crecido de esa forma, y que viva aún así, puede extrañarse un poco al considerar la valía de las cosas en las que siempre ha creído. Dar cada paso de la mejor manera no asegura un destino correcto; es importante que la ruta sea correcta.&lt;br /&gt;&lt;br /&gt;No puedes estar en medio de la nube y contemplar la forma de la nube al mismo tiempo. No puedes estar adentro y afuera a la vez. Es como tratar de servir a dos amos distintos al mismo tiempo.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/S9pm6YHj0PI/AAAAAAAABGc/n5krwaQQfXY/s1600/2005-07-29_044551_sa1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/S9pm6YHj0PI/AAAAAAAABGc/n5krwaQQfXY/s200/2005-07-29_044551_sa1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Para que sea posible esmerarse en la correcta ejecución de un paso mientras se contempla el panorama, se requiere de dos conciencias. Como cuando un bailarín contempla a su amada sin pensar en los pasos de baile. La parte subconciente se encarga de mover los pies y del ritmo, mientras la parte consciente lo disfruta.&lt;br /&gt;&lt;br /&gt;Para dibujar, pintar, o esculpir mejor, la conciencia debe estar elevada, para sentir aquello que se quiere representar, mientras las manos y los sentidos entrenados se ocupan de los detalles.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S9pnDVqIFcI/AAAAAAAABGk/-rYRyKUb6Ug/s1600/3084394163_6cc007d7c4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S9pnDVqIFcI/AAAAAAAABGk/-rYRyKUb6Ug/s200/3084394163_6cc007d7c4.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Para ir bien por una ruta, hay que visualizarla, sentirla, mientras nuestros pasos la recorren.&lt;br /&gt;&lt;br /&gt;Es necesario ambas conciencias. Pero muchas personas han descuidado esa noción y se encuentran haciendo las cosas sin sentir lo que hacen ni a donde los lleva. Pienso que es porque no han experimentado esa conciencia elevada de la que hablo. No usan sino una solo conciencia, y se afanan en alcanzar la perfección de un trazo, de una pincelada, de un golpe de cincel, sin sentir la obra que están realizando. Y lo triste, a veces, es que se encuentra con otro igual que lo premia ante el mundo, santificando el extravío.&lt;br /&gt;&lt;br /&gt;Programar y optimizar a cada paso es actuar así. Porque, ¿qué sentido tiene la optimización en cada paso?, ¿acaso contribuye a programar mejor o hace más fácil e interesante el camino?. Al contrario, lastra el viaje, y hace que uno vaya a la velocidad de quien camina con lodo hasta las rodillas.&lt;br /&gt;&lt;br /&gt;Digamos que tienes mucho código abierto, explícito, pero lo entiendes y eso te ayuda a avanzar, te da ideas, te inspira. ¿No es mejor eso que código cerrado, que ya no se puede analizar porque está optimizado, que es un rompecabezas depurar, y cuyo sentido se ha perdido entre técnicas para reducir el consumo de memoria o de disco?.&lt;br /&gt;&lt;br /&gt;En un viaje lo más importante no es ahorrar comida y caminar poco. Es más importante encontrar cosas que te permitan avanzar, que te inspiren, que hagan que la comida no importe ni el camino recorrido, sino lo que vives y a dónde te permite llegar.&lt;br /&gt;&lt;br /&gt;Si encontraras un framework que te permitiera comunicarte con la computadora de una manera en que tus ideas fluyeran con soltura, que sintieras la sinergía, la esperanza, las posibilidades surgiendo, eso sería maravilloso. Después ya se podría optimizar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6862909947896074066?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6862909947896074066/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/04/la-falacia-de-optimizar-cada-paso.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6862909947896074066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6862909947896074066'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/04/la-falacia-de-optimizar-cada-paso.html' title='La falacia de optimizar a cada paso'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/S9pm6YHj0PI/AAAAAAAABGc/n5krwaQQfXY/s72-c/2005-07-29_044551_sa1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5590068298731643225</id><published>2010-04-18T23:21:00.016-05:00</published><updated>2010-04-27T16:26:45.624-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agil'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='esquema'/><title type='text'>Un esquema para desarrollo</title><content type='html'>&lt;h3&gt;Lo empírico y lo convencional&lt;/h3&gt;He observado que, cuando hay una solicitud para hacer un sistema, mucha gente se esmera por seguir lo mejor posible cierto modelo de desarrollo. Pero se suele perder en el bosque, porque caminar con ahinco no garantiza que la dirección sea la correcta.&lt;br /&gt;&lt;br /&gt;Cuando algo va mal, casi siempre es posible culpar a la gente. Que no se aplicó el modelo como debía ser. Cómo rebatir eso. Sin embargo, algo hay que hacer. Consideremos que el modelo de desarrollo pueda no ser tan bueno como pensamos. Y probemos.&lt;br /&gt;&lt;br /&gt;En la forma empírica, uno empezaba directamente programando, y adaptando el código poco a poco. Se siente bien recibir el feedback de la computadora con cada paso.&lt;br /&gt;&lt;br /&gt;Cuando uno estudia, le enseñan que es mejor determinar cuál es el problema y modelar cuál es la solución, antes de empezar a programar.&lt;br /&gt;&lt;br /&gt;Si le preguntan a un desarrollador profesional típico, dirá que es mejor la segunda forma, la forma convencional. Yo no estoy completamente de acuerdo. Ni tampoco completamente en desacuerdo.&lt;br /&gt;&lt;br /&gt;La forma convencional está bastante influenciada por la necesidad académica de poder evaluar a los estudiantes. Es más fácil hacerlo cuando explicas de antemano qué es lo que pretendes hacer antes de hacerlo. La solución se puede documentar, evaluar, optimizar, etc.&lt;br /&gt;&lt;br /&gt;Esto también le es util al mundo. Cuando una empresa solicita un sistema, la forma convencional permite estimar el costo de antemano. Con esta venia, la forma convencional queda santificada en la currícula. Después de algunos años de ser condicionados haciéndolo de ese modo, también acabamos santificándolo nosotros.&lt;br /&gt;&lt;br /&gt;Es un poco difícil cambiar las cosas santificadas, pero a veces hay que considerar los hechos.&lt;br /&gt;&lt;br /&gt;En el mundo real, la conocida frase &lt;i&gt;'el cliente no sabe lo que quiere'&lt;/i&gt; refleja el hecho de que a menudo es muy difícil precisar el problema de antemano. Y, debido a eso, aún cuando el modelado fuera perfecto, nada garantiza que el producto final sea satisfactorio.&lt;br /&gt;&lt;br /&gt;La mayoría de proyectos de desarrollo de software fallan. Se exceden en el tiempo, no satisfacen al cliente, o ambas cosas. Si la forma convencional estuviera en lo cierto, eso significaría que la mayoría de la gente no lo aplica bien, y no creo que ese sea el caso.&lt;br /&gt;&lt;br /&gt;Pienso que no es culpa del cliente, ni de quien reune sus requerimientos. Sino que la causa es que no tenemos aún un método que permita precisar de antemano problemas que excedan cierta complejidad.&lt;br /&gt;&lt;br /&gt;Cuando los problemas son relativamente sencillos, o han sido ampliamente recorridos, puede funcionar la forma convencional, pero no cuando los requerimientos son imprecisos y deban descubrirse sobre la marcha. Lo cual ocurre en prácticamente todos los desarrollos (quizás deberíamos reflexionar en el desfase académico sobre esta cuestión).&lt;br /&gt;&lt;h3&gt;La prueba que guía&lt;/h3&gt;Cuando uno programa, hace pruebas para estar seguro que lo que se acaba de hacer hace lo que se espera. Es relativamente sencillo probar una función o módulo y más complicado probar un caso y aún toda la aplicación. Sin embargo, es necesario, si se quiere minimizar el número de errores que puedan llegar a la versión que probará el usuario.&lt;br /&gt;&lt;br /&gt;Las pruebas unitarias permiten usar la computadora para probar una función. Diseñando y agrupando convenientemente las pruebas se pueden probar módulos, casos y hasta la aplicación completa. Esto hace más llevadero el proceso, hasta el punto en que se pueden usar como guía para el desarrollo.&lt;br /&gt;&lt;br /&gt;Usar las pruebas como guía para el desarrollo, o Test Driven Development (TDD), es desarrollar primero la prueba que debe pasar el producto, y recién después el producto.&lt;br /&gt;&lt;br /&gt;Las pruebas se van implementando según se van determinando los casos de uso.&lt;br /&gt;&lt;br /&gt;La primera vez que se corra la prueba, sin ningún producto desarrollado, aparecerá una señal roja. Entonces el desarrollo se convierte en el juego de descubrir el camino más corto, lo mínimo necesario, para que la señal se vuelva verde. Así, el producto reflejará lo que la prueba requiera. La prueba sirve como guía para el desarrollo.&lt;br /&gt;&lt;h3&gt;Modelar es optimizar&lt;/h3&gt;Con TDD, la optimización se posterga todo lo que sea posible, ya que la optimización prematura fácilmente conduce a compromisos y enredos innecesarios.&lt;br /&gt;&lt;br /&gt;Cuando un producto pasa las pruebas, se puede refactorizar con seguridad. Es decir, se puede intentar ya sea cambiar el nombre de una función, extraer un fragmento de código para formar una función, reagrupar funciones en nuevas clases, etc. Si todo va bien, las pruebas continuarán mostrando la señal verde. Y si la señal es roja, no hay problema, podemos usar un sistema de control de versiones para deshacer los cambios y volver al último punto donde todo era verde.&lt;br /&gt;&lt;br /&gt;Así, es más natural que el modelado vaya apareciendo en este punto. Si el modelado está bien, las pruebas lo dirán. En TDD, la principal guía del modelado es evitar las repeticiones y los acoples de código. Las repeticiones son código que se nota se puede factorizar (una idea similar al del álgebra, que extrae aparte los términos comunes), usando funciones, clases, o herencia. Los acoples ocurren cuando hay una dependencia innecesaria entre dos fragmentos de código. Es mejor cuando cada fragmento de código se pueda reemplazar sin peligro de efectos inesperados en otra parte.&lt;br /&gt;&lt;h3&gt;Un esquema para desarrollo&lt;/h3&gt;En la forma de desarrollo empírica se sentía bien el feedback que daba la computadora en cada paso. TDD tiene algo de eso.&lt;br /&gt;&lt;br /&gt;El modelado previo de la solución, aunque quizás correcto académicamente, no funciona demasiado bien en el mundo real. Y tiene, además, el efecto de contenernos las ganas. No soltamos el corcel hasta que tenemos listo el arado. Pero, entonces, ya no es divertido salir a correr si hay que arrastrar un arado al mismo tiempo. Es mejor ir ligeros desde el principio, aceptar los hechos, ser prácticos, y actuar en consecuencia.&lt;br /&gt;&lt;br /&gt;Parece que desarrollar un sistema con requerimientos imprecisos es algo que necesariamente debe resolverse sobre la marcha, en un proceso de prueba y ajuste.&lt;br /&gt;&lt;br /&gt;El siguiente es un esquema que toma varias ideas de Scrum y otras metodologías:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El proceso es de prueba y ajuste. El equipo de desarrollo y el cliente deben estar abiertos al cambio, a&amp;nbsp; probar, equivocarse y corregir. El ambiente debe aceptar los errores como parte del proceso.&lt;/li&gt;&lt;li&gt;El punto de vista del cliente debe estar presente en el desarrollo. Como a menudo es difícil que pueda participar, se designa un intermediario. Puede ser una persona o un conjunto de personas, pero con una sola cabeza para la comunicación y la asignación de responsabilidades.&lt;/li&gt;&lt;li&gt;Se elije cuanto tiempo debe durar la etapa. Es más o menos al azar la primera vez. Entre 2 y 4 semanas.&lt;/li&gt;&lt;li&gt;Basado en el punto de vista del cliente, se obtiene un conjunto de requerimientos que podría esperarse estuvieran listos en esa etapa. Es más o menos al azar en la primera etapa. Los requerimientos parten de deseos del cliente. Finalmente cada uno se expresa como algo que cierto rol usa para realizar cierta tarea.&lt;br /&gt;Cada requerimiento tiene un por qué, que a su vez tiene una justificación, y así sucesivamente. La cadena se puede seguir hasta un conjunto de principios más o menos estables que constituyen la necesidad que justifica el desarrollo.&lt;br /&gt;Conforme avance el desarrollo estos principios y la jerarquía de justificaciones se irá haciendo más clara.&lt;br /&gt;Luego, habrán requerimientos que no se admitirán porque no encajan en ese orden y, del mismo modo, podrán descubrirse requerimientos que inicialmente no se consideraron pero que son necesarios.&lt;/li&gt;&lt;li&gt;Basado en los requerimientos, el equipo hace una lista general de las tareas que estos requerimientos implicaría. Es una lista libre, donde cada uno puede anotar sin censura. Es además una lista abierta, que admitirá nuevos ingresos en cualquier lugar de la etapa. La lista debe ser visible, de libre acceso y fácil de mantener.&lt;/li&gt;&lt;li&gt;Antes de procesar la lista, el equipo reunido hace una lectura rápida de todas las tareas, simplemente para informarse de cuales son, y las agrupa en páginas de cierto tamaño. Esto es más o menos arbitrario. Puede ser un número entre 10 y 30 items por página.&lt;/li&gt;&lt;li&gt;Para procesar la lista, se hace un repaso tarea por tarea. Cuando uno o más miembros del equipo sienten que pueden atender una tarea, se pone a trabajar en ella durante el tiempo que consideren conveniente.&lt;br /&gt;Si la tarea se completa, se tacha de la lista y se continúa el repaso hasta interesarse en alguna tarea. Si la tarea no se completa, se la vuelve a anotar al final de la última página, luego se tacha la anotación original y se continúa el repaso de tareas a partir de esa posición.&lt;br /&gt;Al llegar al final de la página, se vuelve al comienzo.&lt;br /&gt;Si se hace un repaso y ninguna tarea pendiente parece interesante de atender, todas ellas se resaltan y se coloca una X en una esquina de la página, antes de pasar a la siguiente página.&lt;br /&gt;Al llegar al final de todas las páginas, se vuelve a la primera.&lt;br /&gt;Puede ser ninguna de las tareas pendientes, que ahora estan resaltadas, sea interesante, porque no son realmente necesarias en ese momento. Si es así, la X se encierra en un círculo, para facilitar saltearse esas páginas la siguiente vez.&lt;br /&gt;Las tareas urgentes se anotan al final de la lista y se procesan en dirección inversa, empezando desde el final.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S8vY1vfiNPI/AAAAAAAABEc/Z-UJ7qPLZhI/s1600/autofocus.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S8vY1vfiNPI/AAAAAAAABEc/Z-UJ7qPLZhI/s320/autofocus.png" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;La optimización se retrasa todo lo que sea posible. El código optimizado frecuentemente se hace más difícil de entender y reutilizar. Es conveniente que las abstracciones, simplificaciones, y generalizaciones se hagan lo más tarde posible. Y es en la optimización del modelo donde recién entraría a participar el arquitecto. Viendolo bien, un modelado apriori, como en la forma convencional, en realidad &lt;i&gt;"contamina"&lt;/i&gt;&lt;i&gt; &lt;/i&gt;la lista de requerimientos del cliente con la lista de requerimientos del arquitecto. En cambio, al hacerlo durante la refactorización del código, se hace sobre cosas que realmente se necesitan.&lt;/li&gt;&lt;li&gt;Para saber quién atiende cada tarea, y cuál es el estado actual del proceso, se pueden colocar marcadores removibles sobre los items de la lista. &lt;/li&gt;&lt;li&gt;Al inicio de cada semana, el responsable del equipo de desarrollo se reune en privado con cada persona para tener una visión de cómo está cada una y qué está haciendo. Hay cosas que se expresan mejor sin la presión del grupo.&lt;/li&gt;&lt;li&gt;Al inicio de cada día, el equipo dedida unos minutos en contar a todos que hicieron ayer, que harán hoy, y si tienen alguna dificultad. Hay cosas que es necesario que todos conozcan.&lt;/li&gt;&lt;li&gt;Al final de cada etapa se hace una evaluación de ese periodo. Ver qué cosas funcionaron bien y qué cosas podrían mejorarse. &lt;/li&gt;&lt;li&gt;En cada nueva etapa, se ajusta la duración del periodo y el tamaño de las páginas de la lista de tareas. También se borran todas X de las páginas con tareas pendientes, para incorporarlas nuevamente al proceso.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Cómo funciona&lt;/h3&gt;La forma de procesar la lista de tareas está basada en el sistema &lt;a href="http://www.markforster.net/autofocus-index/"&gt;Autofocus&lt;/a&gt;, de Mark Foster.&lt;br /&gt;&lt;br /&gt;La idea de dejar que el equipo atienda las tareas que les resultan interesantes es permitir que se desarrolle un inconsciente colectivo que ayude a determinar cuáles son realmente necesarias.&lt;br /&gt;&lt;br /&gt;El sistema funciona como un ambiente que sólo deja sobrevivir aquellas tareas realmente necesarias para determinar el sistema. Es decir, el sistema se determina de modo evolutivo. Por eso, se da la libertad de anotar en la lista lo que sea, porque si no vale la pena hacerlo nadie lo hará, y si es necesario, tarde o temprano sucederá.&lt;br /&gt;&lt;br /&gt;No es necesario gastar tiempo discutiendo cuales son las tareas, en qué orden hacerlas y quién las atenderá. El sistema facilita que estas cosas se resuelvan espontáneamente.&lt;br /&gt;&lt;br /&gt;Ahora, a probar.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Enlaces&lt;/b&gt;:&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://www.versioncero.com/articulo/197/1-2-3-de-porque-fallan-los-proyectos-informaticos"&gt;1-2-3 de porqué fallan los proyectos informáticos&lt;/a&gt;&amp;nbsp;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://www.markforster.net/spanish/"&gt;Autofocus, Get Everything Done (spanish)&lt;/a&gt;&lt;/i&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5590068298731643225?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5590068298731643225/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/04/un-esquema-para-desarrollo.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5590068298731643225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5590068298731643225'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/04/un-esquema-para-desarrollo.html' title='Un esquema para desarrollo'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/S8vY1vfiNPI/AAAAAAAABEc/Z-UJ7qPLZhI/s72-c/autofocus.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5613128306563493054</id><published>2010-03-24T12:48:00.005-05:00</published><updated>2011-07-13T17:49:09.113-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Gmail para leer Hotmail y Yahoo Mail</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/S6pPwRpXNlI/AAAAAAAAAag/0X3QlNcKpdk/s1600/gmail_settings_accounts.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/S6pPwRpXNlI/AAAAAAAAAag/0X3QlNcKpdk/s320/gmail_settings_accounts.png" /&gt;&lt;/a&gt;&lt;/div&gt;Gmail permite descargar el correo de otras cuentas (actualmente hasta un máximo de 5 cuentas), que tengan el servicio POP3 habilitado.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si alguien tienen más de una cuenta Gmail, puede configurar una de ellas para que todos los demás correos lleguen allí.&lt;br /&gt;&lt;br /&gt;Lo mismo se puede hacer para una cuenta Hotmail. &lt;br /&gt;&lt;br /&gt;Para que los correos de Yahoo Mail también puedan llegar, hay que habilitarle el servicio POP3.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/S6paJOHCqSI/AAAAAAAAAao/hzksVhufElg/s1600/gmail-logo1.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="82" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/S6paJOHCqSI/AAAAAAAAAao/hzksVhufElg/s200/gmail-logo1.png" /&gt;&lt;/a&gt;&lt;b&gt;Gmail leyendo Gmail&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Normalmente, cada cuenta Gmail tiene habilitado el servicio POP3.&lt;br /&gt;&lt;br /&gt;Entonces, elija primero la cuenta desde donde desea ver todas las otras e ingrese. Allí puede entrar a Settings (Opciones), Accounts and Import (Cuentas e Importar), Check mail using POP3 (Revisar correo usando POP3) y pulsar el botón Add POP3 email account (Agregar cuenta email POP3) para agregar los datos de cada una de las otras cuentas.&lt;br /&gt;&lt;br /&gt;Para verificar que tiene la propiedad de la cuenta que quiere asociar, Gmail le enviará un mensaje a dicha cuenta un mensaje con un código de verificación, un enlace e instrucciones para hacer la validación. Es conveniente usar otro navegador para entrar a la otra cuenta Gmail, abrir el mensaje y copiar el código que se ingresará en la ventana que dejamos abierta en el primer navegador. Por ejemplo, entrar a una cuenta A con Firefox y a la cuenta B con Chrome o IE.&lt;br /&gt;&lt;br /&gt;Entre las opciones de una cuenta asociada, si gusta puede marcar la automáticamente aplica una etiqueta a los mensajes de esta cuenta para que pueda&amp;nbsp; distinguirlos fácilmente de los demás.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/S6paOqimM6I/AAAAAAAAAaw/Skiz6MGZuh8/s1600/final_hotmail_logo1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="107" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/S6paOqimM6I/AAAAAAAAAaw/Skiz6MGZuh8/s200/final_hotmail_logo1.jpg" /&gt;&lt;/a&gt;&lt;b&gt;Gmail leyendo Hotmail&lt;/b&gt;&lt;br /&gt;Puede asociar de modo similar una cuenta Hotmail.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gmail leyendo Yahoo Mail&lt;/b&gt; &lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S6paTFtJ-lI/AAAAAAAAAa4/UNE9Nz06TIE/s1600/logo_yahoomail.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="156" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S6paTFtJ-lI/AAAAAAAAAa4/UNE9Nz06TIE/s200/logo_yahoomail.gif" /&gt;&lt;/a&gt;Si tienen una cuenta en Latinoamérica, tal vez habrá notado que desde hace algunos años el servicio POP3 está deshabilitado, a menos que adquiera Yahoo Mail Plus, que es un servicio pagado. Sin embargo, por alguna razón, las cuentas de Asia sí tienen el servicio POP3 habilitado en las cuentas gratuitas. Afortunadamente, es posible hacer el cambio.&lt;br /&gt;&lt;br /&gt;Ingresando a su cuenta Yahoo Mail, puede entrar los datos de su cuenta. Puede ser que le tome un tiempo encontrar el enlace adecuado, pero es uno de los que aparece en la parte de arriba. Tal vez como un desplegable bajo su nombre de usuario (Edit My Account, Editar mi cuenta), o como un enlace simple (My Account, Mi cuenta).&lt;br /&gt;&lt;br /&gt;Allí, por seguridad, le pedirá otra vez la contraseña, antes de conducirle al Account Info (Datos de la cuenta).&lt;br /&gt;En la sección Accounts Settings (Opciones de la cuenta), entre a Set Language... (Establecer lenguaje...). Allí, podrá cambiar el Preferred Content (Contenido preferido) a Yahoo Asia.&lt;br /&gt;&lt;br /&gt;Después de grabar los cambios, puede volver a mail.yahoo.com y entrar en Options (Opciones), POP &amp;amp; Forwarding (POP y Reenvíos), Set up or Edit... (Establecer o editar...), y marcar Web &amp;amp; POP Access (Acceso Web y POP). Además hay una opción que permite elegir entre recibir absolutamente todos los mensajes, o sólo aquellos que Yahoo no considere spam. Gmail tiene un filtro antismpam, así que parece buena idea pasarle todos los mensajes.&lt;br /&gt;&lt;br /&gt;Luego de guardar la configuración en Yahoo Mail, se puede ir a Gmail y asociarla como en el caso anterior.&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.khimhoe.net/2009/06/20/how-to-enable-pop3-in-yahoo-mail/"&gt;How to Enable POP3 in Yahoo! Mail&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5613128306563493054?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5613128306563493054/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/03/gmail-para-leer-yahoo-mail.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5613128306563493054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5613128306563493054'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/03/gmail-para-leer-yahoo-mail.html' title='Gmail para leer Hotmail y Yahoo Mail'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/S6pPwRpXNlI/AAAAAAAAAag/0X3QlNcKpdk/s72-c/gmail_settings_accounts.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6104570233443616355</id><published>2010-03-12T02:09:00.003-05:00</published><updated>2011-06-28T15:15:52.029-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><title type='text'>Resolviendo Drupal multisite</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S5npftXwF6I/AAAAAAAAAZ4/jCw57lVO100/s1600-h/drupal_multisite.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S5npftXwF6I/AAAAAAAAAZ4/jCw57lVO100/s320/drupal_multisite.png" /&gt;&lt;/a&gt;&lt;/div&gt;Aunque la instalación y configuración inicial de Drupal es relativamente sencilla y directa, configurarlo para que varios sites compartan el mismo motor fue, para mí, casi un dolor de cabeza.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;b&gt;Drupal&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Drupal es un CMS (Sistema administrador de contenidos) open source escrito en PHP. Es muy popular y, debido a su arquitectura especialmente extensible, que permite construir aplicaciones más allá del CMS, es considerado también como framework.&lt;br /&gt;&lt;br /&gt;La instalación es simple. Se descomprime el archivo que se descarga de &lt;a href="http://drupal.org/"&gt;drupal.org&lt;/a&gt; en algún lugar del directorio web. Luego se accede a la dirección correspondiente y se siguen los pasos, que incluye indicar los parámetros de acceso a una base de datos MySQL (o PostgreSQL) y definir un usuario administrador.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Drupal Multi-Site&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;En el árbol drupal instalado hay un directorio &lt;i&gt;&lt;b&gt;sites&lt;/b&gt;&lt;/i&gt;. Allí, en el directorio &lt;i&gt;&lt;b&gt;default &lt;/b&gt;&lt;/i&gt;podemos colocar los archivos, módulos y temas del site. Además hay un directorio &lt;i&gt;&lt;b&gt;all&lt;/b&gt;&lt;/i&gt;, donde el manual, los tutoriales y los libros colocan los módulos y temas para que 'estén disponibles para todos los otros sites'.&lt;br /&gt;&lt;br /&gt;Así que uno se imagina que puede tener más sites bajo ese mismo árbol, funcionando con el mismo motor. De hecho, esa configuración se denomina &lt;b&gt;multi-site&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Pareciera que es algo que no se usa mucho, porque no lo mencionan en ningún material introductorio. En la documentación hay varios casos para leer. Si antes de hacerlo uno se imagina que bastará con crear otros subdirectorios con la misma estructura, encontrará que no es así.&lt;br /&gt;&lt;br /&gt;Entonces, lógicamente, se lee un poco el manual... luego en los foros... blogs... googleando en la búsqueda de una explicación que quién iba a pensar sería tan difícil de encontrar. Es un problema algo frustrante. Al menos para mí; me tomó todo el día dar con una solución.&lt;br /&gt;&lt;br /&gt;&lt;b style="font-family: Verdana,sans-serif;"&gt;Mi ambiente&lt;/b&gt;&lt;br /&gt;En un sistema con Windows 7, desarrollo usando XAMPP 1.7.1.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;XAMPP es un paquete que facilita el desarrollo PHP/MySQL. Viene con Apache, PHP, MySQL y Mercury Mail preconfigurados para trabajar juntos, lo que es realmente un gran ahorro de tiempo, respecto a realizar manualmente cada instalación/configuración. Uso la versión 1.7.1 porque usa PHP 5.2, que no emite una alarma cada vez que un parámetro es pasado por referencia (lo cual en PHP 5.3 se ha vuelto deprecated). Y como muchos módulos que corren con Drupal 6.x tienen funciones con parámetros pasados por referencia me parece mejor ser un poco prácticos y usar una versión menos que la ultimita :)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;XAMPP 1.7.1 viene con Apache 2.2.11, PHP 5.2.9, MySQL 5.1.33-community, entre otros paquetes (&lt;/i&gt;&lt;i&gt;ver &lt;a href="http://www.oldapps.com/xampp.php?old_xampp=44"&gt;Old Version of XAMPP&lt;/a&gt; para más detalles).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Se supondrá que XAMPP está instalado en C:\bin\dev\xampp\. Eso significa que el directorio web es C:\bin\dev\xampp\htdocs\. Allí, Drupal 6.16 está instalado en test\drupal_101\. Es decir que, para acceder a mi drupal, el url es http://localhost/test/drupal_101/.&lt;br /&gt;&lt;br /&gt;Podría ser más sencillo, pero no es demasiado complicado y creo que tener el drupal un poco metido en el árbol ayudará a ilustrar mejor el punto.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Mi solución&lt;/b&gt;&lt;/div&gt;Los pasos que suelen aparecer en la mayoría de la documentación, foros, blogs y otras fuentes de internet mencionan virtualhosts o aliases en apache, .htaccess, hosts, subdominios y otras cosas complicadas.&lt;br /&gt;&lt;br /&gt;Practicamente nadie se detiene a explicar el por qué la necesidad de estas complicaciones, o cuál es la idea básica del proceso. Y me parece que deberian hacerlo, porque aclara algo muy importante del funcionamiento de Drupal.&lt;br /&gt;&lt;br /&gt;Cuando accedo a http://localhost/test/drupal_101/, Drupal eventualmente buscará un archivo settings.php. En una instalación típica lo encuentra en sites/default/settings.php.&lt;br /&gt;&lt;br /&gt;Lo que no se nos dice con claridad es que, en realidad, &lt;b&gt;Drupal usa el url como parámetro para determinar dónde buscar el archivo settings.php&lt;/b&gt;. De hecho, parece que &lt;b&gt;default &lt;/b&gt;es el último lugar donde busca. Antes ha buscado en&lt;b&gt; localhost.test.drupal_101&lt;/b&gt;. Puede hacer la prueba renombrando &lt;b&gt;sites/default &lt;/b&gt;como &lt;b&gt;sites/localhost.test.drupal_101&lt;/b&gt; y ver que funciona igual. Sorprendente ¿no?&lt;br /&gt;&lt;br /&gt;Si yo quisiera un nuevo site, digamos http://localhost/test/drupal_202/, lo que tendría que hacer es correr la misma aplicación pero bajo ese nuevo nombre. Es decir, lograr que al entrar a ese url se corra exactamente el mismo php que antes. Eso haría que Drupal busque el archivo&lt;b&gt; sites/localhost.test.drupal_202/settings.php &lt;/b&gt;correspondiente. Y si existiera y estuviera bien configurado, listo, ¡tendríamos Drupal multi-site!&lt;br /&gt;&lt;br /&gt;Pero ¿cómo hacer eso?. Ahí es donde la mayoría mete en el juego las complicaciones de los dominios, subdominios, hosts, virtualhosts, .htaccess, etc. Son soluciones válidas pero, en mi humilde opinión, hay un modo más sencillo, que está al alcance tanto de los usuarios Windows como Linux, y además ilustra bastante más cláramente lo que ocurre.&lt;br /&gt;&lt;br /&gt;Abro una consola de comandos en el directorio que contiene a mi arbol drupal_101, htdocs/test/ (SHIFT+clic derecho, Open command window here), para ejecutar el comando &lt;b&gt;mklink&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mklink /J drupal_202 drupal_101&lt;/div&gt;&lt;br /&gt;Eso crea un enlace simbólico (una especie de directorio ficticio) que permite apuntar al directorio drupal_101 con un nombre nuevo adicional drupal_202.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;mklink está disponible en Windows 7 y WIndows Vista. Para Windows XP puede usar el comando &lt;b&gt;Junction &lt;/b&gt;(puede ver más información sobre esto en el post &lt;a href="http://akcdev.blogspot.com/2010/03/enlaces-simbolicos-en-windows.html"&gt;Enlaces simbólicos en Windows&lt;/a&gt;). En Linux usaría un comando similar a &lt;b&gt;ln -s drupal_101 drupal_202&lt;/b&gt; (allí primero se indica el destino y luego el link).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Hecho esto, al entrar a http://localhost/test/drupal_202/ uno esperaría ver lo mismo que si se entrara a http://localhost/test/drupal_101/. Después de todo se trata del mismo directorio, aunque tenga dos etiquetas. Pero, como Drupal usa el url como parámetro para determinar el lugar dónde debe estar el archivo settings.php, encontrará uno diferente en sites/localhost.test.drupal_202/ y así veremos un site también diferente.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;En resúmen&lt;/b&gt;&lt;/div&gt;Drupal usa el url como parámetro para determinar que settings.php usar. Y el settings.php determina el site que se carga. De ese modo podemos tener varios sites, si logramos entrar al mismo drupal usando diferentes nombres. Una manera sencilla de lograr eso es usando enlaces simbólicos. Eso me parece menos complicado que la alternativa de los aliases, y virtualhosts.&lt;br /&gt;&lt;br /&gt;En el fondo, esta técnica aparece en la documentación cuando habla del uso de subdominios, pero la idea escencial está tan opacada por las otras dificultades que cuesta distinguirla. Ojalá este artículo sea de ayuda.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;b&gt;Posibilidades&lt;/b&gt;&lt;/div&gt;Basta cambiar la configuración de la base de datos que aparece en el settings.php para que el site se transforme en algo completamente diferente. Jugar con esto me ayudó a entender un poco mejor la naturaleza de una aplicación drupal respecto de otras opciones.&lt;br /&gt;&lt;br /&gt;El nombre localhost.test.drupal_202 sigue un patrón que se explica mejor en el comentario contenido en el archivo &lt;b&gt;default.settings.php&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-6104570233443616355?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/6104570233443616355/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/03/resolviendo-drupal-multisite.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6104570233443616355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/6104570233443616355'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/03/resolviendo-drupal-multisite.html' title='Resolviendo Drupal multisite'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K2xwnQ4Llso/S5npftXwF6I/AAAAAAAAAZ4/jCw57lVO100/s72-c/drupal_multisite.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5122665529940820343</id><published>2010-03-11T18:25:00.007-05:00</published><updated>2011-07-13T17:45:28.788-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Enlaces simbólicos en Windows</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/S5l7sJX_lRI/AAAAAAAAAZg/I_4t-yWSCqY/s1600-h/windows7_01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/S5l7sJX_lRI/AAAAAAAAAZg/I_4t-yWSCqY/s200/windows7_01.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;En Linux, un enlace simbólico es un archivo o directorio ficticio que representa a un archivo o directorio real.&lt;br /&gt;&lt;br /&gt;Por ejemplo, puedo tener un enlace simbolico /usr/bin/java en lugar de /usr/bin/java-1.6 (En este caso en particular me sirve para actualizar java sin tener que tocar los archivos de configuración que se refieren a /usr/bin/java).&lt;br /&gt;&lt;br /&gt;En Windows 7, y también en Windows Vista, se puede hacer con el comando &lt;b&gt;mklink&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;También es posible usar una utilidad llamada &lt;b&gt;Junction&lt;/b&gt;. Funciona para Windows XP en adelante y puede descargarse de &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx"&gt;Junction v1.05&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La descarga provee un zip que contiene un único archivo ejecutable que se puede colocar en C:\Windows\. De ese modo, está disponible en cualquier lugar que se abra la consola de comandos.&lt;br /&gt;&lt;br /&gt;En mi caso, necesitaba un enlace simbólico htdocs/site1.localhost que apuntara a htdocs/drupal/sites/site1.localhost&lt;br /&gt;Para eso, me ubiqué en htdocs y ejecuté el comando:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mklink /D&amp;nbsp; &lt;span style="font-size: small;"&gt;site1.localhost drupal\sites\site1.localhost&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;o, usando junction: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;junction site1.localhost drupal\sites\site1.localhost&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;A partir de allí, cuando entro a http://localhost/site1.localhost estoy accediendo al contenido de drupal/sites/site1.localhost.&lt;br /&gt;&lt;br /&gt;Para eliminar el link:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rd site1.localhost&lt;/div&gt;&lt;br /&gt;ó, usando junction:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;junction -d site1.localhost&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Nota:&lt;/b&gt;&lt;br /&gt;Este es un paso intermedio en mi intento de lograr una configuración drupal multisite (lo que aún no consigo), sin embargo me ha parecido útil lo que se puede hacer con Junction por sí sólo. Ojalá que a ustedes también.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5122665529940820343?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5122665529940820343/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/03/enlaces-simbolicos-en-windows.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5122665529940820343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5122665529940820343'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/03/enlaces-simbolicos-en-windows.html' title='Enlaces simbólicos en Windows'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K2xwnQ4Llso/S5l7sJX_lRI/AAAAAAAAAZg/I_4t-yWSCqY/s72-c/windows7_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7202607583188462623</id><published>2010-03-09T16:55:00.004-05:00</published><updated>2011-07-13T17:41:53.399-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='metodología'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Desarrollo por capas</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/S5bBrGnKZHI/AAAAAAAAAYw/p-vPTk2WdZY/s1600-h/Onions.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/S5bBrGnKZHI/AAAAAAAAAYw/p-vPTk2WdZY/s320/Onions.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Me parece que hay un paralelo en lo que pasa entre un desarrollador y el jefe del proyecto, respecto a su trabajo, con lo que pasa entre un cliente y el desarrollador, respecto a su producto.&lt;br /&gt;&lt;br /&gt;El jefe del proyecto es el encargado de que los desarrolladores consigan el producto requerido. Y para hacerlo los organiza según cierta metodología (bueno, si hay suerte). Y suele ser una metodología genérica (waterfall, RUP, Scrum, ...).&lt;br /&gt;&lt;br /&gt;Es como cuando un desarrollador trata de imponer una solución genérica a un cliente. Lo obliga a ejercitarse en un flujo de trabajo artificial en lugar del flujo de trabajo naturalmente determinado por sus necesidades.&lt;br /&gt;Antes lo hacían a menudo, pero ahora los desarrolladores entienden que es mejor construir una solución específica, basada en las necesidades reales del cliente, en lugar de una basada en necesidades imaginadas.&lt;br /&gt;&lt;br /&gt;De forma similar, sería necesario que la forma de organizar el desarrollo de un proyecto sea determinada por las necesidades reales del equipo de desarrollo, en lugar de necesidades imaginadas por el jefe de proyecto, o incluso por el gerente.&lt;br /&gt;&lt;br /&gt;Es decir, se necesita una meta-metodología; algo que nos guíe en el proceso de encontrar la mejor organización para un escenario incierto de personas, recursos y problemas. &lt;br /&gt;&lt;br /&gt;Por mi parte, me parece que hay que ser pragmáticos, flexibles, intuitivos y algo amigos de descubrir lo desconocido.&lt;br /&gt;&lt;br /&gt;Por ejemplo, en el análisis de un problema relativamente extenso no vale la pena tener determinado de antemano todo lo que se requiere implementar.&lt;br /&gt;&lt;br /&gt;Me parece que es mejor hacer una lista de lo que se nos va ocurriendo e ir organizándola en capas conforme llega y conforme nos vamos ocupando de las capas más internas, que contienen la base, lo más escencial. E ir cubriendo cada capa gradualmente, hasta llegar a las capas externas, las de los detalles menos escenciales.&lt;br /&gt;&lt;br /&gt;Cada nuevo requerimiento justificado encajaría en alguna lugar de alguna capa. Las implementaciones se trabajarían por capas, dejando fuera de una iteración aquellas implementaciones que correspondan a otra capa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7202607583188462623?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7202607583188462623/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/03/desarrollo-por-capas.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7202607583188462623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7202607583188462623'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/03/desarrollo-por-capas.html' title='Desarrollo por capas'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K2xwnQ4Llso/S5bBrGnKZHI/AAAAAAAAAYw/p-vPTk2WdZY/s72-c/Onions.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2119880870427558808</id><published>2010-03-09T14:20:00.003-05:00</published><updated>2010-03-09T15:08:05.846-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharing'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Unshare un folder en Windows 7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/S5ao77NwGDI/AAAAAAAAAYo/O3iLMZ_jSRw/s1600-h/windows7_01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/S5ao77NwGDI/AAAAAAAAAYo/O3iLMZ_jSRw/s200/windows7_01.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;En Windows 7, se puede compartir un folder, o directorio, haciéndole clic derecho para entrar a Properties (Propiedades), Sharing (Compartiendo), Share... (Compartir...), luego indicando con quiénes desea hacer el sharing.&lt;br /&gt;&lt;br /&gt;Sin embargo, no hay una forma clara de revertir eso. Tampoco hay un ícono que nos indique (como en los Windows anteriores) que cierto directorio está compartido.&lt;br /&gt;&lt;br /&gt;Una forma de revisar los directorios compartidos es ejecutando el comando&lt;b&gt; compmgmt.msc&lt;/b&gt; (Computer Management, Administración de la Computadora), o yendo al menú inicio, y haciendo clic derecho en Computer, Manage (Administrar).&lt;br /&gt;&lt;br /&gt;Allí, elegir Shared Folders (Directorios Compartidos), Shares (Compartidos), seleccionar el directorio, clic derecho, Stop Sharing (Deterner Compartir).&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://twigstechtips.blogspot.com/2009/08/list-and-unshare-folders-in-windows-7.html"&gt;List (and unshare) folders in Windows 7&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://social.answers.microsoft.com/Forums/en-US/w7network/thread/5fd93411-ca07-46a1-8090-91b29e3153de"&gt;I Can't "Unshare" Files w/ Windows 7!!&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2119880870427558808?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2119880870427558808/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/03/unshare-un-folder-en-windows-7.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2119880870427558808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2119880870427558808'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/03/unshare-un-folder-en-windows-7.html' title='Unshare un folder en Windows 7'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/S5ao77NwGDI/AAAAAAAAAYo/O3iLMZ_jSRw/s72-c/windows7_01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2542269808512654162</id><published>2010-03-02T11:05:00.004-05:00</published><updated>2011-06-28T15:12:53.124-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentaciones'/><title type='text'>Presentando con Prezi</title><content type='html'>&lt;a href="http://prezi.com/"&gt;Prezi.com&lt;/a&gt;&amp;nbsp;es un servicio que permite crear presentaciones muy originales de una manera muy original.&lt;br /&gt;&lt;br /&gt;Más agil que la clásica serie de slides a la Powerpoint. Prezi permite usar libremente en una especie de papelógrafo infinito. Coloque sus anotaciones, imágenes, video, etc, en el tamaño y posición que desee. Luego defina una ruta de vuelo y listo. Prezi hará la ruta, subiendo, bajando y girando según la orientación del texto, produciendo un efecto muy, muy memorable.&lt;br /&gt;&lt;br /&gt;El resultado reside online, se puede compartir en las redes sociales, como Facebook o Twitter, o incluirse en páginas web como esta. Además, también se puede descargar en un autoejecutable flash que puede llevar en su usb.&lt;br /&gt;&lt;br /&gt;Prezi tiene planes pagados además del servicio gratuito.&lt;br /&gt;&lt;br /&gt;Aquí un ejemplo que hice, usando un cuento, pero creo que notará la idea:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="prezi-player"&gt;&lt;style media="screen" type="text/css"&gt;.prezi-player { width: 550px; } .prezi-player-links { text-align: center; }&lt;/style&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="400" id="prezi_nokjta2jqzxa" name="prezi_nokjta2jqzxa" width="550"&gt;&lt;param name="movie" value="http://prezi.com/bin/preziloader.swf"/&gt;&lt;param name="allowfullscreen" value="true"/&gt;&lt;param name="allowscriptaccess" value="always"/&gt;&lt;param name="bgcolor" value="#ffffff"/&gt;&lt;param name="flashvars" value="prezi_id=nokjta2jqzxa&amp;amp;lock_to_path=1&amp;amp;color=ffffff&amp;amp;autoplay=no"/&gt;&lt;embed id="preziEmbed_nokjta2jqzxa" name="preziEmbed_nokjta2jqzxa" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="550" height="400" bgcolor="#ffffff" flashvars="prezi_id=nokjta2jqzxa&amp;amp;lock_to_path=1&amp;amp;color=ffffff&amp;amp;autoplay=no"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div class="prezi-player-links"&gt;&lt;a href="http://prezi.com/nokjta2jqzxa/" title="Cuento"&gt;En la noche&lt;/a&gt; on &lt;a href="http://prezi.com/"&gt;Prezi&lt;/a&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/19875758-2542269808512654162?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2542269808512654162/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/03/presentando-con-prezi.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2542269808512654162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2542269808512654162'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/03/presentando-con-prezi.html' title='Presentando con Prezi'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2879947723937968923</id><published>2010-01-23T09:41:00.003-05:00</published><updated>2010-07-27T00:07:23.155-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='xampp'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><category scheme='http://www.blogger.com/atom/ns#' term='mercury'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Resolviendo el Mercury de XAMPP</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/S1CjewJ-MVI/AAAAAAAAAMg/nJ5WtSvKaNo/s1600-h/20-xampp-logo-trio.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/S1CjewJ-MVI/AAAAAAAAAMg/nJ5WtSvKaNo/s320/20-xampp-logo-trio.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;XAMPP es un conveniente paquete que contiene Apache, PHP, MySQL y otros programas para facilitar la instalación y uso de un entorno de desarrollo PHP. Lo vengo usando satisfactoriamente desde hace varios meses. Sin embargo, me enfrasqué en un problema cuando necesité usar el Mercury que trae incluido para enviar emails. Aparentemente no funcionaba. Buscando y navegando mucho por internet, encontré estas páginas que me ayudaron a resolver el problema:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.zoe.vc/2008/mercury-mail-transport-system-fur-externe-mail-konfigurieren/"&gt;Configure Mercury mail transport system for external mail sending&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://community.pmail.com/forums/thread/20766.aspx"&gt;New To Mercury, Cant Seem To Send Mail&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;El primer enlace da una secuencia detallada de pasos. Muchos comentan que les funcionó muy bien, pero yo tuve un problema. Veía que las ventanas de los varios monitores que muestra Mercury decían offline, y un comando "telnet localhost 25" ejecutado en la consola me devolvía "Could not open connection to the host, on port 25".&lt;br /&gt;Entonces, encontré el segundo enlace, donde un forista comentaba que los mensajes de offline se debían a un bug del módulo MercuryX y se debía deshabilitar. Así lo hice y, al reiniciar, el administrador de Mercury funcionó :-D, se enviaron los mensajes de prueba que tenía atascados e incluso pude hacer una prueba usando el telnet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Resúmen de pasos &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/S1CjoSHduyI/AAAAAAAAAMo/v-kiMviDEMM/s1600-h/mercury-logo.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/S1CjoSHduyI/AAAAAAAAAMo/v-kiMviDEMM/s320/mercury-logo.jpg" /&gt;&lt;/a&gt;La idea del relay es usar un servidor SMTP externo, como el de GMail, para que Mercury envíe el correo a través de él. En teoría sería posible también usar un SMTP en localhost, pero como algunos proveedores no permiten que sus usuarios envíen correo de ese modo, el uso del relay parece más general.&lt;/blockquote&gt;En el archivo xampp/php/php.ini, ubicar las líneas correspondientes a&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; [mail function]&lt;/span&gt; y editarlas para que quede algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[mail function]&lt;br /&gt;; For Win32 only.&lt;br /&gt;; http://php.net/smtp&lt;br /&gt;SMTP = localhost&lt;br /&gt;; http://php.net/smtp-port&lt;br /&gt;smtp_port = 25&lt;br /&gt;&lt;br /&gt;; For Win32 only.&lt;br /&gt;; http://php.net/sendmail-from&lt;br /&gt;sendmail_from = postmaster@localhost&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación, configurar Mercury. En el administrador de Mercury (que se abre al pulsar su botón Admin en el panel de control de XAMPP), entrar a las opción de menú indicadas por cada título y realizar los cambios que se indican:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Configuration/Protocol modules...&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/S1Cc5Rih0dI/AAAAAAAAALo/XnyfNoMDLSk/s1600-h/mercury_conf_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/S1Cc5Rih0dI/AAAAAAAAALo/XnyfNoMDLSk/s320/mercury_conf_03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;Note que se han desahabilitado MercuryE y MercuryX, y se ha habilitado Mercury C.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Luego de desactivar/activar módulos es necesario reiniciar Mercury (salir del administrador y volver a entrar).&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Configuration/Mercury core module...&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_K2xwnQ4Llso/S1CdAEgwaYI/AAAAAAAAALw/yaYmjDYl-UE/s1600-h/mercury_conf_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_K2xwnQ4Llso/S1CdAEgwaYI/AAAAAAAAALw/yaYmjDYl-UE/s320/mercury_conf_01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1CdFUOKADI/AAAAAAAAAL4/1ndhK1WXB64/s1600-h/mercury_conf_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1CdFUOKADI/AAAAAAAAAL4/1ndhK1WXB64/s320/mercury_conf_02.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Configuration/MercuryS SMTP server&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/S1CdLy5HtzI/AAAAAAAAAMA/IHC1N3Pk5Ro/s1600-h/mercury_conf_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/S1CdLy5HtzI/AAAAAAAAAMA/IHC1N3Pk5Ro/s320/mercury_conf_04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;El nombre en "Announce..." puede ser cualquiera. El IP es el del localhost (la página dice que usar el IP de la intranet, 192.168.x.x, no le funcionó).&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1CdavxBiWI/AAAAAAAAAMI/hAScuWTkCiE/s1600-h/mercury_conf_05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1CdavxBiWI/AAAAAAAAAMI/hAScuWTkCiE/s320/mercury_conf_05.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: small;"&gt;Aquí se modifica la restricción para que se permita conexiones en el rango 127.0.0.1-127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif; text-align: left;"&gt;&lt;span style="font-size: small;"&gt;Pero el punto más importante es desmarcar la casilla "Do not permit SMTP relaying of non-local-email"&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Configuration/MercuryC SMTP client&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1Cdgj6VPTI/AAAAAAAAAMQ/KYvseGp8-AY/s1600-h/mercury_conf_06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1Cdgj6VPTI/AAAAAAAAAMQ/KYvseGp8-AY/s400/mercury_conf_06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: small;"&gt;Aquí indico que se use el SMTP server de gmail, según las recomendaciones de su página y usando el puerto 587 para SSL con STARTTLS. Si es su caso, verifique que el nombre de usuario incluya @gmail.com&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Configuration/Manage local users&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1Cdmo1tHfI/AAAAAAAAAMY/ZhLMFfbkZ74/s1600-h/mercury_conf_07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_K2xwnQ4Llso/S1Cdmo1tHfI/AAAAAAAAAMY/ZhLMFfbkZ74/s320/mercury_conf_07.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: small;"&gt;Se agrega el usuario postmaster, con privilegio de administrador.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2879947723937968923?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2879947723937968923/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/01/resolviendo-el-mercury-de-xampp.html#comment-form' title='24 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2879947723937968923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2879947723937968923'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/01/resolviendo-el-mercury-de-xampp.html' title='Resolviendo el Mercury de XAMPP'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/S1CjewJ-MVI/AAAAAAAAAMg/nJ5WtSvKaNo/s72-c/20-xampp-logo-trio.jpg' height='72' width='72'/><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-5825787884285947023</id><published>2010-01-11T11:49:00.005-05:00</published><updated>2011-07-13T17:46:07.346-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Usando FTP_synchronize con Notepad++ en Windows 7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/S0tWV8obHrI/AAAAAAAAALA/d-qD4EHfJKc/s1600-h/notepad_plus.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/S0tWV8obHrI/AAAAAAAAALA/d-qD4EHfJKc/s200/notepad_plus.png" /&gt;&lt;/a&gt;&lt;/div&gt;Notepad++ es un editor de texto muy util para programar. Lo uso bastante para HTML, CSS, javascript, php, etc. Su menú encoding permite ver y cambiar de manera muy fácil el encoding de un archivo; por ejemplo, es sencillo pasar ANSI a Unicode UTF-8, con BOM o sin BOM, y viceversa (para una nota sobre lo que es ANSI, puede ver &lt;a href="http://flex.sys-con.com/node/45949"&gt;ASCII, ANSI, Roman 1, and What's All That?&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Lo había venido usando con uno de sus plugins, FTP_synchronize, y me sorprendió un poco descubrir que la nueva versión 5.6.3 que instalé ya no lo incluía por default.&lt;br /&gt;Afortunadamente, es posible bajarlo [&lt;a href="http://www.rarst.net/software/notepadpp-ftp-plugin/"&gt;Edit files on FTP with Notepad++ plugin&lt;/a&gt;]. Puede hacerlo desde &lt;a href="http://sourceforge.net/projects/npp-plugins/files/FTP_synchronize/"&gt;SourceForge::Notepad++ Plugins::FTP_synchronize&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yo bajé de allí el archivo FTP_synchronize_0_9_6_1_dll.zip. Al abrirlo hallé 2 dll y una nota indicando que aquel marcado con una A era para los Windows sin soporte para unicode (la A es por ANSI). Así que coloqué FTP_synchronize.dll en el directorio plugins de Notepad++, luego cerre y volví abrir el editor y encontré que FTP_synchronize aparecía en el menú plugins.&lt;br /&gt;&lt;br /&gt;Configuré el acceso a una cuenta e ingresé a los directorios sin problema. Pero, cuando intentaba editar algún archivo, me aparecía el mensaje "Unable to create directory for file C". Aparentemente Windows 7 no deja escribir así nomás a los programas en el disco (aunque opino que debería dejar hacerlo en sus subdirectorios propios). Felizmente encontré en Internet una forma de solucionar el problema [&lt;a href="http://www.technicallychris.com/2009/06/13/problems-using-the-notepad-ftp_synchronize-plugin-with-vista/"&gt;Problems using the Notepad++ FTP_Synchronize Plugin with Vista&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;Lo que yo hice fue ir al directorio de plugins de Notepad++ para crear manualmente el subdirectorio FTP_synchronize. Luego, fue necesario que le hiciera clic derecho para ver sus propiedades y modificar los permisos de acceso de Users sobre ese directorio, para que pudieran crear, eliminar, y modificar los archivos y directorios que pudiera contener.&lt;br /&gt;&lt;br /&gt;Finalmente, pude editar el archivo que que quería (en mi caso era cambiarle el encode a UTF8 sin BOM).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-5825787884285947023?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/5825787884285947023/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/01/usando-ftpsynchronize-con-notepad-en.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5825787884285947023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/5825787884285947023'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/01/usando-ftpsynchronize-con-notepad-en.html' title='Usando FTP_synchronize con Notepad++ en Windows 7'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/S0tWV8obHrI/AAAAAAAAALA/d-qD4EHfJKc/s72-c/notepad_plus.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-2654440802927209628</id><published>2010-01-09T01:28:00.001-05:00</published><updated>2010-01-09T01:29:51.164-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kohana'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Kohana101</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/S0ghnxwaryI/AAAAAAAAAKw/3SN8TBBO_aA/s1600-h/kohana_logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/S0ghnxwaryI/AAAAAAAAAKw/3SN8TBBO_aA/s320/kohana_logo.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Aprendiendo Kohana estoy desarrollando el tutorial &lt;a href="http://dev.kohanaphp.com/projects/kohana2/wiki/Kohana101"&gt;Kohana101&lt;/a&gt;, publicado por Oscar Bajner.&lt;br /&gt;&lt;br /&gt;Viendo que no hay mucho material sobre Kohana disponible en español, se me ocurrió que sería buena idea ir traduciéndolo mientras doy estos primeros pasos. &lt;br /&gt;&lt;br /&gt;Ojalá sea de ayuda a quienes estén interesados en probar este interesante framework pero, por alguna razón, necesitan más material en español.&lt;br /&gt;&lt;br /&gt;Pueden encontrar la traducción bajo mi colección sobre &lt;a href="http://knol.google.com/k/antonio-kobashikawa-carrasco/kohana/oz35jmbo197x/14"&gt;Kohana&lt;/a&gt;, en Knol.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-2654440802927209628?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/2654440802927209628/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2010/01/kohana101.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2654440802927209628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/2654440802927209628'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2010/01/kohana101.html' title='Kohana101'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/S0ghnxwaryI/AAAAAAAAAKw/3SN8TBBO_aA/s72-c/kohana_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-7008245460817671008</id><published>2009-11-12T16:49:00.005-05:00</published><updated>2009-11-12T17:12:49.649-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Trabajando con MVC</title><content type='html'>&lt;h2 style="font-family: arial,sans-serif;"&gt;&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/SvyGhDAupyI/AAAAAAAAAIE/BMymWRYXVuo/s1600-h/zen_piedras.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/SvyGhDAupyI/AAAAAAAAAIE/BMymWRYXVuo/s320/zen_piedras.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Lo que suelo hacer es ir como el cangrejo, de atrás para adelante:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hago una vista estática, con datos en duro. Lo pruebo.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ubico los datos que podrían ser dinámicos y uso variables y lógica de vista para generar los datos en duro. Todo eso en la misma vista. Lo pruebo, debe funcionar igual que antes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;La lógica de vista queda en la vista, pero paso al controlador la asignación de valores en duro a las variables requeridas por la vista. Lo pruebo, debe funcionar igual que antes.&lt;/li&gt;&lt;li&gt;Paso a un modelo la generación de los datos en duro requeridos por el controlador para enviar a la vista. Lo pruebo, debe funcionar igual que antes.&lt;/li&gt;&lt;li&gt;Creo un sistema de tablas de donde el modelo pueda extraer los datos que he venido usando en duro. Lo pruebo, debe funcionar como antes.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En cada paso, me inclino por la solución más natural y simple disponible. Evito considerar requerimientos que &lt;i&gt;podrían&lt;/i&gt; ser buenos para el futuro o para otro caso. De ese modo la solución tiene lo que se necesita y nada más. Evito compromisos innecesarios y disminuyo las probabilidades de efectos secundarios.&lt;br /&gt;&lt;br /&gt;Luego que algo funciona, trato de eliminar duplicaciones, y luego optimizar. Es mejor postergar la optimización lo más que se pueda, ya que optimizar frecuentemente &lt;i&gt;ensucia&lt;/i&gt;  el código con trucos y técnicas que no dejan ver bien la lógica de la solución.&lt;br /&gt;&lt;br /&gt;Programar código directamente optimizado es una trampa, una ilusión. Hace más lento el desarrollo y complica transitar cada escalón. Cuando algo falla, está todo tan enredado que prefieres descolgarte por la baranda que revisar la escalera.&lt;br /&gt;&lt;br /&gt;Es mejor programar por niveles de complejidad, dejando la optimización para el final. Como cuando se construye una casa; los acabados no se ponen hasta el final. De otro modo los constructores gastarían energía y tiempo extra en cuidar un mobiliario y accesorios que les estorba el paso, y que encima nadie puede usar bien.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Breve crítica sobre el uso del idiomas y variables con prefijos&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Reconozco que para resolver muchos tipos de problemas, así como para organizar las cosas suele ser más sencillo pensar de atrás hacia adelante, como en el inglés (me parece que no por nada los lenguajes de programación están en inglés). De afuera hacia adentro. De lo general a lo particular. La organización de directorios, nombres, etc se hace más clara y más compatible con otras organizaciones, que si se fuerza a usar español sólo porque sí.&lt;br /&gt;&lt;br /&gt;Sin embargo, si mis conceptos están en español, las variables directamente relacionadas con ellos también aparecerán en español (por ejemplo los nombres de las tablas, modelos, controladores), pero todas las demás variables internas (como los contadores), prefijos, sufijos, etc mantienen el estandar de un desarrollo en inglés. No es práctico traducir el nombre de las entidades, porque frecuentemente habrán conversaciones sobre ellas y carga el desarrollo llevar un tabla de equivalencias y pensar con esas equivalencias encima. Cuantos más ligeros, mejor.&lt;br /&gt;&lt;br /&gt;Así, uso producto_precio en lugar de precio_producto, entidad_caracteristica en lugar de caracteristica_entidad.&lt;br /&gt;&lt;br /&gt;Además, uso setPrecio(), getProducto(), etc, porque es más corto que establecerPrecio(), obtenerProducto(), etc. Hay IDEs, como Eclipse, que tienen generadores de getters y setters.&lt;br /&gt;&lt;br /&gt;Esta forma práctica de usar el idioma no tiene que ver con el respeto a la lengua materna o lo que recomiende la RAE para hablar. Eso es otro asunto. Lo importante es que el desarrollo sea claro, práctico, el mantenimiento fácil, y que el programa funcione.&lt;br /&gt;&lt;br /&gt;Por otro lado, me parece innecesario el uso de prefijos sólo para señalar que &lt;i&gt;cierta variable pertenece a tal módulo asociado a tal tabla de la base de datos del proyecto tal&lt;/i&gt;. Quizás puedan ayudar a ubicar la variable dentro del contexto del proyecto, pero es poca ganancia comparado con el lastre que significará usar esas variables en el día a día. Es mejor usar variables nombradas lo más naturalmente y simple que se pueda. &lt;br /&gt;&lt;br /&gt;Además, siguiendo un orden natural y claro no se necesitará señalar '&lt;i&gt;que cierta variable pertenece a tal módulo asociado a tal tabla de la base de datos del proyecto tal&lt;/i&gt;'; todo eso se podrá deducir por contexto.&lt;br /&gt;&lt;br /&gt;Claro que todo esto no es algo rígido. Son simplemente pautas que trato de seguir y que voy corrigiendo conforme veo más casos, me equivoco y aprendo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-7008245460817671008?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/7008245460817671008/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2009/11/trabajando-con-mvc.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7008245460817671008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/7008245460817671008'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2009/11/trabajando-con-mvc.html' title='Trabajando con MVC'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/SvyGhDAupyI/AAAAAAAAAIE/BMymWRYXVuo/s72-c/zen_piedras.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-8740121885809240327</id><published>2009-11-08T23:31:00.003-05:00</published><updated>2011-07-13T17:46:50.273-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kohana'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Hello World en Kohana</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/Svea8SS64TI/AAAAAAAAAH8/rgUb2suoeqk/s1600-h/kohana.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/Svea8SS64TI/AAAAAAAAAH8/rgUb2suoeqk/s200/kohana.png" /&gt;&lt;/a&gt;&lt;/div&gt;Kohana es un framework PHP derivado de CodeIgniter. Los desarrolladores de Kohana decidieron que participara más la comunidad, que se adoptara PHP5, y que hubiera un ORM para acceder a la base de datos, entre otras mejoras que venían reclamándose hacía tiempo en los foros de CodeIgniter.&lt;br /&gt;&lt;br /&gt;He usado CodeIgniter para un proyecto. Pude aprender a usuarlo mucho más rápidamente que CakePHP (de hecho, fueron varios disgustos sucesivos al reaprender varias de las bibliotecas principales de Cake lo que me animó a buscar afuera y probar CI).&lt;br /&gt;&lt;br /&gt;Usar CI es simple, claro, directo. Permite incorporar fácilmente muchas de las cosas que ya sepamos de PHP, en lugar de forzarnos a reaprenderlas, como me sucedió con Cake.&lt;br /&gt;Además me gusta mucho la forma en que permite organizar los controladores y, principalmente, las vistas.&lt;br /&gt;Sin embargo, extraño algunas cosas de Cake, como la forma de acceder a la base de datos y la forma de mantener disponibles los datos del formulario una vez enviado.&lt;br /&gt;&lt;br /&gt;Leí que Kohana es interesante como alternativa a CI (mis siguientes pasos serían probar también Yii y Adventure PHP Framework), y he decidido probarla.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;a href="http://knol.google.com/k/antonio-kobashikawa-carrasco/hello-world-en-kohana/oz35jmbo197x/17"&gt;Lea más aquí: Cómo hacer Hello World en Kohana&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/19875758-8740121885809240327?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/8740121885809240327/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2009/11/hello-world-en-kohana.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8740121885809240327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8740121885809240327'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2009/11/hello-world-en-kohana.html' title='Hello World en Kohana'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K2xwnQ4Llso/Svea8SS64TI/AAAAAAAAAH8/rgUb2suoeqk/s72-c/kohana.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-8155892597790328544</id><published>2009-10-20T15:46:00.012-05:00</published><updated>2011-06-28T15:11:27.374-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='problema'/><category scheme='http://www.blogger.com/atom/ns#' term='solución'/><title type='text'>La importancia de comprender el proceso de solución</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/St1H5HPUgpI/AAAAAAAAAHs/x8OzNyHHXSU/s1600-h/arbol+en+manos.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/St1H5HPUgpI/AAAAAAAAAHs/x8OzNyHHXSU/s320/arbol+en+manos.jpg" /&gt;&lt;/a&gt;Muchas veces me he preguntado por qué frecuentemente parece tan problemático aplicar en proyectos del mundo real los esquemas de trabajo que aprendemos al estudiar.&lt;br /&gt;&lt;br /&gt;El desarrollo de un sistema real suele ser un problema impreciso, a diferencia de los libros de texto, donde cada problema suele aparecer expresado de modo preciso.&lt;br /&gt;Aún en los proyectos aparentemente simples, es normal encontrar imprecisiones en lo que el cliente tiene, lo que el cliente quiere y lo que realmente necesita.&lt;br /&gt;&lt;br /&gt;Pero, aunque eso es un problema adicional al principal, pienso que no es la principal razón de las dificultades al desarrollar un proyecto.&lt;br /&gt;&lt;br /&gt;Me parece que la principal razón es un problema de actitud frente a los problemas debido, básicamente, a la falta de comprensión de cómo se solucionan.&lt;br /&gt;&lt;br /&gt;Muchas personas no han hecho nunca el intento de resolver algo desde cero. Casi siempre han podido solucionar lo que necesitaban adaptando o configurando una solución general desarrollada por alguien más.&lt;br /&gt;Sin embargo, se les pone en proyectos de desarrollo que implican desarrollar desde cero, y entonces empiezan a ocurrir problemas.&lt;br /&gt;&lt;br /&gt;Pienso que cuando una persona se ha acostumbrado a renunciar a buscar sus propias soluciones para usar las de otros, con el tiempo puede empezar a tener una visión distorsionada de lo que una solución es y del proceso necesario para lograrla.&lt;br /&gt;Como las soluciones de otros suelen venir acabadas, pulidas y empaquetadas, una persona que no ha tenido experiencia hallando sus propias soluciones suele mirar con desconfianza el proceso de solución de otras personas.&lt;br /&gt;Le es difícil entender la presencia de código auxiliar, y las sucesivas aproximaciones, simplificaciones y pruebas que ocurren en el proceso. Cree que las soluciones se deben construir tal cual se presentan al final, lo cual es como pretender que una casa se puede construir colocando cada parte con su cubierta y acabado final, cuando en realidad el proceso de construcción es por etapas.&lt;br /&gt;&lt;br /&gt;George Polya escribió sobre el proceso de solución de problemas por uno mismo. Primero comprender el problema; familiarizarse con él; en qué consiste. Luego usar alguna estrategia de solución; quizás dividirlo, quizás simplificarlo, quizás expresarlo de otro modo, o en términos de problemas cuya solución conozcamos; probar y probar. Hallada la solución, comprobarla; ver si realmente satisface el problema. Finalmente, ver si puede hacerse de otro modo, quizás más rápido o con menos recursos.&lt;br /&gt;Primero resolver la cuestión, luego optimizar la solución.&lt;br /&gt;&lt;br /&gt;Pero cuando no se ha sido educado en solucionar problemas por uno mismo, sino en asimilar la solución de problemas tipo resueltos por otros, uno se puede llegar a acostumbrar a eso. Y, con el tiempo, llegar a pensar que todos los problemas se pueden resolver de ese modo.&lt;br /&gt;Así, no es poco frecuente hallar personas que creen que toda solución debe aparecer ya optimizada.&lt;br /&gt;La solución de un problema tipo puede aparecer optimizada porque ya es conocida.&lt;br /&gt;La solución de un problema nuevo, en cambio, se construye gradualmente.&lt;br /&gt;&lt;br /&gt;Muchas veces se dice que hay que evitar reinventar la rueda, y se mira con cierto desdén a una persona que lo intenta. Sin embargo, es importante. Porque quien lo hace entrena su mente en distinguir soluciones, y en construir el camino para hallarlas. Puede sentir cuál será el siguiente paso.&lt;br /&gt;&lt;br /&gt;Quién sólo aplica soluciones es como alguien confinado a ir siempre por caminos ya trazados. Quizás tan temeroso que evita, aproximarse a los bordes, o siquiera  mirar a los lados. Y, posiblemente, obstaculizando constantemente a quienes quisieran aventurarse más allá. Sin entender que los caminos no aparecen pavimentados de golpe, sino que deben construirse y, aún antes, descubrirse.&lt;br /&gt;&lt;br /&gt;Solucionar un problema por uno mismo puede ser un proceso de exploración y descubrimiento, como aventurarse en un bosque. O también puede ser un proceso de sembrar, cultivar y cosechar.&lt;br /&gt;&lt;br /&gt;Por supuesto que aplicar la solución de otro también tiene su mérito. Es una cuestión de técnica. De cómo, hecho el camino, lo puedo recorrer. Pero, ¿quién hace el camino?&lt;br /&gt;&lt;br /&gt;Admitiendo que un proyecto tiene partes que desarrollar desde cero, debería dejarse espacio para el proceso de exploración y evolución que una solución desde cero necesariamente requerirá. ¿Lo hace usted?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19875758-8155892597790328544?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/8155892597790328544/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2009/10/la-importancia-de-comprender-el-proceso.html#comment-form' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8155892597790328544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/8155892597790328544'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2009/10/la-importancia-de-comprender-el-proceso.html' title='La importancia de comprender el proceso de solución'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_K2xwnQ4Llso/St1H5HPUgpI/AAAAAAAAAHs/x8OzNyHHXSU/s72-c/arbol+en+manos.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-3496105977878435989</id><published>2009-09-24T17:27:00.007-05:00</published><updated>2009-10-02T18:50:01.878-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Conociendo PHP</title><content type='html'>Una presentación que hice para el Instituto José Pardo.&lt;br /&gt;Viéndola desde &lt;a href="http://www.slideshare.net/akobashikawa/conociendo-php"&gt;SlideShare&lt;/a&gt; está además disponible el ppt original y las animaciones que no aparecen en la versión adaptada.&lt;br /&gt;&lt;div id="__ss_2045638" style="text-align: left; width: 425px;"&gt;&lt;a href="http://www.slideshare.net/akobashikawa/conociendo-php" style="display: block; font-family: Helvetica,Arial,Sans-serif; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 12px 0pt 3px; text-decoration: underline;" title="Conociendo PHP"&gt;Conociendo PHP&lt;/a&gt;&lt;object height="355" style="margin: 0px;" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=conociendophp-090922184849-phpapp02&amp;stripped_title=conociendo-php" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=conociendophp-090922184849-phpapp02&amp;stripped_title=conociendo-php" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="font-family: tahoma,arial; font-size: 11px; height: 26px; padding-top: 2px;"&gt;Ver más &lt;a href="http://www.slideshare.net/" style="text-decoration: underline;"&gt;presentaciones&lt;/a&gt; de &lt;a href="http://www.slideshare.net/akobashikawa" style="text-decoration: underline;"&gt;Antonio Kobashikawa Carrasco&lt;/a&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/19875758-3496105977878435989?l=akcdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://akcdev.blogspot.com/feeds/3496105977878435989/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://akcdev.blogspot.com/2009/09/conociendo-php.html#comment-form' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3496105977878435989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19875758/posts/default/3496105977878435989'/><link rel='alternate' type='text/html' href='http://akcdev.blogspot.com/2009/09/conociendo-php.html' title='Conociendo PHP'/><author><name>Rulo Kobashikawa Carrasco</name><uri>https://profiles.google.com/107380392663486822879</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-48WRGsnbT4w/AAAAAAAAAAI/AAAAAAAABT8/NB_ewZnd5I4/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19875758.post-6858407917349367378</id><published>2009-08-28T02:25:00.017-05:00</published><updated>2011-06-28T15:10:16.938-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Enviando emails con PHP</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_K2xwnQ4Llso/SpeO_e3yPbI/AAAAAAAAAE8/ixROsV7_SMM/s1600-h/email_icon_24910.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5374921901559922098" src="http://1.bp.blogspot.com/_K2xwnQ4Llso/SpeO_e3yPbI/AAAAAAAAAE8/ixROsV7_SMM/s200/email_icon_24910.jpg" style="cursor: pointer; float: left; height: 200px; margin: 0pt 10px 10px 0pt; width: 200px;" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_K2xwnQ4Llso/SpePqwh33lI/AAAAAAAAAFE/M6Fw2K8uoAI/s1600-h/php2sv8.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5374922645034229330" src="http://4.bp.blogspot.com/_K2xwnQ4Llso/SpePqwh33lI/AAAAAAAAAFE/M6Fw2K8uoAI/s200/php2sv8.png" style="cursor: pointer; float: left; height: 128px; margin: 0pt 10px 10px 0pt; width: 200px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt;El envío de emails con PHP puede ser relativamente sencillo.&lt;br /&gt;Pero, dependiendo de cómo sea el mensaje, las cosas pueden requerir algo más de trabajo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Explorando en la red encontramos ejemplos que usan la función nativa mail(). Esto funciona bien para el caso relativamente sencillo de enviar ASCII (ó ISO-8859-1).&lt;br /&gt;&lt;br /&gt;Si uno quiere enviar HTML o Unicode (UTF-8), o ASCII junto con HTML (como suelen hacer los servicios email), entonces las cosas se complican un poco, y los tutoriales son más escasos. Quizás optan por usar alguna biblioteca auxiliar, como PEARL. Es posible seguir haciéndolo con mail(), pero no encontrará mucho al respecto.&lt;br /&gt;&lt;br /&gt;Las complicaciones aumentan un poco más si se quiere adjuntar un documento al mensaje. Sigue siendo posible seguir haciéndolo con mail(), pero 'tampoco encontrará mucha información sobre cómo hacerlo.&lt;br /&gt;&lt;br /&gt;Para hacerlo, es importante fijarse en los headers que se envían. Estos contienen la descripción del contenido del mensaje. Y hay que colocar también ciertas marcas de separación en la estructura del mensaje.&lt;br /&gt;&lt;br /&gt;Un mensaje ASCII + HTML tiene un mensaje con una estructura similar a:&lt;br /&gt;&lt;br /&gt;(declaración de separador alterno)&lt;br /&gt;&lt;br /&gt;--separador alterno&lt;br /&gt;(descripción del contenido de texto)&lt;br /&gt;(contenido de texto)&lt;br /&gt;&lt;br /&gt;--separador alterno&lt;br /&gt;(descripción de contenido html)&lt;br /&gt;(contenido html)&lt;br /&gt;--separador alterno--&lt;br /&gt;&lt;br /&gt;Un mensaje ASCII + HTML + adjunto tiene un mensaje con una estructura similar a:&lt;br /&gt;&lt;br /&gt;(declaracion de separador mixto)&lt;br /&gt;&lt;br /&gt;--separador mixto&lt;br /&gt;&lt;br /&gt;(declaración de separador alterno)&lt;br /&gt;&lt;br /&gt;--separador alterno&lt;br /&gt;(descripción del contenido de texto)&lt;br /&gt;(contenido de texto)&lt;br /&gt;&lt;br /&gt;--separador alterno&lt;br /&gt;(descripción de contenido html)&lt;br /&gt;(contenido html)&lt;br /&gt;--separador alterno--&lt;br /&gt;&lt;br /&gt;--separador mixto&lt;br /&gt;(descripción de contenido adjunto)&lt;br /&gt;(contenido adjunto)&lt;br /&gt;--separador mixto--&lt;br /&gt;&lt;br /&gt;Se puede observar que los separadores finales tienen un par de quiones extra al final (--).&lt;br /&gt;&lt;br /&gt;Se puede comprobar esto explorando el código fuente de algunos email que se hayan recibido, o algunos simples que ilustren estos tres casos.&lt;br /&gt;&lt;br /&gt;A continuación coloco el código de algunos scripts que desarrollé basado en las ideas que encontré en &lt;a href="http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment"&gt;PHP: Sending Email (Text/HTML/Attachments)&lt;/a&gt; y mucha prueba y error hasta que funcionaron :)&lt;br /&gt;&lt;br /&gt;simple_email.php&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #eeeeff;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;// akobashikawa@gmail.com, 20090828&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$from = isset($_POST['from'])?$_POST['from']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$to = isset($_POST['to'])?$_POST['to']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$subject = isset($_POST['subject'])?$_POST['subject']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$message = isset($_POST['message'])?$_POST['message']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;if (isset($_POST['submit'])) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$headers = "From: $from\r\nReply-To: $from";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$mail_sent = mail( $to, $subject, $message, $headers );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;title&amp;gt;Simple Email&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;style type="text/css"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;h1&amp;gt;&amp;lt;a href="simple_email.php"&amp;gt;Simple Email&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;form action="simple_email.php" method="POST"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;From:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="text" name="from" value="&amp;lt;?php echo $from; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;To:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="text" name="to" value="&amp;lt;?php echo $to; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Subject:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="text" name="subject" value="&amp;lt;?php echo $subject; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Message:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;textarea name="message"&amp;gt;&amp;lt;?php echo htmlentities($message); ?&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="submit" name="submit" value="Send"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php echo isset($mail_sent)?($mail_sent? "Mail sent":"Mail failed"):''; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;html_email.php&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #ddddee;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;// akobashikawa@gmail.com, 20090828&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$from = isset($_POST['from'])?$_POST['from']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$to = isset($_POST['to'])?$_POST['to']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$subject = isset($_POST['subject'])?$_POST['subject']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$message = isset($_POST['message'])?$_POST['message']:'';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;if (isset($_POST['submit'])) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$random_hash = md5(date('r', time()));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php ob_start(); ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;--PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Content-Type: text/plain; charset="UTF-8"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Content-Transfer-Encoding: base64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php echo base64_encode(strip_tags($message)); ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;--PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Content-Type: text/html; charset="UTF-8"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Content-Transfer-Encoding: base64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php echo base64_encode($message); ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;--PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php $_message = ob_get_clean(); ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$headers = "From: $from\r\nReply-To: $from";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$headers .= "\r\n".'MIME-Version: 1.0';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$headers .= "\r\n"."Content-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;$mail_sent = mail( $to, $subject, $_message, $headers );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;title&amp;gt;HTML Email&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;style type="text/css"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;h1&amp;gt;&amp;lt;a href="html_email.php"&amp;gt;HTML Email&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;form action="html_email.php" method="POST"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;From:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="text" name="from" value="&amp;lt;?php echo $from; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;To:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="text" name="to" value="&amp;lt;?php echo $to; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Subject:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="text" name="subject" value="&amp;lt;?php echo $subject; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;Message:&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;textarea name="message"&amp;gt;&amp;lt;?php echo htmlentities($message); ?&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;input type="submit" name="submit" value="Send"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;?php echo isset($mail_sent)?($mail_sent? "Mail sent":"Mail failed"):''; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new';"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;attachment_email.php&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #ccccdd;"&gt;&lt;br /&gt;&lt;span style="font-family: 'courier new'; font-size: 85%;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;// akobashikawa@gmail.com, 20090828&lt;br /&gt;&lt;br /&gt;$from = isset($_POST['from'])?$_POST['from']:'';&lt;br /&gt;$to = isset($_POST['to'])?$_POST['to']:'';&lt;br /&gt;$subject = isset($_POST['subject'])?$_POST['subject']:'';&lt;br /&gt;$message = isset($_POST['message'])?$_POST['message']:'';&lt;br /&gt;if (isset($_POST['submit'])) {&lt;br /&gt;$random_hash = md5(date('r', time()));&lt;br /&gt;if (isset($_FILES['uploadedfile'])) {&lt;br /&gt;$filename = basename($_FILES['uploadedfile']['name']);&lt;br /&gt;$filetype = $_FILES['uploadedfile']['type'];&lt;br /&gt;$tmp_file = $_FILES['uploadedfile']['tmp_name'];&lt;br /&gt;$attachment = chunk_split(base64_encode(file_get_contents($tmp_file)));&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;?php ob_start(); ?&amp;gt;&lt;br /&gt;--PHP-mixed-&amp;lt;?php echo $random_hash; ?&amp;gt;&lt;br /&gt;Content-Type: multipart/alternative; boundary="PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;"&lt;br /&gt;&lt;br /&gt;--PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;&lt;br /&gt;Content-Type: text/plain; charset="UTF-8"&lt;br /&gt;Content-Transfer-Encoding: base64&lt;br /&gt;&lt;br /&gt;&amp;lt;?php echo base64_encode(strip_tags($message)); ?&amp;gt;&lt;br /&gt;&lt;br /&gt;--PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;&lt;br /&gt;Content-Type: text/html; charset="UTF-8"&lt;br /&gt;Content-Transfer-Encoding: base64&lt;br /&gt;&lt;br /&gt;&amp;lt;?php echo base64_encode($message); ?&amp;gt;&lt;br /&gt;&lt;br /&gt;--PHP-alt-&amp;lt;?php echo $random_hash; ?&amp;gt;--&lt;br /&gt;&lt;br /&gt;--PHP-mixed-&amp;lt;?php echo $random_hash; ?&amp;gt;&lt;br /&gt;Content-Type: &amp;lt;?php echo $filetype; ?&amp;gt;; name="&amp;lt;?php echo $filename; ?&amp;gt;"&lt;br /&gt;Content-Disposition: attachment; filename="&amp;lt;?php echo $filename; ?&amp;gt;"&lt;br /&gt;Content-Transfer-Encoding: base64&lt;br /&gt;&lt;br /&gt;&amp;lt;?php echo $attachment; ?&amp;gt;&lt;br /&gt;--PHP-mixed-&amp;lt;?php echo $random_hash; ?&amp;gt;--&lt;br /&gt;&lt;br /&gt;&amp;lt;?php $_message = ob_get_clean(); ?&amp;gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$headers = "From: $from\r\nReply-To: $from";&lt;br /&gt;$headers .= "\r\n".'MIME-Version: 1.0';&lt;br /&gt;$headers .= "\r\n"."Content-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";&lt;br /&gt;$mail_sent = mail( $to, $subject, $_message, $headers );&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Attachment Email&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;&amp;lt;a href="attachment_email.php"&amp;gt;Attachment Email&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;form enctype="multipart/form-data" action="attachment_email.php" method="POST"&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="MAX_FILE_SIZE" value="100000" /&amp;gt;&lt;br /&gt;From:&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="from" value="&amp;lt;?php echo $from; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;To:&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="to" value="&amp;lt;?php echo $to; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;Subject:&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;lt;input type="text" name="subject" value="&amp;lt;?php echo $subject; ?&amp;gt;"&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;Message:&amp;lt;br/&amp;gt;&lt;br /
