<?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-3239375432614520424</id><updated>2012-01-23T00:32:43.628+01:00</updated><category term='FlashDevelop'/><category term='flash'/><category term='s200'/><category term='cvs'/><category term='ffencoderd'/><category term='GWT'/><category term='php'/><category term='Javascript'/><category term='gestión recursos'/><category term='MyRssScreenlet'/><category term='cpan'/><category term='menu exclusivo'/><category term='as3'/><category term='XML::Parser'/><category term='perl'/><category term='a2dp'/><category term='informatica'/><category term='rss4cvs'/><category term='RPC'/><category term='bash'/><category term='time management'/><category term='Web 2.0'/><category term='RIA'/><category term='Ajax'/><category term='Locale'/><category term='make'/><category term='bluetooth'/><category term='generador rss cvs'/><category term='XML::DOM'/><category term='pda'/><category term='programación'/><category term='opensource'/><category term='python'/><category term='rss'/><category term='HTML'/><category term='Norton'/><category term='Ubuntu'/><category term='compiz'/><category term='ingeniero'/><category term='qtek s200'/><category term='management'/><category term='acmqueue.com'/><category term='humor'/><title type='text'>Web 2.0 y programación</title><subtitle type='html'>Artículos sobre programación que se van aprendiendo día a día.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-4577194111468133005</id><published>2010-10-04T21:51:00.011+01:00</published><updated>2010-10-05T14:55:46.091+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='time management'/><category scheme='http://www.blogger.com/atom/ns#' term='gestión recursos'/><title type='text'>WorkMeter para la gestión de equipos de desarrollo</title><content type='html'>Desde hace un tiempo que no envio ningún artículo ya que estoy muy  implicado en un nuevo proyecto que consume buena parte de mi tiempo y  esto me impide mantener el blog como desearía , bueno, en esta ocasión  solo quería compartir esta herramienta que estamos desarrollando y utilizando en nuestra empresa la cual nos ayuda enormemente  en la gestión de equipos de desarrollo. Esta herramienta nos permite saber si estamos sobresaturados, nos da  nuestro time sheet, nos facilita la gestión por proyectos y además hace  que los desarrolladores sean más conscientes de lo que hacen y, por tanto, les ayuda a  gestionar mejor su tiempo.&lt;br /&gt;&lt;br /&gt;La  aplicación proporciona métricas de uso de aplicaciones del  equipo facilitando la toma de  decisiones, aportando una visión  objetiva para poder supervisar y medir el  trabajo de la gente sín tener que depender  de rumores, además permite ajustarse más a la realidad a la hora de planificar la ejecución  de proyectos.&lt;br /&gt;&lt;br /&gt;También es útil, esto es una opción  que todavía tenemos que probar, en la gestión de equipos de trabajo remotos, &lt;a href="http://www.workmeter.com/"&gt; WorkMeter&lt;/a&gt; seguramente puede solucionar el problema de sensación de falta de control al  realizar un proyecto (o parte) fuera de la empresa ya que nos permite realizar un  seguimiento del tiempo invertido y así poder valorar y justificar la  inversión a nuestros jefes de una manera precisa y fiable.&lt;br /&gt;&lt;br /&gt;Se puede probar la aplicación gratuitamente desde la página web&lt;a href="http://www.workmeter.com"&gt; http://www.workmeter.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-4577194111468133005?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.workmeter.com' title='WorkMeter para la gestión de equipos de desarrollo'/><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/4577194111468133005/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=4577194111468133005' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/4577194111468133005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/4577194111468133005'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2010/10/workmeter-para-la-gestion-de-equipos-de.html' title='WorkMeter para la gestión de equipos de desarrollo'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-1611698020038906396</id><published>2009-06-17T23:27:00.003+01:00</published><updated>2009-06-17T23:42:45.634+01:00</updated><title type='text'>Prototipos web, Balsamiq Mockups</title><content type='html'>Durante el desarrollo de una aplicación web una de las fases suele ser la de crear un prototipo de como será la interfaz. Para esta tarea he encontrado recientemente una gran herramienta, &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq Mockups&lt;/a&gt;, esta es una herramienta muy completa con una gran variedad de elementos para la prototipación de una web.&lt;br /&gt;La versión online es muy cómoda de utilizar, tengo pendiente de probar la versión offline, pero para hacer pequeñas webs es ideal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-1611698020038906396?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/1611698020038906396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=1611698020038906396' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/1611698020038906396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/1611698020038906396'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2009/06/prototipos-web-balsamiq-mockups.html' title='Prototipos web, Balsamiq Mockups'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-6957633279465993579</id><published>2008-10-23T00:24:00.003+01:00</published><updated>2008-10-23T00:33:28.182+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='Norton'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>GWT &amp; Norton 360</title><content type='html'>Despues de encontrarnos con problemas para correr una aplicación hecha con GWT nos dimos cuenta que seguramente se debía al control por parte de Norton de las iframes que son creadas dinamicamente y que cargan contenido dinamico, un metodo común para cargar archivos remotos en el "background" de la página, método que muchos sitios utilizan. Si utilizas Norton, desde su versión 2006 y encuentras que alguna aplicación estilo Gmail es extrañamente lenta prueba de desactivar la comprobación "phishing" del sitio.&lt;br /&gt;Para los que desarrollen en GWT, a continuación adjunto un pequeño script que puede solucionar los problemas de GWT con Norton Antivirus, se trata de un pequeño script en bash que reemplaza las ocurrencias de la cadena javascript:'' en todos los archivos .cache.html y lo reemplaza por blank.html de modo que debe añadirse un archivo que teoricamente nunca es requerido, pero por si acaso ;).&lt;br /&gt;El único parametro es la raiz de los archivos compilados por GWT, la carpeta en donde se encuentra los archivos .cache.html .&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;# GWT Norton Hack Script&lt;br /&gt;# This script is to solve the slow down problem of GWT applications&lt;br /&gt;# when viewed in systems which have Norton AV installed. This hack was&lt;br /&gt;# inspired by Gonzalo Domenechs and coded by Iago Tomas, it consists in&lt;br /&gt;# a simple script which searches for files with .cache.html extension in&lt;br /&gt;# a given directory and replaces all javascript:'' occurrences in them.&lt;br /&gt;# This when used in a dynamic builded iframe slows down enormously the&lt;br /&gt;# GWT application if it makes use of such. This tool doesn't provide any&lt;br /&gt;# guarantee to solve your problems its just a script to&lt;br /&gt;# avoid making hand work.&lt;br /&gt;&lt;br /&gt;VERSION="0.1"&lt;br /&gt;&lt;br /&gt;if [ $# -lt 1 ]; then&lt;br /&gt;  echo "GWT Norton Hack Script $VERSION"&lt;br /&gt;  echo "Usage: $0 [path-to-files]"&lt;br /&gt;  exit 0&lt;br /&gt;fi&lt;br /&gt;VAR="$1*.cache.html"&lt;br /&gt;for i in $( ls $VAR); do&lt;br /&gt;     echo "Found: $i"&lt;br /&gt;     cp $i "$i.bak"&lt;br /&gt;     $(sed "s/javascript:''/blank.html/g"&lt;$i&amp;amp;&gt;"$i.new")&lt;br /&gt;     mv $i "$i.bak"&lt;br /&gt;     mv "$i.new" $i&lt;br /&gt;     rm -f "$i.bak"&lt;br /&gt;done&lt;br /&gt;echo "Backup files where created"&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-6957633279465993579?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/6957633279465993579/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=6957633279465993579' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/6957633279465993579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/6957633279465993579'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/10/gwt-norton-360.html' title='GWT &amp; Norton 360'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-7364548512754887577</id><published>2008-08-11T13:13:00.003+01:00</published><updated>2008-08-11T13:22:04.613+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RPC'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><title type='text'>GWT RequestBuilder</title><content type='html'>Despues de  ver la presentación de Google I/O http://sites.google.com/site/io/gwt-and-client-server-communication en la cual se presentan y se comentan las mejoras de GWT 1.5 y además se aconsejan ciertas técnicas para la optimización de la comunicación entre cliente y servidor, GWT RPC es una de las mejores opciones para la comunicación entre servidor y cliente. GWT RPC es un protocolo creado por los desarrolladores de GWT que codifica los datos para guardando los tipos. Este protocolo es una extension de JSON codificada, permite una comunicación segura y con un payload mínimo ya que al ser JSON los datos son interpretados directamente por el navegador no hay descodificación costosa como en el caso de XML u otros servicios REST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-7364548512754887577?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/7364548512754887577/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=7364548512754887577' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7364548512754887577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7364548512754887577'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/08/gwt-requestbuilder.html' title='GWT RequestBuilder'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-8770545074393604715</id><published>2008-04-11T16:19:00.003+01:00</published><updated>2008-04-11T16:31:59.698+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Si los lenguajes de programación flotaran en el agua…</title><content type='html'>¿Nunca os habéis preguntado cómo serían los lenguajes de programación si… estos flotaran como barcos en el agua? ¿&lt;strong&gt;Cómo serían los lenguajes de programación si fueran barcos&lt;/strong&gt;, si fuera botes?&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Turing_%28programming_language%29"&gt;Turing&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Turing sería definitivamente un &lt;strong&gt;kayak&lt;/strong&gt;. Pequeño. Propulsado por energía humana. Se suele usar para aprender a usar los barcos… &lt;em&gt;y es muy canadiense&lt;br /&gt;&lt;/em&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CETMFDbI/AAAAAAAAAEY/Pmx8VWoEx4o/s1600-h/kayak.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CETMFDbI/AAAAAAAAAEY/Pmx8VWoEx4o/s320/kayak.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008306136124850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Java puede ser fácilmente un &lt;strong&gt;buque de carga&lt;/strong&gt;. Es voluminoso. Comercial. Aunque puede cargar mucho peso, llevará un proyecto pero no será muy divertido de llevar a cabo.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_7xHLREG3UvQ/R_-CFjMFDfI/AAAAAAAAAE4/aUC7ChjTiyk/s1600-h/java_programming_cargo.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_7xHLREG3UvQ/R_-CFjMFDfI/AAAAAAAAAE4/aUC7ChjTiyk/s320/java_programming_cargo.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008327610961394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Perl será un &lt;strong&gt;remolcador&lt;/strong&gt;. Poderoso para remolcar a Java donde sea en 80 caracteres o menos.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CmDMFDiI/AAAAAAAAAFQ/ARc9yFKIj1o/s1600-h/perl_programming_tugboat.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CmDMFDiI/AAAAAAAAAFQ/ARc9yFKIj1o/s320/perl_programming_tugboat.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008885956709922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29"&gt;Ruby&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Quizás… una &lt;strong&gt;lancha&lt;/strong&gt; sería la mejor forma de describir a Ruby. Elegante, sexy, muy divertido de conducir. Muy moderno.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CmTMFDkI/AAAAAAAAAFg/SwkXMQs9Rps/s1600-h/ruby_programming_speed_boat.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CmTMFDkI/AAAAAAAAAFg/SwkXMQs9Rps/s320/ruby_programming_speed_boat.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008890251677250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Php"&gt;PHP&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;PHP… será una &lt;strong&gt;balsa de bambú&lt;/strong&gt;. Un montón de apaños seguidos… aunque todavía consigue mantenerse a flote.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CmTMFDjI/AAAAAAAAAFY/eNUiDudmM2k/s1600-h/php_programming_raft.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CmTMFDjI/AAAAAAAAAFY/eNUiDudmM2k/s320/php_programming_raft.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008890251677234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;C es un &lt;strong&gt;submarino nuclear&lt;/strong&gt;. Las instrucciones estarán posiblemente en una lengua extranjera (extraña) pero… todo el código del hardware estará creado para el rendimiento perfecto.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CFDMFDcI/AAAAAAAAAEg/nJ1iXFNyIKU/s1600-h/c_programming_submarine.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CFDMFDcI/AAAAAAAAAEg/nJ1iXFNyIKU/s320/c_programming_submarine.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008319021026754" border="0" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/HTML"&gt;HTML&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;HTML…. realmente &lt;strong&gt;no es un bote&lt;/strong&gt;.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CFTMFDeI/AAAAAAAAAEw/lm_XN7yrwn0/s1600-h/html_not_a_boat.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CFTMFDeI/AAAAAAAAAEw/lm_XN7yrwn0/s320/html_not_a_boat.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008323315994082" border="0" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Assembly_language"&gt;Lenguaje ensamblador&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Barco-casa flotante&lt;/strong&gt;. Potente… pero cansino, abominable y pedante.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CFDMFDdI/AAAAAAAAAEo/E-HSjNX95J0/s1600-h/esamblador_barco.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CFDMFDdI/AAAAAAAAAEo/E-HSjNX95J0/s320/esamblador_barco.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008319021026770" border="0" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/.NET_Framework"&gt;.NET (Microsoft .NET Framework)&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;El… &lt;strong&gt;RMS Titatic&lt;/strong&gt;. Grande, poderoso, con mucha tripulación y puede con todo…. pero con con un pequeño y ridículo golpe te quedas sin.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_7xHLREG3UvQ/R_-ClzMFDgI/AAAAAAAAAFA/P7qHTSQibnE/s1600-h/netrms_titanic_3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_7xHLREG3UvQ/R_-ClzMFDgI/AAAAAAAAAFA/P7qHTSQibnE/s320/netrms_titanic_3.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008881661742594" border="0" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Pascal_%28programming_language%29"&gt;Pascal&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Pascal entraría en lo que se dice en un &lt;strong&gt;buque viejo a vapor&lt;/strong&gt;. Tan grande como antiguo. Los jóvenes marineros siempre lo usaron para aprender… ahora solo se exhibe en algunos museos, así como la fecha de su muerte.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CmDMFDhI/AAAAAAAAAFI/Z8ibbALLb74/s1600-h/pascalphbahia-de-coruna_v.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_7xHLREG3UvQ/R_-CmDMFDhI/AAAAAAAAAFI/Z8ibbALLb74/s320/pascalphbahia-de-coruna_v.jpg" alt="" id="BLOGGER_PHOTO_ID_5188008885956709906" border="0" /&gt;&lt;/a&gt;Esta es una traducción realizada por &lt;a href="http://www.boozox.net"&gt;Boozox.net&lt;/a&gt;&lt;br /&gt;Además de la traducción ha añadido un par de definiciones, en todo caso muy buen trabajo. Un saludo.&lt;br /&gt;NB: Sí sabeis de alguno más no dudéis, vía una entrada de &lt;a href="http://meneame.net/story/si-lenguajes-programacion-fueran-bote"&gt;meneame&lt;/a&gt; desde un &lt;a href="http://compsci.ca/blog/if-a-programming-language-was-a-boat/"&gt;blog… inglés&lt;/a&gt; con mucha comunidad en un foro.&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-8770545074393604715?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://boozox.net/' title='Si los lenguajes de programación flotaran en el agua…'/><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/8770545074393604715/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=8770545074393604715' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/8770545074393604715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/8770545074393604715'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/04/si-los-lenguajes-de-programacin.html' title='Si los lenguajes de programación flotaran en el agua…'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_7xHLREG3UvQ/R_-CETMFDbI/AAAAAAAAAEY/Pmx8VWoEx4o/s72-c/kayak.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-5539987856629342993</id><published>2008-04-10T23:35:00.002+01:00</published><updated>2008-04-10T23:46:33.496+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu no tan libre como se pinta</title><content type='html'>Llevo utilizando Ubuntu desde hace algo más de un año en la versión desktop para mi portatil y desde hace poco que tomamos en serio la versión Server de esta distribución. Pero después de lo que leí en una página publicada por Jordi Mas, un activista en la comunidad opensource catalana, coordinador del proyecto Softcatalà, en donde denunciaba la falta de colaboración por parte del proyecto Ubuntu en la traducción de aplicaciones.&lt;br /&gt;Al parecer todas las traducciones aportadas por los usuarios para internacionalizar las aplicaciones de la distribución no son agregadas a las traducciones oficiales, duplicando así el trabajo realizado. Esto no encaja con la imagen social y colaborativa que presenta Ubuntu, por lo visto aprovecha las aportaciones de la comunidad opensource pero no participa en ella. Estoy seguro que varios de los colaboradores y creadores de Ubuntu participan de forma activa en proyectos Open Source pero al no contribuir con las traducciones desde su distribución parece que Ubuntu quiera aprovecharse de la buena fe de los usuarios.&lt;br /&gt;De todos modos por el momento seguiré utilizando la versión Desktop y seguiré apoyando su uso para servidores, pero esto me deja con ciertas dudas para apoyarlo en futuras ocasiones si sigue leyendo por ahí su falta de participación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-5539987856629342993?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/5539987856629342993/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=5539987856629342993' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5539987856629342993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5539987856629342993'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/04/ubuntu-no-tan-libre-como-se-pinta.html' title='Ubuntu no tan libre como se pinta'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-5241479547078245541</id><published>2008-04-09T15:25:00.004+01:00</published><updated>2008-04-09T15:34:40.175+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cpan'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='make'/><title type='text'>Cpan Writing Makefile Not OK</title><content type='html'>Despues de estar rebuscando en la red sobre el último problema que me ha surgido durante la instalación de modulos a traves de CPAN para perl he podido hallar la solución en uno de los foros escondidos de CPAN. El enlace &lt;a href="http://www.cpanforum.com/threads/502"&gt;http://www.cpanforum.com/threads/502&lt;/a&gt; y ahora resumo un poco el problema y la solución que he encontrado.&lt;br /&gt;Resulta que despues de una instalación de una Ubuntu Server sín más que el entorno base, al ir instalando paquetes necesarios manualmente a traves de apt-get ninguno de los paquetes de desarrollo como make se instalaron por dependencia y la instalación de Perl no dió ningún mensaje de advertencia de que requiriese de estos para utilizarse, lo cual era cierto, solo que hay el pequeño detalle de que entonces no se podrán instalar modulos adicionales, al intentar instalarlos siempre falla en la fase de creación del Makefile, con un escueto&lt;br /&gt;Writing Makefile &lt;any&gt;&lt;br /&gt;     ----Not OK&lt;br /&gt;&lt;br /&gt;Bueno pues como se indica en el foro, el problema reside en que aun habiendo instalado make, si este se ha instalado posteriormente a la instalación de Perl, perl no define en la configuración del entorno de CPAN los parametros para utilizar make. Esto se puede verificar ejecutando CPAN,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cpan&gt; o conf&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;el comando devuelve las variables de entorno fijadas, en mi caso solo definiendo la variable make ya he resuelto el problema pero esto depende del entorno de cada uno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-5241479547078245541?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/5241479547078245541/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=5241479547078245541' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5241479547078245541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5241479547078245541'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/04/cpan-writing-makefile-not-ok.html' title='Cpan Writing Makefile Not OK'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-7768131753767619134</id><published>2008-02-20T00:30:00.003+01:00</published><updated>2008-02-20T01:47:16.547+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffencoderd'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>ffencoderd el demonio de YouTube</title><content type='html'>Bueno esta vez solo quería comentaros sobre el nuevo proyecto en el que me he embarcado. Despues de decidirse que en el nuevo portal que estoy desarrollando debía incluirse una sección de videos estilo YouTube, empecé ha indagar por la red para ver si encontraba la manera de facilitar a los usuarios la codificación de videos a formato flv sin penalizar nuestro pobre servidor demasiado.&lt;br /&gt;Mi idea era encontrar algún tipo de programa que permitiese programar las conversiones de formatos, idealmente este sería un servidor independiente que permitiese codificar, y servir los videos una vez codificados.&lt;br /&gt;Pues despues de unos días (no intensivos) de búsqueda solo encontré la solución de On2, los mismos que desarrollaron uno de los codecs que pueden utilizarse nativamente en flash video. Su solución, de pago obviamente, incluia un pequeño servidor con un servicio rpc permitiendo la interactuación para enviar videos a ser codificados, realizar un seguimiento de la conversión y obtenerlos codificados.&lt;br /&gt;On2 lo llama flixd o la solucion completa (cliente/servidor) Flix Engine/SDK. Proporciona implementaciones para C/Java/Perl y Python, también parace que hay disponible una par a &lt;a href="http://blog.mmmultiworks.com/2007/5/18/on2-flix-engine"&gt;ruby&lt;/a&gt; (no lo sé, eh! no conozco ruby)&lt;br /&gt;ffencoderd intenta realizar unas funciones similares a las de flixd, aunque por el momento solo realiza las funciones básicas espero que pronto pueda tener tiempo para desarrollarlo e implementar funcionalidades como servicio soap y servicio http para servir los videos.&lt;br /&gt;Por ahora este pequeño demonio (daemon ;) permite programar diferentes conversiones utilizando ficheros xml para definir un proceso de conversion y obtener los datos de los ficheros convertidos.  Junto con el programa se ha adjuntado un ejemplo de implementacion en php. Vamos a ver como utilizariamos ffencoderd en un entorno PHP.&lt;br /&gt;Lo primero sería descargar ffencoderd de &lt;a href="http://ffencoderd.sourceforge.net"&gt;http://ffencoderd.sourceforge.net&lt;/a&gt;  , disponer de ffmpeg,PHP y Perl instalados en nuestro sistema (opcionalmente perl y ffmpeg en el servidor donde se ejecutará el proceso de ffencoderd y PHP en el servidor desde donde se servirán los videos).&lt;br /&gt;Una vez tengamos descargado ffencoderd descomprimimos los contenidos en cualquier carpeta de nuestro sistema, lo primero será crear un fichero de configuración para ello encontraremos una versión inicial en la carpeta 'ffencoderd/doc' editamos el fichero para que coincida con nuestro sistema, cada opcion esta comentada en el fichero original. En principio los cambios necesarios serán los parametros referentes a los directorios y ficheros utilizados/creados por ffencoderd.&lt;br /&gt;A revisar :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;output.file : ruta y nombre del fichero de salida (ej: /home/iago/ffencoderd.xml)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;process.dir : ruta hacia el directorio albergando los ficheros de procesos&lt;br /&gt;&lt;/li&gt;&lt;li&gt;video.output.dir : ruta hacia el directorio albergando los videos codificados&lt;br /&gt;&lt;/li&gt;&lt;li&gt;video.input.dir : ruta hacia el directorio albergando los videos sin codificar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pid.dir : ruta hacia una carpeta cualquiera, normalmente /var/run&lt;br /&gt;&lt;/li&gt;&lt;li&gt;log.dir : ruta hacia una carpeta cualquiera, este directorio albergara los archivos de registro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;data.dir : ruta hacia un directorio cualquiera, este directorio albergara los ficheros que crea ffencoderd durante la ejecución&lt;/li&gt;&lt;/ul&gt;Una vez revisado el fichero de configuracion, solo debemos ejecutar en la linea de comandos el archivo principal "ffencoderd.pl" , este acepta varios parametros, puede utilizarse el parametro '-h' para ver todos los parametros aceptados. Nosotros por el momento solo utilizaremos el parametro '-c' que nos permite indicar el fichero de configuracion que deseamos utilizar.&lt;br /&gt;En una consola ejecutamos ffencoderd:&lt;br /&gt;'./ffencoderd.pl -c fichero_configuracion'&lt;br /&gt;Esto iniciará el programa, lo pasará al background y nos devolverá a la consola. Podemos verificar si el se ha puesto en marcha utilizando 'ps -HA|grep ffencoderd', debería devolver una linea como '/usr/bin/perl -X ./ffencoderd.pl ...'&lt;br /&gt;Esto significa que el proceso esta funcionando correctamente, si hemos habilitado el registro (definiendo true en el parametro del fichero de configuración 'log') también podemos verificar el funcionamiento en la carpeta que se ha definido en 'log.dir'.&lt;br /&gt;Bien ahora ya podemos enviar video para ser codificados, los videos deben copiarse a la carpeta definida en 'video.input.dir', esto lo podemos hacer utilizando cualquier método en el servidor, con PHP, via FTP, SSH...&lt;br /&gt;En la carpeta 'doc/php' hay un ejemplo de interfaz en PHP, los archivos Ffencoderd.php, Process.php y IProcess.php.&lt;br /&gt;En la misma carpeta encontramos un ejemplo de utilización en Example.php, a continuación se detalla un poco este archivo.&lt;br /&gt;&lt;br /&gt;Instanciamos la interfaz de ffencoderd, el primer parametro es el archivo que ffencoderd crea con su salida, este concuerda con el parametro 'output.file' el segundo parametro es el directorio que ffencoderd lee para los procesos corresponde a 'process.dir'&lt;br /&gt;$ffencoderd = new Ffencoderd('http://localhost/ffencoderd/ffencoder.xml','/opt/ffencoderd/process/');&lt;br /&gt;Añadir un nuevo proceso, para ello instanciamos la clase Process, el primer parametro sera un identificador unico para el proceso, podemos utilizar cualquier tipo, en principio un entero nos servirá&lt;br /&gt;$process = new Process(1,'ser5.mov','220x300');&lt;br /&gt;Añadimos el proceso para ser procesado&lt;br /&gt;$ffencoderd-&gt;addProcess($process);&lt;br /&gt;Comunicamos a ffencoderd que ya puede codificar, se ha finalizado el envio&lt;br /&gt;$ffencoderd-&gt;process();&lt;br /&gt;&lt;br /&gt;Ahora si queremos podemos verificar si ffencoderd ha terminado de codificar el video utilizando&lt;br /&gt;$ffencoderd = new Ffencoderd('http://localhost/ffencoderd/ffencoder.xml','/opt/ffencoderd/process/');&lt;br /&gt;$process = new Process(1,'ser5.mov');&lt;br /&gt;$status = $ffencoderd-&gt;verify($process);&lt;br /&gt;    switch($status){&lt;br /&gt;        case Ffencoderd::PROCESS_OK :&lt;br /&gt;            echo "&lt;br/&gt;&lt;span style="\"&gt;Video encoding process ended&lt;/span&gt;";&lt;br /&gt;        break;&lt;br /&gt;        case Ffencoderd::PROCESS_IN_WORK:&lt;br /&gt;            echo "&lt;br/&gt;&lt;span style="\"&gt;Video encoding process in work&lt;/span&gt;";&lt;br /&gt;        break;&lt;br /&gt;    }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-7768131753767619134?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://ffencoderd.sourceforge.net' title='ffencoderd el demonio de YouTube'/><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/7768131753767619134/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=7768131753767619134' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7768131753767619134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7768131753767619134'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/02/ffencoderd-el-demonio-de-youtube.html' title='ffencoderd el demonio de YouTube'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-1414302601096641803</id><published>2008-02-04T17:17:00.000+01:00</published><updated>2008-02-06T07:14:38.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='Locale'/><category scheme='http://www.blogger.com/atom/ns#' term='FlashDevelop'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>La clase Locale de AS3, internacionalización en actionscript 3</title><content type='html'>Como no me fue fácil decubrir cómo funcionaba la clase Locale en AS3, quería dejarlo para la bitácora por si a alguién le puede ser útil.&lt;br /&gt;Éste es un método para permitir internacionalizar una aplicación flash, ActionScript 3, este método no puede utilizarse con ActionScript 2. Además éste método es para utilizar principalmente con &lt;a href="http://www.flashdevelop.org/"&gt;FlashDevelop&lt;/a&gt;, supongo que con Flash CS3 IDE puede también hacerse pero no lo he probado.&lt;br /&gt;Primero ActionScript 3 tiene soporte para los archivos &lt;a href="http://docs.oasis-open.org/xliff/v1.2/cs02/xliff-core.html"&gt;XLIFF &lt;/a&gt;, este es una especificación para archivos  XML, lo básico es que debemos crear un archivo por cada idioma que queramos implementar con el siguiente formato. Al crear este archivo XML debemos vigilar de utilizar una codificación UTF-8, si lo creamos con notepad al guardar se puede definir el tipo de codificación en el desplegable de debajo del nombre del arhivo a guardar.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE xliff PUBLIC "-//XLIFF//DTD XLIFF//EN"&lt;br /&gt;"http://www.oasis-open.org/committees/xliff/documents/xliff.dtd" &amp;gt;&lt;br /&gt;&amp;lt;xliff version="1.0" lang="es"&amp;gt;&lt;br /&gt;&amp;lt;file datatype="plaintext" original="ICCS.swf" language="ES"&amp;gt;&lt;br /&gt;                &amp;lt;header&amp;gt;&amp;lt;/header&amp;gt;&lt;br /&gt;                &amp;lt;body&amp;gt;&lt;br /&gt;                      &amp;lt;trans-unit id="010" resname="VER_TODO"&amp;gt;&lt;br /&gt;                                &amp;lt;source&amp;gt;Ver todo&amp;lt;/source&amp;gt;&lt;br /&gt;                        &amp;lt;/trans-unit&amp;gt;&lt;br /&gt;                &amp;lt;/body&amp;gt;&lt;br /&gt;        &amp;lt;/file&amp;gt;&lt;br /&gt;&amp;lt;/xliff&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Una vez creado nuestro archivo lo guardamos en cualquier carpeta dentro de nuestro proyecto (o en cualquier lugar del sistema), lo único que debermos indicarle a la clase Locale donde se halla cada archivo de localización (nuestro archivos XML). Podemos utilizar una ruta absoluta o relativa, aunque aconsejo que sea relativa y ubicar la carpeta dentro de la misma carpeta donde se encuentra nuestro SWF principal.&lt;br /&gt;Para cargar los archivos de localización y poder utilizarlos dentro de la aplicación, debemos definir en nuestro método principal las siguientes lineas:&lt;br /&gt;package {&lt;br /&gt;...&lt;br /&gt;import flash.Locale.*;&lt;br /&gt;...&lt;br /&gt;Locale.addXMLPath("es", "lang/es.xml");&lt;br /&gt;Locale.initialize();&lt;br /&gt;Locale.setDefaultLang("es");&lt;br /&gt;Locale.setLoadCallback(init);&lt;br /&gt;....&lt;br /&gt;  public function init(success:Boolean):void {&lt;br /&gt;   &lt;br /&gt;   trace(Locale.loadString("ID_PRUEBA"));&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;Bien, estas lineas cargarán los archivos de localización y el método loadString nos permite llamar a nuestras traducciones en el idioma definido.&lt;br /&gt;Así por encima los métodos que llamamos hacen lo siguiente:&lt;br /&gt;Locale.addXMLPath(id,path) , añade al listado interno la ruta y el identificador del archivo de localización, luego Locale.initialize() inicializa la instancia con todos los idiomas, Locale.setDefaultLang define el idioma principal a utilizar y Locale.setLoadCallback(funcion) define la funcion que se llamara una vez finalizada la carga de los archivos de localización.&lt;br /&gt;Una vez finalizada la carga podremos llamar al método Locale.loadString(id_traduccion) el cual nos devuelve la traduccion referenciada por el id proporcionado en el idioma definido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-1414302601096641803?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/1414302601096641803/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=1414302601096641803' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/1414302601096641803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/1414302601096641803'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/02/la-clase-locale-de-as3.html' title='La clase Locale de AS3, internacionalización en actionscript 3'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-6409952666807178948</id><published>2008-01-31T04:51:00.000+01:00</published><updated>2008-01-31T05:04:04.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Pixelizer AS3</title><content type='html'>Hace un par de meses que he descubierto AS3 (actionscript 3) y el montón de cosas que permite hacer, bueno ya os contaré más adelante algunas de ellas de momento quería compartir una modesta clase que he adaptado a ActionScript 3 para hacer el efecto de pixelización de una imagen, la clase es muy fácil de utilizar. La he adaptado de actionscript 2 que he encontrado en el blog de sephorith.com&lt;br /&gt;&lt;br /&gt;package {&lt;br /&gt;   import flash.events.Event;&lt;br /&gt;   import flash.events.TimerEvent;&lt;br /&gt;   import flash.utils.Timer;&lt;br /&gt;   import flash.display.Bitmap;&lt;br /&gt;   import flash.display.BitmapData;&lt;br /&gt;   import flash.display.MovieClip;&lt;br /&gt;   import flash.geom.Rectangle;&lt;br /&gt;&lt;br /&gt;   public class Pixelizer extends MovieClip {&lt;br /&gt;       /** define the variables used **/&lt;br /&gt;       private var img:Bitmap;&lt;br /&gt;       private var cloned:Bitmap;&lt;br /&gt;       private var mc:MovieClip;&lt;br /&gt;       private var rect:Rectangle;&lt;br /&gt;       private var row:Number;&lt;br /&gt;       private var w:Number;&lt;br /&gt;       private var h:Number;&lt;br /&gt;       private var diff:Number;&lt;br /&gt;       private var pixelSize:Number;&lt;br /&gt;       private var iPixelSize:Number;&lt;br /&gt;       private var step:Number;&lt;br /&gt;       private var _timer:Timer;&lt;br /&gt;       public function Pixelizer(image_path:Class, pixelSz:Number = 30, _step:Number = 5) {&lt;br /&gt;           iPixelSize = pixelSz;&lt;br /&gt;           step  = _step;&lt;br /&gt;           pixelSize  = pixelSz;&lt;br /&gt;           // attach a bitmapData loading an image&lt;br /&gt;           // from the library&lt;br /&gt;           img = Bitmap(new image_path);&lt;br /&gt;         &lt;br /&gt;           // and clone it&lt;br /&gt;           cloned = Bitmap(new image_path);&lt;br /&gt;           // getting the bitmapdata width and height&lt;br /&gt;           w = img.width;&lt;br /&gt;           h = img.height;&lt;br /&gt;         &lt;br /&gt;           // create a new movieclip and attach the image&lt;br /&gt;           // to it&lt;br /&gt;           addChild(img);&lt;br /&gt;           rect = new Rectangle();&lt;br /&gt;           row = -1;&lt;br /&gt;           while(row &lt; diff =" w" width  =" diff" height =" pixelSize" number =" 0;" y      =" c;" _timer =" new" rect =" new" row =" 0;" diff =" w" width  =" diff" height =" pixelSize" number =" 0;" y      =" c"&gt; 1) {&lt;br /&gt;               pixelSize -= step;&lt;br /&gt;           }&lt;br /&gt;           else if (pixelSize == 1) {&lt;br /&gt;               _timer.stop();&lt;br /&gt;           }&lt;br /&gt;           else {&lt;br /&gt;               pixelSize = 1;&lt;br /&gt;           }&lt;br /&gt;           e.updateAfterEvent();&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Para utilizarla solo debe importarse la clase e instanciarla pasandole como parametro una imagen cargada&lt;br /&gt;ej:&lt;br /&gt;&lt;br /&gt;[Embed(source = '../library/ojo.jpg')] private var FondoImage:Class;&lt;br /&gt;...&lt;br /&gt;var p:Pixelizer = new Pixelizer(FondoImage,20,2);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;La clase extiende a la clase MovieClip así que una vez instanciada solo hay que añadirla mediante el método addChild al escenario o a otro elemento.&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-6409952666807178948?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/6409952666807178948/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=6409952666807178948' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/6409952666807178948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/6409952666807178948'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/01/pixelizer-as3.html' title='Pixelizer AS3'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-7591399121963365149</id><published>2008-01-28T22:15:00.000+01:00</published><updated>2008-01-28T23:36:17.811+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bluetooth'/><category scheme='http://www.blogger.com/atom/ns#' term='a2dp'/><category scheme='http://www.blogger.com/atom/ns#' term='pda'/><category scheme='http://www.blogger.com/atom/ns#' term='qtek s200'/><category scheme='http://www.blogger.com/atom/ns#' term='s200'/><title type='text'>A2DP en Qtek s200</title><content type='html'>Esta vez sólo quería hacer una recopilación de la información que he encontrado en los foros de TodoPocketPc.com, ahí se explica como instalar unos cascos bluetooth en diversos dispositivos a través de diversos posts por los cuales me ví obligado a indagar. Visto el caos que me suponía entender todas la instrucciones necesarias para instalar unos simples archivos para hacer funcionar mis recientemente obtenidos (regalados por mi novia :P) cascos Nokia bluetooth, he decidido dejar un post con las instrucciones necesarias para ello, por si le sirve a alguien.&lt;br /&gt;De hecho el proceso es muy simple, si habeis leido los foros de todopocketpc al respecto sabreis que no es complicado o si crees que lo es no te preocupes.&lt;br /&gt;En primer lugar debes descargar &lt;a href="http://www.megaupload.com/es/?d=QCMU40SQ"&gt;http://www.megaupload.com/es/?d=QCMU40SQ&lt;/a&gt; (sigue las instrucciones de megaupload para hacerlo), este archivo contiene los archivos necesarios para activar el servicio A2DP requerido para hacer funcionar cascos bluetooth estereo funcionando con este servicio (estos no són cascos manos libres normales, sino estereo).&lt;br /&gt;&lt;br /&gt;Una vez descargado el archivo, descomprimelo en cualquier lugar.&lt;br /&gt;Copia los archivos .dll a la carpeta \Windows de la Qtek S200 &lt;br /&gt;Copia los otros dos archivos "a2dp.reg" y "Tor_A2DP_cert.cab".&lt;br /&gt;Instala "Tor_A2DP_cert.cab"&lt;br /&gt;Utilizando Resco Explorer Registry Add-in haz click en "Menú&gt;Importar" e importa el archivo "a2dp.reg" (puedes bajar una version de prueba en http://www.resco.net/pocketpc/explorer/downloads.asp , tienes de instalar Resco Explorer y Resco Explorer Add-In) &lt;br /&gt;Reinicia la Qtek&lt;br /&gt;&lt;br /&gt;Una vez reiniciada la Qtek crea una nueva asociación con los cascos bluetooth (sí ya la has creado elimina la asociación y creala de nuevo) al asociar los cascos se mostrará un nuevo servicio, "Wireless stereo", activalo.&lt;br /&gt;Ya está, si todo ha funcionado deberás poder escuchar tus canciones preferidas con tus cascos bluetooth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-7591399121963365149?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.megaupload.com/es/?d=QCMU40SQ' title='A2DP en Qtek s200'/><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/7591399121963365149/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=7591399121963365149' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7591399121963365149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7591399121963365149'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2008/01/a2dp-en-qtek-s200.html' title='A2DP en Qtek s200'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-131919034164512228</id><published>2007-11-27T18:19:00.000+01:00</published><updated>2007-11-28T11:16:45.031+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='menu exclusivo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Menu agregar/quitar</title><content type='html'>Hace ya algún tiempo que no posteo nada en el blog así que hoy he decidido dejar aquí un poco de los conocimientos adquiridos con este mensaje.&lt;br /&gt;Mientras creaba el nuevo portal en el que estoy trabajando me ví en la necesidad de tener en uno de los formularios del sitio un menú de esos que permite incluir y/o excluir elemento de un listado, los típicos con un botón de agregar hacía uno y quitar hacía otro. Seguro que no es un misterio pero después de dar unas vueltas por la red no encontré ningún script que se adaptase a mis necesidades así que decidí crear uno. Bueno parte la obtuve de un sitio el cual ahora mismo no recuerdo pero como no pedía (que yo recuerde :P)  conservar la nota legal (ni tenía, que yo recuerde de nuevo :P) lo utilizé sin más y modificandolo llegué a obtener el script que presento a continuación.&lt;br /&gt;El script está compuesto por un par de funciones una para añadir / agregar y otra para eliminar / excluir. Se aplica a un par de elementos &lt;span style="font-weight: bold;"&gt;select &lt;/span&gt;y utilizando un par de elementos cualquiera se pueden crear los botones.&lt;br /&gt;El script en ejecución tendría el siguiente aspecto.&lt;br /&gt;&lt;br /&gt;&lt;form&gt;&lt;br /&gt;&lt;select name="listado1" id="listado1" size="3" style="float: left; clear: right; width: 120px;"&gt;&lt;option name="valor1" id="valor1"&gt;v1&lt;/option&gt;&lt;/select&gt;&lt;a style="border:1px solid #c0c0c0;margin:5px;text-decoration:none;float: left;" href="http://#" onclick="del_selected('listado1','listado2');return false;"&gt;&amp;lt;&amp;lt;&lt;/a&gt;&lt;a style="border:1px solid #c0c0c0;margin:5px;text-decoration:none;float: left; clear: right;" href="http://#" onclick="add_selected('listado1','listado2');return false;"&gt;&amp;gt;&amp;gt;&lt;/a&gt;&lt;select name="listado2" id="listado2" size="3" style="float: left; clear: right; width: 120px;"&gt;&lt;/select&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;br /&gt;Para utilizarlo solo debemos crear el formulario, los botones y añadir las dos funciones javascript más abajo.&lt;br /&gt;&lt;br /&gt;Lo único que deberas personalizar es la llamada a las funciones desde los botones, aquí se llaman desde el evento onClick del elemento &amp;lt;A&amp;gt; pero puedes utilizarlo de cualquier otro modo, solo debes llamar add_selected(nombreSelect1,nombreSelect2) y del_selected(nombreSelect1,nombreSelect2) &lt;br /&gt;&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;function add_selected(eout, ein){&lt;br /&gt;     var ob = document.getElementById(eout);&lt;br /&gt;     var oIn = document.getElementById(ein);&lt;br /&gt;     while (ob.selectedIndex != -1) { &lt;br /&gt;       var oSelected = ob.options[ob.selectedIndex];&lt;br /&gt;       var newOption = document.createElement('option');&lt;br /&gt;       newOption.setAttribute('value',oSelected.value);&lt;br /&gt;       newOption.innerHTML = oSelected.innerHTML;&lt;br /&gt;       oIn.appendChild(newOption);&lt;br /&gt;       newOption.selected = true;&lt;br /&gt;       ob.removeChild(oSelected); &lt;br /&gt;     }&lt;br /&gt;    } &lt;br /&gt;function del_selected(eout,ein)&lt;br /&gt;{&lt;br /&gt; add_selected(ein,eout);&lt;br /&gt;}&lt;br /&gt;&lt;/quote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-131919034164512228?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/131919034164512228/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=131919034164512228' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/131919034164512228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/131919034164512228'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2007/11/menu-agregarquitar.html' title='Menu agregar/quitar'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-851584174714456232</id><published>2007-09-18T03:33:00.000+01:00</published><updated>2007-09-18T03:44:12.180+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML::Parser'/><category scheme='http://www.blogger.com/atom/ns#' term='cpan'/><category scheme='http://www.blogger.com/atom/ns#' term='XML::DOM'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Como instalar Perl XML::DOM</title><content type='html'>Despues de haberme peleado para instalar XML::DOM en el servidor, queria dejar por si puede ayudar a alguien.&lt;br /&gt;Al utilizar XML::DOM encontre dos problemas, el primero fue al instalarlo, &lt;a href="http://www.cpan.org/"&gt;cpan&lt;/a&gt; no podia instalar XML::DOM sin forzarlo, así que despues de buscar en el gugle encontré rapidamente la solucion. El problema era que faltaba las cabeceras de expat por instalar. Así que utilizando apt-get rapidamente instalé libexpat-dev como me aconsejaban un par de sitios enunciados por el buscador. Una vez instalado no hubo ningún problema para completar el comando de instalación de &lt;span style="font-weight: bold;"&gt;cpan XML::DOM &lt;/span&gt;&lt;br /&gt;Seguidamente el problema que me encontré fue al utilizar el metodo &lt;span style="font-weight: bold;"&gt;parsefile&lt;/span&gt; de XML::DOM este provocaba problemas de codificacion de los archivos. Despues de otra pequeña inquisicion en gugle dí con que existe un problema interno no resuelto en XML::Parser, el cual impide tratar cualquier fichero que no sea unicode. Bien la solución con la que dí fue menos elegante pero eficaz, en lugar de utilizar el metodo para guardar la definicion de xml que generaba utilice la entrada directa a un archivo y opté por reescribir de nuevo el archivo. De esta manera podía dejar los archivos codificados en UTF-8 para que pudiesen ser leidos por xml_dom en php.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-851584174714456232?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/851584174714456232/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=851584174714456232' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/851584174714456232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/851584174714456232'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2007/09/como-instalar-perl-xmldom.html' title='Como instalar Perl XML::DOM'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-5722441530442689834</id><published>2007-05-30T21:38:00.000+01:00</published><updated>2007-05-31T00:02:45.823+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ingeniero'/><category scheme='http://www.blogger.com/atom/ns#' term='acmqueue.com'/><category scheme='http://www.blogger.com/atom/ns#' term='informatica'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Querido Newbie</title><content type='html'>Esta es la traducción de un artículo de acmqueue.com podeís encontrar la versión original en &lt;a href="http://www.acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;amp;pid=482"&gt;http://www.acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;amp;pid=482&lt;/a&gt;. He intentado traducir fielmente el artículo aunque no siendo un profesional ni invirtiendo demasiado tiempo intento tener algo leible. Espero disfruteis con el artículo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;Estimado KV&lt;/strong&gt;,&lt;br /&gt;Soy nuevo a la programación y he justo comenzado a leer algunos libros acerca de la programación, particularmente de C++ y de Visual Basic. Disfruto de verdad el programar - hasta el punto que en el último par de meses nunca he faltado un día sin escribir un trozo código. Mi preocupación principal ahora es lo que sostiene el mundo para los programadores. ¿Si llaman a alguien programador (es decir, profesionalmente), qué programará realmente él o ella? ¿Inventará siempre nuevo software o qué, realmente? Esto está principalmente en el caso alguien que no trabajara para algún otro. ¿Mi otra pregunta es, puedes realmente hacerte una carrera como programador independiente, y qué programarás básicamente?&lt;br /&gt;un programador Newbie&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Estimado Newbie,&lt;br /&gt;“Qué espera el mundo de los programadores?” Ésta es una pregunta tan interesante que no voy a darte ningún abuso para describirte como newbie ni para mencionar Visual Basic en cortés compañía. No que yo sea cortés compañía, pero puede haber niños alrededor de que podrían oírte. ¡Debemos cuidar a los niños!&lt;br /&gt;&lt;br /&gt;Aunque escogiendo algunos libros en diversos lenguajes de programación, que es lo que has hecho ya, te enseñará que sobre esos lenguajes, no te enseñarán probablemente sobre programación sino solamente sobre la sintaxís del lenguaje que estás estudiando. Voy a jugarme un riñon aquí y a asumiré que lo qué realmente deseas ser no es tanto programador, un término realmente concreto, sino ingeniero.&lt;br /&gt;&lt;br /&gt;En los viejos días cuando tenía el pelo y dientes, o, realmente más cercano a cuando nací y por lo tanto no tenía ni pelo ni diente alguno, un programador era la persona que entraba el programa en la computadora. Otra gente diseñaba el software y los sistemas, y entonces los programadores - había a menudo legiones de ellos - traducían estos diseños en software que la computadora podía entender.&lt;br /&gt;&lt;br /&gt;Con la llegada de la programación interactiva, en comparación con la programación secuencial, la línea entre el programador y el ingeniero se difumina. Ahora un solo ingeniero puede ser el diseñador, el programador, el documentador, la garantía de calidad, el etc. No es que esto sea siempre la opción correcta, pero es cómo la industria se ha desarrollado. El número de gente que es terminantemente programadora, por lo tanto, es realmente pequeño.&lt;br /&gt;&lt;br /&gt;Si deseas ser freelance - como dices, independiente - ingeniero, debes dejar esos libros de lenguajes de programación al azar y escoger algunos libros de cómo construir software. He dejado mi lista de lecturas recomendada en un artículo anterior (“Kode Vicious Bugs Out,” abril de 2006 de Kode) y así que no la repetiré aquí.&lt;br /&gt;&lt;br /&gt;Lo que diré es que puedes tener ya una de las habilidades que necesitas a, que es lo que practicas diario. La informática es una ciencia y un arte. No sé porqué la gente siente la necesidad de hacer esa distinción tan a menudo, porque la mayoría de las ciencias son arte, en el sentido que para seguir siendo bueno en hacer ciencia necesitas practicar, apenas como con un arte. ¡El hecho de que dices, “… en el último par de meses nunca he faltado un día sin escribir un trozo código,” me conduce a creer que tienes una vida de servidumbre y de depresión en adelante! Oh, huh, que no es absolutamente lo que quería decir. Quería decir que ése practicar diario es un componente muy importante de ser buen ingeniero, o programador si tienes gusto.&lt;br /&gt;&lt;br /&gt;No es suficiente escupir código, aunque, cualquier persona que ha oído al vecino trombonista autodidacta puede decirtelo. Después de años de tocar las mismas canciones, nunca las consigue tocar correctamente. Necesitas tomar medidas adicionales para anticiparte en tu arte. Lo primero es leer tanto código como escribes, probablemente más. El software es una forma de expresión, como prosa de la escritura, y como con cualquier tipo de expresión hay idiomas, frases, y los modos del pensamiento que conducen - o en nuestro caso, trabajando - a los diseños que satisfacen y a los que conducen al desastre. Los profesores de literatura són correctos en su aserción en que la “lectura de las obras clásicas” pueda ayudar con tu escritura.&lt;br /&gt;&lt;br /&gt;En software hay un montón de obras clásicas a leer, y hay libros acerca de estas obras clásicas. Para el establecimiento de una red, uno de mis principales campos de interés, el sistema operativo de FreeBSD y su establecimiento de una red del TCP/IP. En el mundo de la base de datos hay MySQL, y para los servidores del Web, Apache. Estas bases de código son obras clásicas, y son Open Source así que són sistemas excelentes para estudiar.&lt;br /&gt;&lt;br /&gt;Tener la historia completa del desarrollo, bajo la forma de revisionado del repositorio del código, es otra razón de trabajar con estos sistemas, puedes ver cómo se desarrollan en un cierto plazo, qué cambios ocurrieron, y por qué razón. Ninguno es perfecto, pero cada uno está bien documentado y és un ejemplo de un sistema vivo, con respiración. Si fueras arquitecto - de edificios, pues los arquitectos diseñan edificios y no software, aunque ese concepto es actualmente popular - desearías viajar por el mundo y estudiar varios pedazos de arquitectura. El software para aprende es mucho más barato, porque no necesitas un billete de avión - puedes permanecer en casa y estudiar los grandes trabajos de nuestra industria con una simple conexión de Internet.&lt;br /&gt;&lt;br /&gt;El siguiente paso es conseguir que otros miren tu código. A menos que seas ese genio de los uno-décimo-de-uno-por ciento que puede hacer toda a la primer - y creo .1 por ciento es abundante - necesitas a gente para enseñarte y repasar la primera vez tu trabajo. Una vez más el Open Source puede ayudar aquí.&lt;br /&gt;&lt;br /&gt;Enviar remiendos de tus programas preferidos, y aprender a trabajar con otros, esa es una de las grandes habilidades no enseñadas en cualquier departamento de la informática. Observar bien que un mentor es sólamente una guía y no debes crecer demasiado dependiente en él, o no aprenderás realmente nada. Un mentor es la persona a recurrir para el consejo cuando has llegado al final de tus ingenios, no cuando tienes una pregunta que puedes contestarte sin ser demasiado perezoso de trabajar en algo distinto. La holgazanería es una manera pobre de sentir bien a un buen ingeniero.&lt;br /&gt;&lt;br /&gt;En cuanto a lo que puedes esperar del amplio mundo del software, bien, como el resto del mundo, 90 por ciento de él es una trampa. Si eres ingeniero freelance o trabajas para una gran compañía, vas raramente a escribir cantidades enormes de código definido por tí. Trabajarás definitivamente más a menudo en el código de otra gente que en tus diseños originales. Hay dos maneras de llevar esto: la primera es matar a cada uno de los ingenieros en la tierra, una tarea que podría tomarte un rato y resultando para tí en la perdida de tus privilegios de Internet; el segundo es cerciorarse siempre de tener cierto sistema en el cual seas tu quien conduce el trabajo. En realidad, así es cómo guardo los fragmentos restantes de mi cordura.&lt;br /&gt;&lt;br /&gt;Sorprende a muchos de mis amigos no-frikis-computadoras que después de un día de trabajo, por las tardes y los fines de semana haría lo qué a ellos les parece la misma cosa, pero no es. Cuando trabajo en mis propios diseños y código, soy el amo, llamo la consonancia, y éso tiene más valor de lo que la mayoría de la gente puede imaginarse.&lt;br /&gt;&lt;br /&gt;A tu pregunta final la respuesta es, programadores freelance puede llevarlo absolutamente bien. La gente freelance consigue a menudo algo menos del trabajo interesante, aunque, por lo menos con mi experiencia, porque consiguen la servidumbre que los lleno-contadores de tiempo no desean hacer. Eso no significa que no debas seguir esta trayectoria, pues puede ser absolutamente lucrativa y si está equilibrado bien puedes dejarte más tiempo para tus propios proyectos. Pero no debes engañarte en tus ideas de que entrarás como un freelance y diseñarás o construirás un gran sistema para un grupo o una compañía; eso es un acontecimiento muy raro. Lo que crearás depende exclusivamnte con quien trabajes. Podría ser sobre cualquier cosa, que es mitad de la diversión del trabajo en software.&lt;br /&gt;Kilovoltio&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-5722441530442689834?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=482' title='Querido Newbie'/><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/5722441530442689834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=5722441530442689834' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5722441530442689834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5722441530442689834'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2007/05/querido-newbie.html' title='Querido Newbie'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-5589741525069544510</id><published>2007-05-14T05:39:00.000+01:00</published><updated>2007-05-14T05:53:41.937+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compiz'/><category scheme='http://www.blogger.com/atom/ns#' term='MyRssScreenlet'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>MyRssScreenlet 1.0</title><content type='html'>De nuevo una pequeña creación que realicé el fin de semana pasado, un widget para el gestor de ventanas &lt;a href="http://www.compiz.org/"&gt;Compiz&lt;/a&gt; para gnome o kde que permite leer las noticias de un archivo de sindicación de noticias RSS, por el momento este solo acepta RSS, pero seguramente se añadirá atom proximamente.&lt;br /&gt;&lt;a href="http://cvs.ingecon.com:8080/MyRssScreenlet.tar.gz"&gt;MyRssScreenlet 1.0&lt;/a&gt;&lt;br /&gt;Los screenlets de Compiz son scripts en python que permiten mostrar en el escritorio perqueño gadgets con especial hincapié estético. Si utilizais Compiz probadlo, darán un toque de diseño a vuestro escritorio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-5589741525069544510?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/5589741525069544510/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=5589741525069544510' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5589741525069544510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/5589741525069544510'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2007/05/myrssscreenlet-10.html' title='MyRssScreenlet 1.0'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-7008111992296159867</id><published>2007-04-24T10:31:00.000+01:00</published><updated>2007-04-24T15:36:18.058+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><title type='text'></title><content type='html'>&lt;blockquote&gt;El web2.0 ha entrado con fuerza y se esta consolidando como blogger o flickr, webs que integran las nuevas tecnologías que forman parte del web 2.0 como Ajax.&lt;/blockquote&gt;&lt;br /&gt;No solamente existe Ajax (Asynchronous Javascript and XML) también se ha consolidado la técnología para la sindicación de noticias RSS/Atom, protocolos que surgieron hace no muchos años y se han implantado como un sistema para agregar contenidos de una página web a otra.&lt;br /&gt;La sindicación de contenidos permite rellenar las webs de hoy en día con contenido relevante en lugar de utilizar elementos esteticos para ello, o también puede servir para crear un recopilatorio de contenidos relevantes. Otra de las tecnologías que ha prevalecido ha sido PHP, implantandose como "middleware" entre los servidores de aplicaciones y los usuarios, los servicios en php permiten agilizar la integración sin tener que realizar un desarrollo muy elaborado y sirven de interfaz a otros sistemas que son más complicados a integrar en una web. De estos sistemas hay varios ejemplos, quizás ahora mismo no sepa citar ninguno, pero la mayoría de portales utilizan php solo como interfaz para luego interaccionar con un sistema más complejo basado en otras tecnologías.&lt;br /&gt;Último citar Javascript y Flash dos tecnologías cliente que han adquirido fuerza con el tiempo y ahora son elemento imprescindible de las llamadas RIA's (Rich Internet Application), aunque Flash ya era desde un principio un sistema ideal para crear este tipo de sites no ha sido hasta la llegada de Ajax que Flash ha dado el salto y se erguido como un entorno de creación de este tipo de aplicaciones, la gente no estaba acostumbrada o Flash a llegado tarde, de cualquier modo Javascript sigue imponiendose y relega a Flash a una segunda posición.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-7008111992296159867?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/7008111992296159867/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=7008111992296159867' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7008111992296159867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7008111992296159867'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2007/04/el-web2.html' title=''/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3239375432614520424.post-7324936433838861000</id><published>2007-04-11T12:15:00.000+01:00</published><updated>2007-04-11T12:31:25.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rss4cvs'/><category scheme='http://www.blogger.com/atom/ns#' term='generador rss cvs'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='cvs'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>rss4cvs en PHP</title><content type='html'>Hola a tod@s, he creado este nuevo blog para dejar huella de alguna manera con lo que voy haciendo al margen del trabajo. En este blog iré dejando consejos y programas que voy creando para facilitarme la vida así espero que también se la facilita a alguien más.&lt;br /&gt;De momento mi primera aportación es un generador de noticias en RSS o atom que crea un feed de las entradas que se envian a un servidor CVS, este generador està creado con Zend_Feed. Es rapidamente integrado en el sistema ya que no hay más que incluirlo en el archivo loginfo en la carpeta CVSROOT dentro de la raiz del repositori, permitiendo así guardar todos los cambios y los mensajes de log.&lt;br /&gt;&lt;br /&gt;Si teneis cualquier duda contactadme, estaré encantado de ayudar en lo que sea posible.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_7xHLREG3UvQ/RhzGzqLUbvI/AAAAAAAAAAk/zTXkO9BIeIk/s1600-h/rss4cvs.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_7xHLREG3UvQ/RhzGzqLUbvI/AAAAAAAAAAk/zTXkO9BIeIk/s320/rss4cvs.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5052131472800247538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;#!/usr/bin/php -q&lt;br /&gt;&lt;?php&lt;br /&gt;&lt;br /&gt;# rss4cvs es un script para crear un feed de los envios al cvs &lt;br /&gt;#&lt;br /&gt;# --------------------------------------------------------&lt;br /&gt;# $Id: rss4cvs.php,v 1.22 2007/04/08 12:14:09 iago Exp $&lt;br /&gt;# --------------------------------------------------------&lt;br /&gt;/**&lt;br /&gt; *  ______   ______ ______ _     _ _______ _     _ ______&lt;br /&gt; * (_____ \ / _____) _____) |   (_|_______|_)   (_) _____)&lt;br /&gt; *  _____) | (____( (____ | |_____ _       _     ( (____&lt;br /&gt; * |  __  / \____ \\____ \|_____  | |     | |   | \____ \&lt;br /&gt; * | |  \ \ _____) )____) )     | | |_____ \ \ / /_____) )&lt;br /&gt; * |_|   |_(______(______/      |_|\______) \___/(______/&lt;br /&gt; * &lt;br /&gt; * rss4cvs $Revision: 1.22 $ , licencia GPLv2&lt;br /&gt; * Este programa funciona con Zend_Framework, cvs 1.1.12. &lt;br /&gt; * Utiliza la clase Zend_Feed para generar feed compatible con rss2.0 o atom, ver informacion sobre &lt;br /&gt; * zend_feed para más.&lt;br /&gt; * &lt;br /&gt; * ==Instalacion==&lt;br /&gt; * &lt;br /&gt; * * copiar en cualquier lugar del sistema de archivos, hacerlo ejecutable.&lt;br /&gt; * * Editar el archivo loginfo que se encuentra en la carpeta CVSROOT del reositorio, ver $CVSROOT.&lt;br /&gt; *  *Insertar :&lt;br /&gt; *   ALL /root/rss4cvs/rss4cvs.php %{sVv} %p "`(echo "";id;echo %s; date;cat)&lt;br /&gt; * &lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;/**&lt;br /&gt; * @todo dar opcion de formato destino.&lt;br /&gt; * @todo mejorar la obtencion de archivos fuente (ahora mismo la fuente es un archivo local, el archivo destino)&lt;br /&gt; */&lt;br /&gt;/**&lt;br /&gt; * opciones de configuracion&lt;br /&gt; */&lt;br /&gt;$output_dir = '/var/www/rss/';&lt;br /&gt;$output_file = 'cvs.rss';&lt;br /&gt;$use_cache_feed =  true;&lt;br /&gt;$feed_title = 'TITULO_FEED';&lt;br /&gt;$feed_description = 'DESCRIPCION_FEED';&lt;br /&gt;$feed_link = 'URL_DESTINO';&lt;br /&gt;$feed_syndication_uri='URL_BASE';&lt;br /&gt;$feed_dir = '/var/www/rss/';&lt;br /&gt;$viewcvs_url="URL_DE_VIEWVC";&lt;br /&gt;$rss4cvs_logo_url = "URL_DEL_LOGO";&lt;br /&gt;$item_title="Nuevo cambio en %s";&lt;br /&gt;$version = '0.9.1';&lt;br /&gt;$max_entries = 50;&lt;br /&gt;date_default_timezone_set('Europe/Madrid');&lt;br /&gt;$feed_type='rss';&lt;br /&gt;$charset = 'iso-8859-1';&lt;br /&gt;$language = 'es';&lt;br /&gt;$license = "GPLv2";&lt;br /&gt;$generator = 'rss4cvs '.$version;&lt;br /&gt;&lt;br /&gt;// Zend framework (http://framework.zend.com)&lt;br /&gt;require_once 'Zend.php';&lt;br /&gt;require_once 'Zend/Feed.php';&lt;br /&gt;&lt;br /&gt;require_once 'Zend/Console/Getopt.php';&lt;br /&gt;try {&lt;br /&gt; $opts = new Zend_Console_Getopt(&lt;br /&gt; array(&lt;br /&gt; 'commited_file|c=s'    =&gt; 'Nombre del archivo que se ha cambiado',&lt;br /&gt; 'old_version|o=s' =&gt; 'Numero de version actual o NONE',&lt;br /&gt; 'new_version|n=s'   =&gt; 'Numero de la nueva version recibida por el archivo',&lt;br /&gt; 'path_commit_file|p=s'   =&gt; 'Ruta del modulo desde la raiz del repositorio',&lt;br /&gt; 'log_message|m=s'   =&gt; 'Mensaje de log',&lt;br /&gt; 'verbose|v' =&gt; 'Mostrar mensajes de debug',&lt;br /&gt; 'help|h' =&gt; 'Mostrar este mensaje'&lt;br /&gt;   )&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt;  $opts-&gt;parse();&lt;br /&gt; if(!$opts-&gt;getOption('c')||!$opts-&gt;getOption('o')||!$opts-&gt;getOption('n')||!$opts-&gt;getOption('p')||!$opts-&gt;getOption('m'))&lt;br /&gt; {&lt;br /&gt;  usage();&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; $commited_file=$opts-&gt;c;&lt;br /&gt; $old_version=$opts-&gt;o;&lt;br /&gt; $new_version=$opts-&gt;n;&lt;br /&gt; $path_commit_file=$opts-&gt;p;&lt;br /&gt; $t_comment=htmlentities($opts-&gt;m);&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; $verbosity=false;&lt;br /&gt; if($opts-&gt;getOption('v'))&lt;br /&gt; {&lt;br /&gt;  echo "Verbosity : on\n";&lt;br /&gt;  $verbosity=true;&lt;br /&gt; }&lt;br /&gt; if($opts-&gt;getOption('h'))&lt;br /&gt; {&lt;br /&gt;  usage();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;catch (Zend_Console_Getopt_Exception $e) {&lt;br /&gt; echo $e-&gt;getUsageMessage();&lt;br /&gt; exit;&lt;br /&gt;}&lt;br /&gt;// fichero en que se han realizado los cambios&lt;br /&gt;//$commited_file = (isset($argv[1]))?$argv[1]:usage();&lt;br /&gt;//// version existente en el repositorio (NONE sino existe ninguna version)&lt;br /&gt;//$old_version = (isset($argv[2]))?$argv[2]:usage();&lt;br /&gt;//// version que se define al archivo&lt;br /&gt;//$new_version = (isset($argv[3]))?$argv[3]:usage();&lt;br /&gt;//// ruta relativa a la raiz del repositorio (sirve apra obtener el modulo)&lt;br /&gt;//$path_commit_file = (isset($argv[4]))?$argv[4]:usage();&lt;br /&gt;//// comentario añadido al commit&lt;br /&gt;//$t_comment = (isset($argv[5]))? htmlentities($argv[5]):usage();&lt;br /&gt;/**&lt;br /&gt; * funcion devolviendo un mensaje de ayuda&lt;br /&gt; */&lt;br /&gt;function usage()&lt;br /&gt;{&lt;br /&gt; global $opts;&lt;br /&gt; echo "  &lt;br /&gt;  ______   ______ ______ _     _ _______ _     _ ______&lt;br /&gt; (_____ \ / _____) _____) |   (_|_______|_)   (_) _____)&lt;br /&gt;  _____) | (____( (____ | |_____ _       _     ( (____&lt;br /&gt; |  __  / \____ \\____ \|_____  | |     | |   | \____ \&lt;br /&gt; | |  \ \ _____) )____) )     | | |_____ \ \ / /_____) )&lt;br /&gt; |_|   |_(______(______/      |_|\______) \___/(______/&lt;br /&gt;  &lt;br /&gt; rss4cvs $version, licencia GPLv2&lt;br /&gt; Este programa funciona con Zend_Framework, cvs 1.1.12. &lt;br /&gt; rss4cvs es un script para crear un feed de los envios al cvs\n&lt;br /&gt; Utiliza la clase Zend_Feed para generar feed compatible con rss2.0 o atom, ver informacion sobre zend_feed para más.\n\n&lt;br /&gt; ";&lt;br /&gt; &lt;br /&gt; echo $opts-&gt;getUsageMessage();&lt;br /&gt; exit;&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt; * funcion escribiendo en el log los pasos que se dan&lt;br /&gt; * @param string $message Mensaje de log&lt;br /&gt; */&lt;br /&gt;function writelog($message)&lt;br /&gt;{&lt;br /&gt; global $verbosity;&lt;br /&gt; $logfile = './rss4cvs.log';&lt;br /&gt; $smessage = strftime("%d/%m/%y %H:%M",time())." -- ".$message."\n";&lt;br /&gt; if($verbosity)&lt;br /&gt; {&lt;br /&gt;  echo $smessage;&lt;br /&gt; }&lt;br /&gt; $fd = fopen($logfile,'a+');&lt;br /&gt; if(!fwrite($fd,$smessage))&lt;br /&gt; {&lt;br /&gt;  echo "rss4cvs Error : (No tiene permisos de escritura en $logfile) \tmessage :$message \n";&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; fclose($fd);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;writelog("Buscando entradas antiguas en ".$feed_dir.$output_file);&lt;br /&gt;//comprobamos si el archivo destino existe para recuperar antiguas entradas&lt;br /&gt;if(file_exists($feed_dir.$output_file))&lt;br /&gt;{&lt;br /&gt; // Fetch the latest Slashdot headlines&lt;br /&gt; try {&lt;br /&gt;  $feed = Zend_Feed::importFile($feed_dir.$output_file);&lt;br /&gt; } catch (Zend_Feed_Exception $e) {&lt;br /&gt;  // feed import failed&lt;br /&gt;  $message = "Exception caught importing feed: ".$e-&gt;getMessage(); &lt;br /&gt;  writelog($message);&lt;br /&gt;  exit;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;// definimos datos del canal&lt;br /&gt;/**&lt;br /&gt; *@todo separar en canales los diferentes modulos&lt;br /&gt; */&lt;br /&gt;$ftitle=((is_object($feed))||isset($feed-&gt;title))?$feed-&gt;title():$feed_title;&lt;br /&gt;$flink=((is_object($feed))||isset($feed-&gt;link))?$feed-&gt;link():$feed_link;&lt;br /&gt;$fdesc=((is_object($feed))||isset($feed-&gt;description))?$feed-&gt;description():$feed_description;&lt;br /&gt;$channel = array(&lt;br /&gt;'title'       =&gt; $ftitle,//$feed-&gt;title(),&lt;br /&gt;'link'        =&gt; $flink,//$feed-&gt;link(),&lt;br /&gt;'description' =&gt; $fdesc,//$feed-&gt;description(),&lt;br /&gt;'entries'       =&gt; array()&lt;br /&gt;);&lt;br /&gt;$existent_titles = array();&lt;br /&gt;// Loop over each channel item and store relevant data&lt;br /&gt;if(isset($feed))&lt;br /&gt;{&lt;br /&gt; foreach ($feed as $item) {&lt;br /&gt;  if(count($channel['entries'])&lt;$max_entries)&lt;br /&gt;  {&lt;br /&gt;   &lt;br /&gt;   if(!in_array($item-&gt;title(),$existent_titles))&lt;br /&gt;   {&lt;br /&gt;    $existent_titles[] = $item-&gt;title();&lt;br /&gt;    $title_verified = $item-&gt;title();&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    $existent_titles[] = $item-&gt;title()." ".strftime("%d/%m %H:%M:%S",time());&lt;br /&gt;    $title_verified = $item-&gt;title()." ".strftime("%d/%m %H:%M:%S",time());&lt;br /&gt;   }&lt;br /&gt;   $channel['entries'][] = array(&lt;br /&gt;   'title'       =&gt; $title_verified,&lt;br /&gt;   'link'        =&gt; $item-&gt;link(),&lt;br /&gt;   'description' =&gt; $item-&gt;description(),&lt;br /&gt;   'content' =&gt; $item-&gt;content(),&lt;br /&gt;   'lastUpdate' =&gt; $item-&gt;lastUpdate()&lt;br /&gt;   );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$comment_format = "Nuevo cambio en el archivo $commited_file &lt;br/&gt; \n%s  &lt;br/&gt; \nViewvc : &lt;a href=\"".$viewcvs_url."/".$path_commit_file."\"&gt;".$viewcvs_url."/".$path_commit_file."&lt;/a&gt;";&lt;br /&gt;$description_format = "%s";&lt;br /&gt;$content=sprintf($comment_format,$t_comment);&lt;br /&gt;$description=sprintf($description_format,$t_comment);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$possible_title = sprintf($item_title,$path_commit_file."/".$commited_file);&lt;br /&gt; &lt;br /&gt;if(!in_array($possible_title,$existent_titles))&lt;br /&gt;{&lt;br /&gt; $existent_titles[] = $possible_title;&lt;br /&gt; $title_verified = $possible_title;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt; $existent_titles[] = $possible_title." ".strftime("%d/%m %H:%M",time());&lt;br /&gt; $title_verified = $possible_title." ".strftime("%d/%m %H:%M",time());&lt;br /&gt;}&lt;br /&gt;$channel['entries'][] = array(&lt;br /&gt;'title'       =&gt; $title_verified,&lt;br /&gt;'link'        =&gt; $viewcvs_url."/".$path_commit_file."/".$commited_file,&lt;br /&gt;'description' =&gt; $description,&lt;br /&gt;'content' =&gt; $content,&lt;br /&gt;'lastUpdate' =&gt; time()&lt;br /&gt;);&lt;br /&gt;writelog("Nuevo cambio en $commited_file");&lt;br /&gt;$channel['charset'] = $charset;&lt;br /&gt;$channel['language'] = $language;&lt;br /&gt;$channel['generator'] = $generator;&lt;br /&gt;$channel['image'] = $rss4cvs_logo_url;&lt;br /&gt;$channel['published'] = time();&lt;br /&gt;$channel['copyright'] = $license;&lt;br /&gt;// Fetch the latest Slashdot headlines&lt;br /&gt;try {&lt;br /&gt; $newfeed = Zend_Feed::importArray($channel,$feed_type);&lt;br /&gt;} catch (Zend_Feed_Exception $e) {&lt;br /&gt; // feed import failed&lt;br /&gt; $message = "Exception caught importing feed: ".$e-&gt;getMessage();&lt;br /&gt; writelog($message);&lt;br /&gt; exit;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(@file_put_contents($output_dir.$output_file,$newfeed-&gt;saveXML())!=0)&lt;br /&gt;{&lt;br /&gt; writelog("Nuevo feed creado ".$output_dir.$output_file . " con exito.");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt; writelog("Error creando ".$output_dir.$output_file);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3239375432614520424-7324936433838861000?l=webdynamix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdynamix.blogspot.com/feeds/7324936433838861000/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3239375432614520424&amp;postID=7324936433838861000' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7324936433838861000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3239375432614520424/posts/default/7324936433838861000'/><link rel='alternate' type='text/html' href='http://webdynamix.blogspot.com/2007/04/rss4cvs-en-php.html' title='rss4cvs en PHP'/><author><name>Iago Tomas</name><uri>http://www.blogger.com/profile/16831721182606217625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://3.bp.blogspot.com/_7xHLREG3UvQ/TKo8Sww3GbI/AAAAAAAAAJs/8xn2hniklo0/S220/la+foto.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_7xHLREG3UvQ/RhzGzqLUbvI/AAAAAAAAAAk/zTXkO9BIeIk/s72-c/rss4cvs.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
