Gnuget http://gnuget.org/ Gnuget Creative Commons Atribución-Licenciamiento Recíproco 2.5 México Wed, 29 Oct 2008 19:24:49 -0700 http://www.textmotion.org Proyecto pepon http://gnuget.org/blog/view/196/proyecto-pepon http://gnuget.org/blog/view/196/proyecto-pepon <p>Desde hace una semana a la fecha he venido trabajando en un pequeño proyecto  al cual he bautizado pepon, pepon nace de la necesidad de tener acceso a un traductor   y evitarme la pereza de ir a abrir  el traductor de google cada vez que lo necesite, la idea inicial era crear un pequeño script para usarlo en la terminal pero esa idea fue evolucionando hasta convertirse en lo que hoy es pepon.</p> <p>Pepon es un pequeño (si es pequeño por que aun no sabe hacer muchas cosas)  robot de gtalk escrito en python que actualmente sabe hacer lo siguiente:</p> <p><ul><li>Generar la tinyUrl de una dirección  web  ( tinyurl http://gnuget.org)</li><li>Generar el md5 hash de una cadena  (md5 cadena_De_Texto)</li><li>Trata de descifrar la cadena  de un hash previamente dado (unmd5 d8578edf8458ce06fbc5bb76a58c5ca4 ) </li><li>Traducir en todos los lenguajes que traduce translate.google.com  (translate en-es  hello world)</li></ul></p> <p>Actualmente algunos amigos y yo estamos trabajando en implementarle mas cosas a  este pequeño robot así que con el tiempo ira creciendo, si quieres tener a este robot en tu lista de contactos de google talk su dirección es esta:</p> <!--begin photo--><div class="photo block-center"> <a href="http://gnuget.org/data/uploads/pepon.png"><img class="picbox-photo" src="http://gnuget.org/data/thumbs/305_fb33d597aaa870ef133fe0759b2ca5b6_pepon.png" width="305" height="55" /></a> </div><!--end photo--><p></p> <p>Si tienes  alguna sugerencia de alguna buena característica que te gustaría que pepon aprendiera a hacer deja un comentario  e intentaremos implementarla.</p> <p>Igualmente nos gustaría que pepon tuviera  un nombre mas acorde  a lo que es (un acronimo relacionado con un robot quizá)  así que igual  cualquier sugerencia es bien recibida.</p> david.valdez210@gmail.com (David Valdez) Wed, 29 Oct 2008 19:24:49 -0700 Caso de estudio: Galaxia Linux y por que no basar un rank en impresiones. http://gnuget.org/blog/view/193/caso-de-estudio-galaxia-linux-y-por-que-no-basar-un-rank-en-impresiones http://gnuget.org/blog/view/193/caso-de-estudio-galaxia-linux-y-por-que-no-basar-un-rank-en-impresiones <p>Si leyeron el post anterior vieron el conflicto que causo <a href="http://www.tecnologiaslibres.net/">Eduardo</a> por  que <a href="http://log.damog.net/">damog</a>  rompió la credibilidad del rank de  Galaxia Linux.</p> <p>Después de esa gran tragedia yo tuve la oportunidad de tener una “lluvia de ideas” para mejorar galaxia linux,  bien,  en lugar de ser una lluvia de ideas vimos a un Programador defendiendo su trabajo  convencido que la forma en que hace las cosas es fiable.</p> <p>El nos cuenta que por ahora están afinando el método y están en beta a lo que yo conteste que  el script de damog demostró que tal cosa no va a ser viable y que tendría que replantear la forma en que rankea los sitios; Eduardo en ese momento me reto a que probara el script de damog para demostrar que tal  script ya no funciona y que él en cuanto detecte  nuevas formas de <b><i>“meter gol”</i></b>  les iba a programar filtros para que no puedan quitarle fidelidad al rank.</p> <p>La conclusión al final  de la conversación era que si me daba tiempo iba a extender el ejemplo de David Moreno a algo que no se pudiera filtrar  y que mostraría que  usar impresiones para armar el rank era algo inviable.</p> <p>Así que hoy deje de ver mi episodio Sara Connors Chronicles  y prepare  un pequeño caso de estudio.</p> <p>Primero,  pensemos un poco acerca de como funciona  su sistema de ranking  de galaxialinux.com</p> <p>1. Crear un script que genere una imagen que a la vez cuente como impresión la pagina del blog que ha sido visitado. (osea este: http://www.galaxialinux.com/rank/banners/banner.php)</p> <p>2. Contar  estas impresiones, pero para darle mas fidelidad tenemos que considerar algunas cosas:</p> <p>-  La ip del visitante no puede ser repetida una cantidad excesiva de veces por que querría decir que el usuario esta apretando repetidamente el botón refresh con tal de subir rank</p> <p>-  Tampoco podemos  meter su IP a una black list permanente por que quizá este usuario gusta de visitar este blog mas de una vez al díá por que este se  actualiza en mas de una ocasión diariamente</p> <p></p> <p>Oks ahora describamos un poco de lo que vamos a escribir:</p> <p>Lo primero,  La ip del visitante no puede ser repetida una cantidad excesiva de veces aquí es donde  actualmente YA falla el script de Damog  (antes no hacían esta revisión) vamos a ver,  la forma mas viable de nunca ser la misma ip sería usando un proxy ¿no? oks, aquí hay un pequeño problema,  muchas paginas de proxies tiene pequeños “hacks” para que alguien no pueda usar curl  y parsear las ips, vi un caso donde  generaban el puerto con javascript y otro donde te exigian javascript “encendido” para poder acceder a la lista, y mejor aun uno hasta tenia un pequeño captcha.</p> <p>Oks lo mas sano  (para mi)  fue buscar unos minutos en google  y  cualquier cosa que tuviera forma de una lista de proxies pegarla en un archivo de texto (aunque esta lista se pegara con pedazos de html o de la pagina no importa realmente, solo importa tener los proxies juntos en un solo texto), rápidamente tenia en un archivo de texto mucha basura junto con  proxies revueltos así que parte del script iba a ser obtener esta lista de proxies.</p> <p>Una vez  teniendo mi lista de proxies escribí el siguiente script:</p> <p><span class="code"><div class="python"> <span style="color: #808080; font-style: italic;">#! /usr/bin/evn python</span><br /> <span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br /> <br /> <span style="color: #808080; font-style: italic;">#Caso de Estudio &nbsp;Galaxia Linux</span><br /> <span style="color: #808080; font-style: italic;">#Autor David Valdez </span><br /> <br /> <br /> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span><br /> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span><br /> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span><br /> <br /> <br /> <br /> <span style="color: #ff7700;font-weight:bold;">class</span> anti_rank:<br /> &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;testing&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><br /> &nbsp; &nbsp; <br /> &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br /> <br /> <br /> &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#request (aquí podemos meter diferentes combinaciones de headers e irlas intercambiando)</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#además podemos poner la pagina que queremos que suba en el rank</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; headers = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'User-Agent'</span>:<span style="color: #483d8b;">'Firefox'</span>,<span style="color: #483d8b;">'Referer'</span>:<span style="color: #483d8b;">'http://www.tecnologiaslibres.net/'</span><span style="color: black;">&#125;</span> &nbsp; &nbsp; &nbsp; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#esta función devuelve una lista de proxies</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; ips = <span style="color: #008000;">self</span>.<span style="color: black;">get_ips</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp;<br /> <br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#por cada proxy intentamos hacer una petición</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> ip <span style="color: #ff7700;font-weight:bold;">in</span> ips:<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>: <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">ProxyHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'http'</span>: ip<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opener = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">build_opener</span><span style="color: black;">&#40;</span>proxy,<span style="color: #dc143c;">urllib2</span>.<span style="color: black;">HTTPHandler</span><span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">install_opener</span><span style="color: black;">&#40;</span>opener<span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;http://www.galaxialinux.com/rank/banners/banner.php&quot;</span>,<span style="color: #008000;">None</span>,headers<span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>response<span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#un poco de verbose</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Visitado con la siguiente ip: &quot;</span>+ ip + <span style="color: #483d8b;">&quot; al sitio:tecnologiaslibres.net&quot;</span> <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span>:<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Error usando este proxy: &quot;</span>+ ip<br /> <br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;numero de visitas realizadas: %d&quot;</span> % visitas<br /> <br /> &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#lista de proxies &nbsp; &nbsp;</span><br /> &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> get_ips<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#lo único que necesitamos esa esta expresión regular que extrae las puras ips </span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#de toda la basura que tenemos de texto</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; get_ip &nbsp;= <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\d</span>{1,3}<span style="color: #000099; font-weight: bold;">\.</span><span style="color: #000099; font-weight: bold;">\d</span>{1,3}<span style="color: #000099; font-weight: bold;">\.</span><span style="color: #000099; font-weight: bold;">\d</span>{1,3}<span style="color: #000099; font-weight: bold;">\.</span><span style="color: #000099; font-weight: bold;">\d</span>{1,3}<span style="color: #000099; font-weight: bold;">\:</span><span style="color: #000099; font-weight: bold;">\d</span>{0,4}&quot;</span><span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">file</span> = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;proxies.txt&quot;</span>,<span style="color: #483d8b;">&quot;r&quot;</span><span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; cadena = <span style="color: #483d8b;">&quot;&quot;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">file</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cadena = &nbsp;cadena + line<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; ips = get_ip.<span style="color: black;">findall</span><span style="color: black;">&#40;</span>cadena<span style="color: black;">&#41;</span> &nbsp; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">file</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br /> <br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> ips <span style="color: #808080; font-style: italic;">#regresamos una gran lista de &nbsp;direcciones de proxies</span><br /> <br /> <br /> <span style="color: #ff7700;font-weight:bold;">if</span> __name__ == &nbsp;<span style="color: #483d8b;">&quot;__main__&quot;</span>:<br /> &nbsp; &nbsp; text = &nbsp;anti_rank<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br /> &nbsp; &nbsp; text.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></span></p> <p>EN base a esto, poniéndome en los zapatos de Eduardo, consideraría lo siguiente:</p> <p>- Siempre cada petición será  una ip diferente.</p> <p>- Suponiendo que los filtros revisen cualquier otra cosa en el header (como user Agent)  puede ser fácilmente fálsificable así que no es una solución validar por alguna otra cosa del header.</p> <p>- Además, banear impresiones por user Agent  aumentaría dramáticamente el caso de falsos positivos y muchas impresiones genuinas  serían tomados como negativos.</p> <p>- Quizá  banear si dos peticiones pasan muy juntas,  tampoco es viable, los primeros lugares en el rank tiene muchisimas impresiones,  limitar por tiempo las peticiones  afectaría directamente a estos primeros lugares (además que podríamos aleatoreamente “pausar” nuestro script para que tampoco tenga peticiones juntas.</p> <p>Concluyendo,  <b>NO</b> hay forma de saber si una impresión es real o es generada por un script como el arriba escrito entonces <b>TAMPOCO</b> hay forma de Programar un  filtro para evitar las impresiones falsas.  así que la única forma de tener un rank viable es <b>REPLANTEAR</b> la forma de generar el rank que este no se base en vistas. <img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /></p> <p>[UPDATE] SI no alcanzan a apreciar el código, <a href="http://gnuget.mechulk.com/devel/ejemplos/galaxialinux.html">aquí se ve mucho mas claro </a></p> david.valdez210@gmail.com (David Valdez) Sat, 04 Oct 2008 00:11:00 -0700 Galaxialinux y Cómo no reaccionar como un perdedor http://gnuget.org/blog/view/192/galaxialinux-y-como-no-reaccionar-como-un-perdedor http://gnuget.org/blog/view/192/galaxialinux-y-como-no-reaccionar-como-un-perdedor <p>Hace unas horas llegue a uno de mis canales favoritos de irc (los que tengo en el auto join)  y me encontré con que ese mismo día en la tarde hubo una discusión, bueno  no se le puede llamar discusión mas bien fue una rabieta  de uno de los programadores de <a href="http://galaxialinux.com">http://galaxialinux.com</a></p> <p>Galaxia linux es una gran idea  pero  tuvieron un  error  que fácilmente quitaba la credibilidad al rank,  el error es simple,  ellos cuentan impresiones de pagina, es decir que  si yo visito mi blog 30 veces al día probablemente podría subir en el rank  gracias a mi mismo. <a href="http://log.damog.net/">Damog</a> hizo algo para probar la vulnerabilidad,  hizo un pequeño scriptcillo  para levantar planetalinux en su rank,  unos minutos mas tarde (como era de esperarse) PL estaba en el top.</p> <p>Damog les aviso (quizá no de la mejor manera) poniendo  un post en su blog describiendo lo que hizo  y  extendiendo la mano a los programadores de  galaxia linux para ayudar a la mejora del sistema.</p> <p>Bueno,  al contrario de lo que podría esperarse Eduardo  entro  agrediendo  a todo el mundo presente y  muy ardido de lo que le hicieron a su proyecto.</p> <p>Tal situación, solo me recuerda  algo que leí hace ya muchos años y es parte de un manual para hacer preguntas inteligentes que escribió Erik S Raymond el cual dice así :</p> <p><span style="font-style: italic"></p> <p><quote></quote><b><quote>Sobre cómo no reaccionar como un perdedor</p> <p>Hay bastantes posibilidades de que te equivoques más de una vez en foros de la comunidad hacker -- de maneras detalladas en este artículo o similares. Y se te dirá exactamente en qué te equivocaste, posiblemente con profusos detalles. En público.</p> <p>Cuando esto sucede, lo peor que puedes hacer es lamentarte por la experiencia, denotar que te han asaltado verbalmente, pedir disculpas, llorar, contener la respiración, amenazar con pleitos, quejarte a los jefes de la gente, dejar la tapa del baño abierta, etc. En vez de eso, esto es lo que tienes que hacer:</p> <p>Superarlo. Es normal. De hecho, resulta saludable y apropiado.</p> <p>Los estándares de la comunidad no se mantienen por sí mismos: los mantiene la gente que los aplica activa, visiblemente, en público. No te quejes de que todas las críticas se te deberían haber enviado por correo privado: así no es como funciona esto. Ni resulta útil insistir en que se te ha insultado personalmente cuando alguien comenta que alguna de tus peticiones era errónea, o que sus opiniones diferían. Ésas son actitudes de perdedores.</p> <p>Ha habido foros de hackers en los que, aparte de un sentido de la hipercortesía mal guiado, se ha prohibido la entrada a participantes por enviar cualquier mensaje haciendo constar errores en los mensajes de los demás, y se les ha dicho “No digas nada si no deseas ayudar al usuario”. El éxodo de los participantes más experimentados a otros lugares les ha hecho descender al balbuceo sin el menor sentido y han perdido toda su utilidad como foros técnicos.</p> <p>Exageradamente “amigable” (de esa manera) o útil: Elige uno.</p> <p>Recuerda: cuando ese hacker te diga que te has equivocado, y (no importa cuan rudamente) te diga que no vuelvas a hacerlo, su actuación te concierne a (1) ti y a (2) su comunidad. Sería mucho más sencillo para él ignorarte poniéndote un filtro. Si no eres capaz de ser agradecido ten al menos un poco de dignidad, no te quejes y no esperes que te traten como una frágil muñeca sólo porque seas un recién llegado de alma teatralmente hipersensible y con ilusiones de estar autorizado a todo</quote></b></span><span style="font-size: xx-small"></p> <p>Para ver el texto completo ir a: <a href="http://www.sindominio.net/ayuda/preguntas-inteligentes.html#NOT_LOSING">http://www.sindominio.net/ayuda/preguntas-inteligentes.html#NOT_LOSING</a></span></p> <p>Es muy lamentable lo que ha ocurrido, espero que Eduardo la próxima vez  muestre un poco mas de madurez y aprenda aceptar sus errores (no importando en que manera se los muestren)  sin animo de ofender, este es un caso que le iría MUY bien al blog de <a href="http://penajena.com/">pena ajena</a>.</p> <p><a href="http://gnuget.org/data/blog/planetalinux_vs_galaxialinux.txt">Aquí esta el log de la conversación si quieren saber lo que paso.</a></p> <p><b>[UPDATE]</p> <p>Cabe destacar  que el pagerank de <a href="http://galaxialinux.com">http://galaxialinux.com</a> en este momento es: </b></p> <!--begin photo--><div class="photo block-center"> <a href="http://gnuget.org/data/uploads/prg0.gif"><img alt="205_c47bd157f76dc1b1b19b6ebf0db82bcd_prg0.gif" src="http://gnuget.org/data/thumbs/205_c47bd157f76dc1b1b19b6ebf0db82bcd_prg0.gif" width="205" height="33" /></a></p> <p></div><!--end photo--><p><b>Y el de  <a href="http://mx.planetalinux.org">http://mx.planetalinux.org</a> es:</b></p> <!--begin photo--><div class="photo block-center"> <a href="http://gnuget.org/data/uploads/prg4.gif"><img alt="205_50e17763bcf185ae127b33f3c25c98c3_prg4.gif" src="http://gnuget.org/data/thumbs/205_50e17763bcf185ae127b33f3c25c98c3_prg4.gif" width="205" height="33" /></a> </div><!--end photo--><p></p> <p><b>Referencia donde saque el pagerank: <a href="http://google.dirson.com/lab/pagerank-calculator.php">http://google.dirson.com/lab/pagerank-calculator.php</a></b></p> david.valdez210@gmail.com (David Valdez) Sun, 28 Sep 2008 00:26:00 -0700 Tip: Saber si un elemento pertenece a un usuario en cakephp http://gnuget.org/blog/view/190/tip-saber-si-un-elemento-pertenece-a-un-usuario-en-cakephp http://gnuget.org/blog/view/190/tip-saber-si-un-elemento-pertenece-a-un-usuario-en-cakephp <p>Para entender en que radica este tip vamos a poner un ejemplo.</p> <p>Supongamos que estamos escribiendo un blog, en él  diversos usuarios pueden  escribir posts y editarlos ahora cuando un usuario va a editar un post previamente escrito  además de que el sistema tenga que verificar  si el usuario puede acceder a los posts debemos de verificar que el susodicho post pertenece al usuario en cuestión.</p> <p>Es muy  sencillo el saber si  el post le pertenece al usuario, esto  haciendo una query y ver que el identificador del usuario  aparecezca en el user_id  de la tabla posts.</p> <p>Pero que pasa cuando tenemos además de posts, tenemos otros tantos módulos como photos, videos,comments, profiles y muchas cosas mas, el escribir esa query  para verificar que cada elemento le pertenece al usuario  termina siendo  tedioso,  es por eso que escribí esta pequeña función:</p> <p><span class="code"><div class="php"> <span style="color: #000000; font-weight: bold;">function</span> pertenece<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$id</span>,<span style="color: #0000ff;">$user_id</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br /> &nbsp; &nbsp; <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">find</span><span style="color: #66cc66;">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">&quot;{$this-&gt;name}.id&quot;</span> &nbsp; &nbsp; =&gt; <span style="color: #0000ff;">$id</span>,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">&quot;{$this-&gt;name}.user_id&quot;</span>=&gt; <span style="color: #0000ff;">$user_id</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#41;</span>,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">&quot;{$this-&gt;name}.id&quot;</span>,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">&quot;{$this-&gt;name}.user_id&quot;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#41;</span>,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">null</span>,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span><br /> &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">True</span>;<br /> &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br /> &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">False</span>;<br /> &nbsp; <span style="color: #66cc66;">&#125;</span></div></span></p> <p>Esta función debe de ser colocada en nuestro  app_model dentro de nuestra carpeta <i><b>/app</b></i> (si no existe app_mode.php podemos copiarlo de el que esta en <b><i>/cake/libs/model/app_model.php</i></b> y ponerlo dentro de nuestra carpeta <i><b>/app</b></i>)</p> <p>Una vez hecho esto, ya solo  para verificar la pertenencia del elemento al usuario tenemos que hacer:</p> <p><span class="code"><div class="php"><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Modelo</span>-&gt;<span style="color: #006600;">pertenece</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$id_del_elemento</span>,<span style="color: #0000ff;">$id_del_usuario</span><span style="color: #66cc66;">&#41;</span>;</div></span></p> <p>Y devolverá <b>true</b> o <b>false</b> dependiendo de si pertenece el elemento o no.</p> <p><b>NOTA:</b> esta función  sirve si y solo si seguimos las convenciones de cake, es decir que siempre tenemos una columna id  y si va a estar relacionada esa columna con la tabla usuarios  debe de existir el campo user_id</p> david.valdez210@gmail.com (David Valdez) Thu, 18 Sep 2008 17:31:00 -0700 Un problema gordo con cakephp http://gnuget.org/blog/view/188/un-problema-gordo-con-cakephp http://gnuget.org/blog/view/188/un-problema-gordo-con-cakephp <p>El día de ayer estaba  revisando el consumo de memoria que generaba una aplicación en la que estoy trabajando y quede  sorprendido, el uso de memoria era excesivo, así que pensé en revisar cuanta memoria era la que consumía este framework por si solo.</p> <p>Me dispuse a bajar una copia fresca del framework y yo recordaba que cuando  teníamos el debug  mayor a cero  aparecía  hasta abajo de la pagina  consumo de memoria o al menos así era  por que ahora por alguna razón los desarrolladores les ha dado por  quitar esa linea, eso  me sonó muy raro así que me dispuse a agregarle una similar y quedo así:</p> <p><span class="code"><div class="php"><span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>Configure::<span style="color: #006600;">read</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br /> &nbsp; &nbsp; <span style="color: #000066;">echo</span> <span style="color: #ff0000;">'&lt;!-- memoria usada: '</span> . <span style="color: #000066;">round</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">memory_get_usage</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #cc66cc;">1024</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> . <span style="color: #ff0000;">' KB --&gt;'</span>;<br /> <span style="color: #66cc66;">&#125;</span></div></span></p> <p>Al cargar el index.</p> <!--begin photo--><div class="photo block-center"> <a href="http://gnuget.org/data/uploads/home.png"><img alt="280_eb0e4d39f7a82fcfb4db577514840a7a_home.png" src="http://gnuget.org/data/thumbs/280_eb0e4d39f7a82fcfb4db577514840a7a_home.png" width="280" height="175" /></a> <span class="photo-description">index</span> </div><!--end photo--><p></p> <p>Me lleve una enorme y no grata sorpresa, el PURO framework  sólito así desempacado marca:</p> <p><span class="code"><div class="html4strict"><span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- memoria usada: 4639.7 KB --&gt;</span></span></div></span></p> <p>me dispuse a probar  cuanto gasta en una hoja con un formulario simple, tan simple como esto:</p> <p><span class="code"><div class="php"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000066;">echo</span> <span style="color: #0000ff;">$form</span>-&gt;<span style="color: #006600;">input</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Example.username'</span>,<span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'label'</span> =&gt; <span style="color: #ff0000;">'nombre de usuario'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;?&gt;<br /> <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000066;">echo</span> <span style="color: #0000ff;">$form</span>-&gt;<span style="color: #006600;">input</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Example.comentarios'</span>,<span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'label'</span>=&gt; <span style="color: #ff0000;">'Comentario'</span>,<span style="color: #ff0000;">'cols'</span>=&gt;<span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;?&gt;</div></span></p> <p>Y la memoria gastada es:</p> <p><span class="code"><div class="html4strict"><span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- memoria usada: 5639 KB --&gt;</span></span></div></span></p> <p>Es decir, en imprimir dos  inputs cake ya se tomo  otro mega completo mas. :S</p> <p>Concluyendo Cuando comencé a trabajar con cake yo tenia en mente que se iba a pagar un precio en memoria por el simple hecho de ser un framework, pero si hace un año me hubieran dicho que el consumo iba a hacer tan enorme  me la hubiera pensado dos veces antes de  escoger este framework como mi herramienta de trabajo diario (a por que cabe destacar que en el alpha y beta de este release candidate el consumo no era tan exorbitante como lo es ahora, parece que entre mas se acercan al estable pagamos mas precio en memoria).</p> david.valdez210@gmail.com (David Valdez) Fri, 12 Sep 2008 16:15:00 -0700 Paste.py subiendo tu código al paste desde la terminal http://gnuget.org/blog/view/187/paste-py-subiendo-tu-codigo-al-paste-desde-la-terminal http://gnuget.org/blog/view/187/paste-py-subiendo-tu-codigo-al-paste-desde-la-terminal <p>Hace tiempo  <a href="http://hunk.com.mx">hunk</a> se dio a la tarea de crear un pequeño  “paste” Este es un servicio que te permite  subir tu código  para mostrárselo al mundo.</p> <p>Cabe destacar que es una herramienta muchas veces imprescindible para los programadores que apenas están aprendiendo o aquellos que dan asesoría vía irc.</p> <p>La dirección de paste es  <a href="http://paste.ideaslabs.com"><a href="http://paste.ideaslabs.com">http://paste.ideaslabs.com</a></a>  algunos días después de que  fue terminado  <a href="http://xiam.menteslibres.org">xiam</a>  dio la idea de que sería útil  hacer un script para poder subír código directamente desde nuestra terminal, para así poder agilizar la subida del mismo, así que hunk y un servidor  nos pusimos manos a la obra.</p> <p>La forma de uso es sencillo, aquí unos ejemplos:</p> <p><span class="code"><div class="bash">gnuget@box~/$ ./paste.py &nbsp;-f mycode.ext &nbsp;</div></span></p> <p>Con esto el script subirá  nuestro  archivo  y  nos regresará una url donde ha sido publicado, el contenido del archivo va a ser mostrado en el navegador  como  texto plano pero si queremos que no sea así es decir, si queremos que  paste.ideaslabs.com nos muestre el código pintado podemos hacer:</p> <p><span class="code"><div class="bash">gnuget@box~/$ ./paste.py &nbsp;-f holamundo.php &nbsp; -l php</div></span></p> <p>(Por ahora el script solo permite los lenguajes: python,php,javascript y css  que son los que usamos nosotros cotidianamente)</p> <p>De esta forma el código estará pintado  al mirarlo en el navegador.</p> <p>otra forma útil de usar el script es usando el entubamiento de bash es decir:</p> <p><span class="code"><div class="bash">gnuget@box~/$ <span style="color: #c20cb9; font-weight: bold;">cat</span> miarchivo.ext | python paste.py</div></span></p> <p></p> <h3>Llevándolo al siguiente nivel:</h3> <p>Bueno, esta herramienta es algo que  podría ser útil de manera muy continua, por eso podemos crear una pequeña carpeta llamada  <i><b>~/.scripts  </b></i>donde meteremos todos nuestros programillas mas útiles como por ejemplo este script,    y para que bash nos lo reconozca como una aplicación mas  hay que  agregar la siguiente linea al bashrc</p> <p><span class="code">export PATH=$PATH:/home/gnuget/.scripts/</span></p> <p>Así  el uso  se simplifica a:</p> <p><span class="code"><div class="bash">gnuget@box~/$ <span style="color: #c20cb9; font-weight: bold;">cat</span> miarchivo.ext | paste.py</div></span></p> <p></p> <p><span class="code"><div class="bash">gnuget@box~/$ paste.py -f myfile</div></span></p> <p>Por último,  podemos pasarle un poco mas de información al script, podemos decirle cuanto tiempo nos gustaría que estuviera en el servidor nuestro archivo (por defecto es una hora)   podemos hacer que sea un día, una semana o un mes, de la siguiente forma</p> <p><span class="code"><div class="bash">gnuget@box~/$ paste.py -f myfile &nbsp;-t hour</div></span></p> <p><span class="code"><div class="bash">gnuget@box~/$ paste.py -f myfile &nbsp;-t week</div></span></p> <p><span class="code"><div class="bash">gnuget@box~/$ paste.py -f myfile &nbsp;-t day</div></span></p> <p><span class="code"><div class="bash">gnuget@box~/$ <span style="color: #c20cb9; font-weight: bold;">cat</span> &nbsp;/etc/<span style="color: #c20cb9; font-weight: bold;">passwd</span> &nbsp;| &nbsp;paste.py -t month</div></span></p> <p></p> <p></p> <p>El código esta bajo licencia MIT por si lo quieren tocar y hacer un poco de feedback esta aqui:</p> <p><a href="http://gnuget.mechulk.com/devel/paste/paste.html">http://gnuget.mechulk.com/devel/paste/paste.html</a></p> <p>Acá esta el tarball  para descargarse:</p> <p><a href="http://gnuget.mechulk.com/devel/paste/pasteil.tar.gz">http://gnuget.mechulk.com/devel/paste/pasteil.tar.gz</a></p> <p>Disfruten <img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /></p> <p>Por cierto,  gracias  a <a href="http://mechulk.com/">Mauro Parra</a> por darme un espacio para poner ahí mi repositorio de código <img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /></p> david.valdez210@gmail.com (David Valdez) Fri, 12 Sep 2008 00:34:00 -0700 Se buscan programadores en Remember the milk http://gnuget.org/blog/view/186/se-buscan-programadores-en-remember-the-milk http://gnuget.org/blog/view/186/se-buscan-programadores-en-remember-the-milk <!--begin photo--><div class="photo block-center"> <a href="http://gnuget.org/data/uploads/remember-the-milk.jpg"><img alt="244_b8f1f32b7e08c1cc9f79b99db1921134_emember-the-milk.jpg" src="http://gnuget.org/data/thumbs/244_b8f1f32b7e08c1cc9f79b99db1921134_emember-the-milk.jpg" height="121" width="244" /></a> </div><!--end photo--><p></p> <p>Estaba revisando mis feeds y me encontré que la empresa que esta detrás de una de mis web apps (<a href="http://rememberthemilk.com/">remember the milk</a>) favoritas esta solicitando programadores.</p> <p><a href="http://www.rememberthemilk.com/about/jobs.rtm">Aquí están los requerimientos  que piden</a>.</p> <p>Te interesa?</p> <p><a href="http://blog.rememberthemilk.com/2008/09/join-growing-rtm-team-all-primates.html">Mas detalles aquí</a></p> david.valdez210@gmail.com (David Valdez) Tue, 09 Sep 2008 00:38:00 -0700 Tip: Tail tu mejor amigo a la hora de depurar tus aplicaciones http://gnuget.org/blog/view/180/tip-tail-tu-mejor-amigo-a-la-hora-de-depurar-tus-aplicaciones http://gnuget.org/blog/view/180/tip-tail-tu-mejor-amigo-a-la-hora-de-depurar-tus-aplicaciones <p>Últimamente a raíz de ver un poco las tripas de textmotion  vi la manera en la que depuran el código.</p> <p>Básicamente  en textmotion tenemos el uso de una función llamada  <span style="font-weight: bold">debug()</span> que nos permite  guardar mensajes en el archivo /temp/debug.log,  eventualmente ahí podremos acudir  si queremos ver que esta pasando  o si se están ejecutando nuestras llamadas a debug.</p> <p>Mientras se desarrolla es muy comodo  hacer lo siguiente:</p> <p><span class="code"><div class="bash"><span style="color: #c20cb9; font-weight: bold;">tail</span> -f &nbsp; temp/debug.log</div></span></p> <p>Con esta linea  tail se queda esperando cambios en el archivo  debug.log así que  si estamos  trabajando y  nuestras llamadas a debug son ejecutadas  aparecerán en tiempo real en nuestra terminal donde estamos ejecutando el tail, así podremos  ver que esta pasando sin necesidad de romper la vista de nuestra aplicación usando  print_r o  var_dump :).</p> <p>Además es enormemente  util cuando hacemos llamadas  al objecto  XHR (nacamente llamado ajax) por que  podemos ver que esta pasando por dentro de nuestra aplicación.</p> <p>Esta forma de  depurar nuestra aplicación  es también posible en <span style="font-weight: bold">cakephp</span>  el archivo al que le tenemos que ejecutar es:</p> <p><span class="code"><div class="bash"><span style="color: #c20cb9; font-weight: bold;">tail</span> -f app/tmp/logs/debug.log</div></span></p> <p>Y la función para  mandar mensajes a este archivo es  <span style="font-weight: bold">$this-&gt;log('lo que queremos que aparezca',LOG_DEBUG);</span></p> <p>De esta forma es mas fácil trabajar.</p> david.valdez210@gmail.com (David Valdez) Thu, 07 Aug 2008 12:41:00 -0700 Tip: Agregar muchos archivos al svn http://gnuget.org/blog/view/179/tip-agregar-muchos-archivos-al-svn http://gnuget.org/blog/view/179/tip-agregar-muchos-archivos-al-svn <p>Muchas veces cuando trabajamos en nuestros proyectos  tenemos que agregar una gran cantidad de archivos de una revisión a otra, esto llega a ser un poco molesto con el tiempo, ir  recorriendo carpeta por carpeta a ver cuales archivos vamos a agregar y cuales no.</p> <p>Por eso, aquí una linea en bash práctica para hacerlo:</p> <p><span class="code"><div class="bash">svn status | <span style="color: #c20cb9; font-weight: bold;">grep</span> ? | &nbsp;<span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $2}'</span> | <span style="color: #c20cb9; font-weight: bold;">xargs</span> svn add &nbsp;$<span style="color: #000000;">1</span></div></span></p> <p>Con eso revisa nuestros nuevos archivos (que con el svn status son precedidos  por un signo <span style="font-weight: bold">?</span>) y  los agrega  al svn.</p> <p>Y es todo <img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /></p> david.valdez210@gmail.com (David Valdez) Mon, 04 Aug 2008 16:31:00 -0700 Respaldando la base de datos para nuestros proyectos http://gnuget.org/blog/view/178/respaldando-la-base-de-datos-para-nuestros-proyectos http://gnuget.org/blog/view/178/respaldando-la-base-de-datos-para-nuestros-proyectos <p>Cuando trabajamos con un manejador de versiones como subversion o cvs   tenemos  que estar constantemente respaldando nuestra base de datos para no perder la estructura  de la misma  con nuestros  compañeros de equipo. Al final  suele ser un infierno que al hacerle un  alter a una columna  tengamos que  (en el peor de los casos)  abrir el phpmyadmin para respaldar la base.</p> <p>Quizá  algo menos  doloroso es usar mysqldump pero después de hacerlo  repetidas ocaciones suele ser  también pesado.</p> <p>Por eso  escribí este pequeño script en bash que ayuda  a esta labor.</p> <p><span class="code"><div class="bash"><span style="color: #808080; font-style: italic;">#!/bin/bash &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><br /> <span style="color: #7a0874; font-weight: bold;">help</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span><br /> &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Usage $0 command&quot;</span><br /> &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot; $0 --all&quot;</span><br /> &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot; $0 --table&quot;</span><br /> <br /> <span style="color: #7a0874; font-weight: bold;">&#125;</span><br /> <br /> <span style="color: #000000; font-weight: bold;">case</span> $<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">in</span><br /> &nbsp; &nbsp; --all <span style="color: #7a0874; font-weight: bold;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; mysqldump -u user -ppass database --opt --triggers --routines &nbsp;&gt; $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">date</span> +%Y_%m_%d_%H_%M<span style="color: #7a0874; font-weight: bold;">&#41;</span>-dump-<span style="color: #007800;">$USER</span>-all.sql<br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;backup all database&quot;</span><br /> <br /> &nbsp; &nbsp; &nbsp; &nbsp; ;;<br /> &nbsp; &nbsp; --table <span style="color: #7a0874; font-weight: bold;">&#41;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> $<span style="color: #000000;">2</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mysqldump -u user -ppassword database &nbsp;$<span style="color: #000000;">2</span> --opt &nbsp;--triggers --routines &nbsp;&gt; $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">date</span> +%Y_%m_%d_%H_%M<span style="color: #7a0874; font-weight: bold;">&#41;</span>-dump-<span style="color: #007800;">$USER</span>-$<span style="color: #000000;">2</span>.sql<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;backup to $2&quot;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">help</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; ;;<br /> <span style="color: #000000; font-weight: bold;">esac</span></div></span></p> <p>La manera de usarlo es sencilla,</p> <p><span class="code"><div class="bash">./backup --all &nbsp; <span style="color: #808080; font-style: italic;">#para respaldar toda la base de datos</span><br /> ./backup --table table_name <span style="color: #808080; font-style: italic;">#para respaldar una tabla en particular</span></div></span></p> <p>Cada que generemos un respaldo ya sea de alguna tabla o de la base completa  nos mostrara la fecha  y el usuario que genero ese backup, así podremos tener mas referencia acerca de  quien es el último que hizo algún cambio en la estructura de la base de nuestro proyecto.</p> <p><img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /></p> david.valdez210@gmail.com (David Valdez) Sun, 27 Jul 2008 00:02:00 -0700 Pasando de latint1 a utf8 http://gnuget.org/blog/view/176/pasando-de-latint1-a-utf8 http://gnuget.org/blog/view/176/pasando-de-latint1-a-utf8 <p>Hace tiempo tuve que migrar una web  completa (hecha a la antigua puro HTML)  y   al ponerla en el nuevo servidor me di cuenta que  los archivos estaban hechos en  LATIN1.</p> <p>Así que cree un pequeño script en bash para pasarlos a utf8  y  que ahora comparto con ustedes:</p> <p><span class="code"><div class="bash"><span style="color: #808080; font-style: italic;">#! /bin/bash</span><br /> <span style="color: #808080; font-style: italic;">#Este script cambia de latin1 a utf8</span><br /> <span style="color: #808080; font-style: italic;">#@author</span><br /> David Valdez &nbsp; &nbsp;<br /> <br /> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;corrigiendo encode de la carpeta &quot;</span> `<span style="color: #7a0874; font-weight: bold;">pwd</span>`<br /> <br /> <span style="color: #000000; font-weight: bold;">for</span> n <span style="color: #000000; font-weight: bold;">in</span> `<span style="color: #c20cb9; font-weight: bold;">ls</span> | <span style="color: #c20cb9; font-weight: bold;">grep</span> .*\.txt `<br /> &nbsp; <span style="color: #000000; font-weight: bold;">do</span><br /> &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">test</span> -f &nbsp;<span style="color: #007800;">$n</span><br /> &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">then</span><br /> &nbsp; &nbsp; &nbsp; iconv <span style="color: #007800;">$n</span> -f &nbsp;Latin1 -t utf8 -o <span style="color: #007800;">$<span style="color: #7a0874; font-weight: bold;">&#123;</span>n<span style="color: #7a0874; font-weight: bold;">&#125;</span></span>.bak<br /> &nbsp; &nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$<span style="color: #7a0874; font-weight: bold;">&#123;</span>n<span style="color: #7a0874; font-weight: bold;">&#125;</span></span>.bak <span style="color: #007800;">$n</span><br /> &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br /> <span style="color: #000000; font-weight: bold;">done</span><br /> <br /> <span style="color: #808080; font-style: italic;">#esto</span><br /> es para hacerlo recursivo &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br /> <span style="color: #000000; font-weight: bold;">for</span> i &nbsp;<span style="color: #000000; font-weight: bold;">in</span> `<span style="color: #c20cb9; font-weight: bold;">ls</span>`<br /> &nbsp; <span style="color: #000000; font-weight: bold;">do</span><br /> &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">test</span> -d <span style="color: #007800;">$i</span><br /> &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">then</span><br /> &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$i</span><br /> &nbsp; &nbsp; &nbsp; <span style="color: #007800;">$HOME</span>/changeEncode.<span style="color: #c20cb9; font-weight: bold;">sh</span><br /> &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span> ..<br /> &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br /> <span style="color: #000000; font-weight: bold;">done</span></div></span></p> <p>Lo único que se tiene que hacer es poner el script en la carpeta padre donde queramos  cambiar el encoding de nuestros archivos y ejecutarlo,  el script visitara  cada archivo y subcarpeta cambiando  la codificación de nuestros archivos.</p> <p>Es todo <img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /></p> david.valdez210@gmail.com (David Valdez) Tue, 08 Jul 2008 12:18:00 -0700 Cambiar una palabra en muchos archivos http://gnuget.org/blog/view/174/cambiar-una-palabra-en-muchos-archivos http://gnuget.org/blog/view/174/cambiar-una-palabra-en-muchos-archivos <p>Muchas veces necesitamos cambiar un path  o palabra,  o nombre en muchos archivos de algún proyecto,  y siempre suele ser engorroso andar abriendo archivo por archivo  buscando la palabra y cambiándola.</p> <p>Por eso he creado este pequeño script en bash que sirve para cambiar  todas las concurrencias por otra palabra  apartir de donde ejecutemos (incluidos los archivos que están en subcarpetas) el script:</p> <p><span class="code"><div class="bash"><span style="color: #808080; font-style: italic;">#!/bin/bash</span><br /> <span style="color: #808080; font-style: italic;">#</span><br /> <span style="color: #808080; font-style: italic;">#</span><br /> <span style="color: #808080; font-style: italic;">#</span><br /> <br /> <span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">find</span> . | <span style="color: #c20cb9; font-weight: bold;">grep</span> -v svn <span style="color: #7a0874; font-weight: bold;">&#41;</span>; &nbsp;<br /> &nbsp; <span style="color: #000000; font-weight: bold;">do</span> <br /> &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">test</span> -f &nbsp;<span style="color: #007800;">$i</span> <br /> &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">then</span> <br /> &nbsp; &nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">sed</span> s/word1/word2/g <span style="color: #007800;">$i</span> &gt; <span style="color: #007800;">$i</span>.tmp &nbsp;&amp;&amp; <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$i</span>.tmp <span style="color: #007800;">$i</span> &nbsp;<br /> &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br /> <span style="color: #000000; font-weight: bold;">done</span></div></span></p> <p>Solo necesitamos cambiar word1  por la palabra a buscar  y word2 por la palabra que queremos que este  en su lugar.</p> <p>Y es todo.</p> <p></p> <p><span style="font-weight: bold">UPDATE:</span> Cortesía  de <a href="http://gwolf.org/"><span>Gunnar</span></a>, una forma mas fácil  de hacer lo mismo:</p> <p><span class="code"><div class="bash"><span style="color: #808080; font-style: italic;">#forma mas fácil</span><br /> <span style="color: #c20cb9; font-weight: bold;">find</span> . |grep -v svn |xargs <span style="color: #c20cb9; font-weight: bold;">perl</span> -p -i -e <span style="color: #ff0000;">'s/word1/word2/g'</span></div></span></p> david.valdez210@gmail.com (David Valdez) Fri, 04 Jul 2008 00:30:00 -0700 Google Developer day http://gnuget.org/blog/view/171/google-developer-day http://gnuget.org/blog/view/171/google-developer-day <p><a href="http://www.flickr.com/photos/david_valdez/2609909886/" title="1er Google Developer day por David Valdez, en Flickr"><p style="text-align: center"><img alt="1er Google Developer day" src="http://farm4.static.flickr.com/3083/2609909886_3d7694c8d1.jpg" height="375" width="500" /></p></a></p> <p>Excelente Evento, <img src="http://gnuget.org/media/emoticons/ichat/happy.png" width="18" height="18" /> fotos  en <a href="http://picasaweb.google.com/juliodudu/GoogleDeveloperDay/"><span>el piccassa del michoacano</span></a>  y en el <a href="http://www.flickr.com/photos/geraloe/sets/72157605780266988/"><span>flickr de  GeralOE</span></a></p> david.valdez210@gmail.com (David Valdez) Wed, 25 Jun 2008 00:14:00 -0700 ModRewrite http://gnuget.org/blog/view/161/modrewrite http://gnuget.org/blog/view/161/modrewrite <p>Excelente manual de mod-rewrite: <a href="http://tinyurl.com/6zg4f5"> <a href="http://tinyurl.com/6zg4f5">http://tinyurl.com/6zg4f5</a></a></p> david.valdez210@gmail.com (David Valdez) Mon, 21 Apr 2008 20:36:00 -0700 Una buena fuente para programar http://gnuget.org/blog/view/157/una-buena-fuente-para-programar http://gnuget.org/blog/view/157/una-buena-fuente-para-programar <p>Algo muy importante para un programador es tener una fuente agradable a la vista,  digo, si vamos a pasar horas y horas todos los días frente a un editor de texto lo menos que podemos pedir es que   sea agradable a la vista.</p> <p>Recientemente encontré una  fuente que me parece fantástica, tiene un tamaño ideal  y me es agradable a la vista, la fuente se llama MONACO.</p> <p><!-- begin photo --> <div class="photo block-center"><a href="http://gnuget.org/data/uploads/monaco.png"><img src="http://gnuget.org/data/uploads/monaco.png" alt="monaco.png" height="216" width="378" /></a></p> <p><span class="photo-description">Una excelente  fuente para programar.</p> <p></span></div> <!-- end photo --></p> <p>La fuente la conseguí en <a href="http://www.gringod.com/2006/02/24/return-of-monacottf/"><span>esta pagina.</span></a></p> <p>Y combinando este tipo de letra  con <a href="http://www.pablasso.com/2007/08/24/suavizando-fuentes-en-ubuntu"><span>este tip que vi en el blog de pablasso  para suavizar  fuentes</span></a> nos crea un excelente ambiente para desarrollar.</p> david.valdez210@gmail.com (David Valdez) Sat, 05 Apr 2008 22:28:44 -0700