Noticias Weblogs Foros Wiki Código
Sponsors:

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

PlanetaCódigo en inglés

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

La luna ilumina por igual a culpables e inocentes

Seguridad en aplicaciones web y modelos de navegación

Julio 31st, 2008 - [Enlace local]

Saludos.

Recientemente, por motivos de trabajo, ha caído en mis manos un manual de buenas prácticas de seguridad para el desarrollo de aplicaciones. Después de ojearlo me han pedido unas ideas de cómo poder evaluar que, en el proceso de desarrollo de una aplicación, se está poniendo en práctica todo lo que viene en dicho manual.

Pensando en ello me ha vuelto a quedar patente la importancia, sobre todo en aplicaciones web, de contar con buenos modelos de referencia y, sobre todo, con un buen modelo navegacional. Un modelo navegacional representa (como no puede ser de otra manera) la navegación del sistema. Cuando hablo de navegación no hablo de en qué pantalla estoy y a qué otra pantalla puedo ir. Eso vendrá más adelante y es solo una parte de la navegación.

Los modelos de navegación con los que trabajo (más información en www.iwt2.org), y muchos otros propuestos por empresas e investigadores, son el pegamento de modelos de información, funcionales y de actores / roles, junto con algunos añadidos más.

Un buen modelo navegacional nos dice con precisión cuáles son los actores / roles que interactúan con la aplicación y qué funcionalidad (por ejemplo definida mediante casos de uso) tiene disponible cada uno, qué información y qué campos de dicha información es accesible para cada actor y qué información no lo es (por ejemplo definida mediante prototipos de visualización o diagramas de clases conceptuales), y, por supuesto, a qué otras secciones de la aplicación pueden acceder o no. Todo esto combinado con información sobre validaciones, permisos, etc. incluida en los requisitos funcionales (por ejemplo mediante los mecanismos de precondiciones y postcondicione sutilizados por muchos autores) nos proporcionan abundante información de seguridad
Por supuesto, luego habrá muchas más reglas a tener en cuenta en diseño y en codificación (verificación de parámetros y controles de seguridad en todas las capas, almacenamiento de información encriptada, etc.), pero ya contamos con una buena base de seguridad en nuestros modelos sin necesidad de realizar ninguna inversión en herramientas o técnicas específicas de seguridad.

A divertirse.

» Leer más, comentarios, etc...

Picando Código

UserAgent Spy: Plugin para WordPress

Julio 31st, 2008 - [Enlace local]

Les presento mi más reciente mini-proyecto. En este caso se trata de UserAgent-Spy, un plugin para WordPress que detecta el navegador web y sistema operativo de quienes dejan comentarios, mostrando el logo. Seguramente muchos dirán “eso ya existe“, o “yo ya lo tengo instalado en mi blog” o “PicandoCódigo mismo viene usando eso hace rato“.

El plugin que “ya existe” es BrowserSniff. Venía usándolo desde hace un tiempo en PicandoCódigo. Sin embargo, le hice unas modificaciones al código, y agregué algunos navegadores web más, aparte de los que ya tenía, y alguna otra cosa que no me acuerdo. Intenté comunicarme con el autor original para informarle de los cambios y bajo qué licencia podía re-distribuirlos. Sin embargo, nunca obtuve respuesta.

¿Porqué no escribirlo de cero? Así podía diseñarlo como quisiera, agregarle las opciones que me parecieran, mantenerlo actualizado, y re-distribuirlo bajo GPL v3. Así que lo hice, y le fui agregando más características. Para empezar, hice que su instalación fuera mucho más sencilla, bien al estilo WordPress, y agregué una página de opciones para personalizar un poco el aspecto del plugin.

UserAgent Spy on WordPress 2.6 default theme

UserAgent Spy en WordPress 2.6 tema por defecto

Comencé escribiéndolo como prueba, para aprender un poco sobre el API de WordPress, y cómo se maneja con los plugins. Y desde ahí seguí adelante. WordPress es muy adaptable y modificable, podemos hacerle de todo. Una cosa divertida que agregué, es que se puede personalizar el mensaje de “Usando tal navegador en tal sistema operativo”. Por ejemplo:

Seguro se les ocurren frases más originales… La idea es hacer mensajes personalizables también según el S.O. / Navegador. Por ejemplo: “Pseudo-navegando con IE que a duras penas levanta en su Windows Vista” :D

Recién voy en la versión 0.4, creo que me falta bastante para una versión 1.0, pero de a poco le voy metiendo código en los ratos libres. El plugin filtra mediante expresiones regulares el string del UserAgent y en base a eso muestra el sistema operativo y navegador web del usuario que comentó. Las expresiones regulares están hechas medias “así nomás” y probablemente les falte algo de trabajo, como así también al código en general. Digamos que por ahora, hace lo que tiene que hacer, pero hay lugar para aprolijarlo.

Lleva un simpático logo del navegador/s.o.
Esto sirve para lucir o humillarse :P.

Subir un plugin al repositorio de plugins de WordPress está muy bueno. Si tu plugin es aceptado, te dan un repositorio SVN propio para hostearlo. Hay que seguir unos estándard para que se muestre la información, se descargue, etc. Desarrollamos el plugin en trunk, como siempre con SVN, y agregamos versiones estables a tags, las cuales hay que especificar en el readme del plugin para que sea la versión a descargar.

Una experiencia más en PHP. Por cierto, UserAgent Spy está instalado en PicandoCódigo desde hace unos cuantos días. Los invito a descargarlo, probarlo, criticarlo, reportar errores, etc. Apenas detecta 11 navegadores web y 14 sistemas operativos recién, pero va creciendo de a poco.

Página de UserAgent-Spy en Wordpress.org

» Leer más, comentarios, etc...

PHP Senior

Guías que debe seguir un ‘PHP Senior’

Julio 31st, 2008 - [Enlace local]

Recorriendo el blog desde sus inicios puedo hacer el siguiente resumen de los artículos que sintetizan de alguna forma todo lo que nos falta a los desarrolladores PHP para poder empezar a considerarnos "Seniors".

Esto es lo que he aprendido con los años y he intentado compartir con ustedes, tratando de lograr consciencia de nuestras carencias y que no podemos quedarnos solo con aprender la sintaxis particular de un lenguaje. Tenemos que romper con el modelo clásico de "programador" ("dominio del lenguaje") y pasar a "desarrollador" ("dominio del sistema").

Los artículos fundamentales hasta la fecha

  1. Los desarrolladores debemos profesionalizarnos
  2. Buenas Prácticas de Desarrollo en PHP
  3. Code Smell - ¿A qué huele tu código?"
  4. Principios de Diseño Orientado a Objetos
  5. Programación Orientada a la Interface
  6. Herencia de clases y el "Principio de Liskov"
  7. Diseño en 3 capas
  8. Separar el código de la capa de presentación
  9. NO es necesaria la herencia múltiple
  10. NO es necesario crear un nuevo framework
  11. Capas de Abstracción
  12. Diferencias entre Lenguajes y Plataformas
  13. Estándares o muerte... para PHP
  14. Cómo traducir de UML a PHP5
  15. Los métodos "getter / setter"
  16. Standard PHP Library
  17. Patrones de Diseño
  18. Patrón Singleton en un entorno web con PHP
  19. Es fundamental contar con namespaces
  20. Migrar definitivamente a PHP5
  21. PHP Coding Standard (draft)
  22. Seven Steps to Better PHP code - part 1
  23. Seven Steps to Better PHP code - part 2

Si tuviera que resumir con un ejemplo qué me demostraría -casi sin dudar- que estoy ante un "Desarrollador PHP" que pasó al "siguiente nivel", sería ver usar correctamente las interfaces, implementando siempre una clase que ofrece un servicio y una interfaz para las clases que quieren usar el servicio, cumpliendo con el "Principio de Abierto / Cerrado", pasando de una programación "Orientada a la Implementación" a una "Orientada a la Interface".

PD: no vale si viene del mundo Java y entra esporádicamente al mundo PHP ;-). Esta forma de trabajo muy arraigada en arquitecturas debe ser nuestra misma forma de trabajo, "pensando en sistemas" y no en "páginas dinámicas con acceso a base de datos".

» Leer más, comentarios, etc...

Fetishcode...Thinking in objects

JDeveloper 10.1.3.4

Julio 31st, 2008 - [Enlace local]

A

» Leer más, comentarios, etc...

Php y otras yerbas - Programación

Novedades para PHP 5.3: namespaces, closures, Phar

Julio 31st, 2008 - [Enlace local]

Traduzco literal de php.net:

La próxima versión de PHP 5.3 introduce algunas nuevas características mayores como namespaces, closures, bindings tardío estático, funciones de i18n, secciones en los archivos INI, y Phar entre otras

¿Qué tiene de importante esto? Varias cosas:

¿Ven? Son grandes noticias. Lo que más me pone contento son las closures, ya que ahorran una gran cantidad de código y facilitaran mucho el trabajo con aquellas funciones que requieren callbacks, como usort. Por lo visto, quedara algo así como :

  1.  <?php
  2.  $a = array(3, 2, 5, 6, 1);
  3.  
  4.  usort($a, function ($a,$b) {$a==$b ? 0:(($a<$b)?-1:1);});
  5.  ?>

Lo cual es mucho más sintético que:

  1.  <?php
  2.  function cmp($a, $b)
  3.  {
  4.   if ($a == $b) {
  5.   return 0;
  6.   }
  7.   return ($a < $b) ? -1 : 1;
  8.  }
  9.  
  10.  $a = array(3, 2, 5, 6, 1);
  11.  
  12.  usort($a, "cmp");
  13.  ?>

» Leer más, comentarios, etc...

Pensamientos ágiles

Portabilidad: Siguiendo la especificación

Julio 31st, 2008 - [Enlace local]

En Coding the Architecture abrieron un debate muy interesante hace unos días. Es ese tipo de debate en el que miras hacia atrás y ves inevitablemente como tu opinión ha ido cambiado con el tiempo, ya se hacia un lado o hacia el otro. Y es que al final, cada uno contará la historia como le haya ido en la feria.

Hace ocho años, era todo acerca de la portabilidad. Acerca de la especificación. La portabilidad era la gran baza de JEE, y cualquiera que se mantuviese dentro de los límites de la especificación estaba a salvo. ¡Qué gran consuelo cuando tecnologías como EJB 1.1 te garantizaban un camino amargo y tortuoso! Con el tiempo, el debate sobre portabilidad se ha aligerado mucho, y el no seguir la especificación es como el hombre del saco, que te asusta las primeras veces pero que cuando ves que funciona y no pasa nada, pues pierde toda su importancia.

En mi caso, como el de Simon Brown, mi opinión también ha ido cambiando con el tiempo. Pero un poco al contrario. Hace años yo era partidario de no seguir la especificación si llegabas a un punto en el que te estaba restringiendo demasiado. Todavía recuerdo discusiones airadas sobre este tema con amigos y compañeros de trabajo que opinaban justamente lo contrario. El tiempo me ha enseñado que no hay una verdad única respecto a este tema, y que como casi todo, realmente dependerá en el problema que tengas que solucionar, pero que si realmente decides apartarte de la especificación, este debe ser un factor como otro cualquiera que deberás balancear y sobre el que deberás ponderar riesgos y ventajas.

Por ejemplo, hace tiempo, trabajando en un proyecto me encontré con varias partes de una gran aplicación que utilizaban threads directamente para realizar ciertas operaciones. Estas operaciones incluían escrituras en base de datos o envio de mensajes entre otras cosas. ¡Herejía! ¡Uso de threads en managed-systems! El desarrollo había continuado adelante porque era rápido y porque nunca había pasado nada. Sin embargo, a medida que la carga del sistema aumentaba, se pudo observar que se empezaban a perder mensajes, que había transacciones que no se completaban o se hacía rollback de repente, y otro número de efectos insospechados.

El problema era que se habían apartado demasiado de la especificación, y los efectos eran inesperados. Es así de fácil. No estás en la especificación, no tienes garantía de nada. ¡Si es que a veces no la tienes ni cuando sigues la especificación! La solución en este caso fue aprovechar que el servidor implementaba la specificación commonj y devolver esos Threads al contexto que le pertenecían, el contenedor. Eso solucionó todos los problemas.

Ser consciente de que te pueden pasar estas cosas es algo importante a la hora de hacer la decisión de restringirte o no a la especificación. Otro factor muy importante que he podido ver con el tiempo es el negocio al que se dedique la compañía, y como se va a vender la aplicación que se está creando. Muchas compañías que facturan productos ofrecen soluciones basadas en plataformas comunes como Oracle, WebSphere, WebLogic, a la vez que ofrecen otras soluciones de bajo coste basadas en MySQL, PostgreSQL o JBoss. En este caso, es importante mantenerse lo más cerca posible de la especificación, ya que cualquier opción especial que utilizemos la tendremos que reimplementar tanto para la plataforma premium como para la Open Source.

Otro caso con el que me encontrado es con productos que están bajo un servidor de aplicaciones en contreto y necesitan ser migradas a otro para entrar en determinado sector. Un ejemplo típico sería el entrar en la banca donde en algunos sitios te exigirán IBM WebSphere como plataforma de despliegue.

En fin, que al final, como mencionan en los comentarios, es un balance entre los planes de futuro que haya en la aplicación en cuanto a portabilidad y los problemas que nos encontremos al desarrollar. Si existe la posibilidad de despligue en múltiples plataformas, entonces es mejor ir con cuidado; en caso contrario, siempre se puede quebrantar un poco más las normas, pero siempre siendo conscientes de las posibles consecuencias en cuanto a efectos inesperados.

» Leer más, comentarios, etc...

jenaiz.com - RubyOnRails

Instalación de recaptcha

Julio 31st, 2008 - [Enlace local]

Si el otro día hablábamos de crear comentarios gracias al plugin acts_as_commentable, creo que convendréis conmigo en que nos dejamos una cosita en el tintero, ¿qué pasa con la seguridad? Existen infinidad de robots en internet que si ven un formulario y pueden utilizarlo, no dudarán en hacerlo. Por lo que nuestro sistema de comentarios está inconcluso: debemos protegerlo. Y que mejor manera que añadir Recaptcha para validar el envio de un comentario.

Paso uno e indispensable, instalación del plugin:

script/plugin install http://svn.ambethia.com/pub/rails/plugins/recaptcha

Si queréis, podéis utilizar la última versión del plugin, que está alojada ahora en github, por lo que si no habéis experimentado con git aún, os lo recomiendo como experiencia para empezar a utiliar git.

Por si os interesa lo anterior, el plugin ahora se encuentra en: http://github.com/ambethia/recaptcha.

Lo primero que os recomiendo es que vayáis a Recaptcha y obtengáis vuestras llaves, pública y privada, que hacen falta para poder utilizar el plugin; en mi caso ya las estaba utilizando en este blog. No os las pego por seguridad y porque no os servirían, dado que están asociadas a la url en cuestión.

Una vez las tenéis, deben ser añadidas a environment.rb de la forma:

ENV['RECAPTCHA_PUBLIC_KEY'] = 'tullavepublica'
ENV['RECAPTCHA_PRIVATE_KEY'] = 'tullaveprivada'

En la vista, para mostrarlo, sólo tendríamos que añadir:

<%= recaptcha_tags %>

en caso de estar utilizando ssl, deberéis cambiarlo a:

<%= recaptcha_tags :ssl => true %>

Y ahora en nuestro método de publicación, debéis comprobar la validez del Recaptcha, de la forma:

if verify_recaptcha
...
else
flash[:error] = "Ha habido un error en el envio."
render :action => 'show'
end

Nosotros lo utilizamos para publicar comentarios, por lo que el método en cuestión queda como sigue:

if verify_recaptcha
@entry = Entry.find(params[:id])
comment = Comment.new(params[:comment])
@entry.add_comment comment
comment.save!
flash[:notice] = "Comentario añadido con éxito"
else
flash[:error] = "Ha habido un error en el envio del comentario."
end
redirect_to :action => 'show'

Pues nada, listo, ya tenéis validación con Recaptcha en vuestros comentarios.

» Leer más, comentarios, etc...

Pwned's blog - Desarrollo de Tecnologia

¿Aun programas en ASM?

Julio 31st, 2008 - [Enlace local]

Despues de leer el post publicado por Andrés Panitsch en Desarrollo de Software, acerca de los programadores de bajo nivel, quisiera expresar mi opinion con respecto a esto.

Si, en cierto grado nunca esta de mas saber como se trabaja directamente con la maquina y como poder aprovecharla al maximo, incluso yo mismo incursione en la programacion a bajo nivel con ASM AT&T, aqui hay un post y aca otro que lo demuestran.

Pero creo que para estos tiempos ya el tener que aprender un lenguaje como ASM como salida profesional es demasiado complejo y alejado considerablemente de un lenguaje de alto nivel en cuanto a terminos de eficiencia y rapidez en el proceso de elaboracion de un programa.

Aunque claro ASM tienes sus ventajas, sobre todo a la hora de debuggear que al menos a mi me ha salvado la vida unas cuantas veces pero creo que no le encuentro otra utilidad.

MOV END

Entradas relacionadas:


Pwned's Blog

» Leer más, comentarios, etc...

Picando Código

Ceibal Florida: Futuros programadores crean juegos con Scratch

Julio 30th, 2008 - [Enlace local]

¡Miren qué genial esta historia! Directo desde Florida, donde gracias a las XO y el Proyecto Ceibal, se están formando los programadores del mañana:

Agustín Gallo y Cristian Fleitas son dos alumnos que concurren a la Escuela Nº 116 “República Argentina” de Florida. Ellos, luego de experimentar todos los recursos que nos brinda la XO, sintieron que estaban “aburridos”. Gracias a la prima de Cristian descubrieron el Scratch y desde ese momento no lo abandonaron más.

El aburrimiento llevó a estos niños (salvando las diferencias) a crear su propio equipo de desarrollo de juegos:

Es muy fácil - dice Cristian - Agustín diseña y yo programo que van a hacer los dibujos.

Como ven, ya están dividiendo tareas, y creando sus programas con Scratch. El título es un poco exagerado, no se sabe si a estos niños les terminará importando la programación, pero piensen en potencial.

Scratch es un lenguaje de programación interpretado dinámico y visual, implementado en Squeak. Su meta es enseñar conceptos de programación a los adolescentes y permitirles crear juegos, videos y música. En Scratch todos los objetos interactivos, gráficos, y sonidos se pueden importar fácilmente a un nuevo programa y combinar. De esa forma, los principiantes pueden obtener resultados rápidos y motivarse a probar más. Está siendo desarrollado por un pequeño grupo de investigadores del Lifelong Kindergarten Group en el MIT Media Lab.

Entre sus creaciones, un ahorcado:

Ceibal Florida - Ahorcado con Scratch

Ceibal Florida - Ahorcado con Scratch

Esta información llega del blog de Ceibal Florida, donde prometen incluir videos de las creaciones de los alumnos más adelante.
Tengan cuidado, ¡pronto estos niños podrían estar sacándole el trabajo a muchos programadores y compitiendo a nivel global!
:D

» Leer más, comentarios, etc...

Jorge Dieguez Blog

Tzunami Deployer - Una herramienta para migrar contenidos/información a WSS/MOSS

Julio 30th, 2008 - [Enlace local]

Cualquier organización que esta empleando soluciones de gestión documental, trabajo en grupo, gestión de conocimiento tarde o temprano se encontrara con la necesitad de hacer cargas masivas de la información. Por ejemplo hay muchísimas organizaciones que "migrar" la información almacenada en repositorios SharePoint 2003 a SharePoint 2007.
Para resolver este tipo de necesidad existen diversas opciones, entre otras la empresa Tzunami ,partner de Microsoft ofrece una solución que parece bastante interesante. Se trata del producto Tzunami Deployer, es una aplicación de escritorio que permite modelar una "migración" desde distintas fuentes: lotus notes, sharepoint 2003, sistema de ficheros y especificando un mapeo de metadata.  Se puede solicitar una versión de evaluación y probar las funcionalidades de esta aplicación.
image

A continuación dejo algunas pantallas:

- Creamos un proyecto nuevo, indicamos el tipo de fuente de información y el destino.

image

 

- Configuramos / Conectamos con las aplicaciones Origen y Destino(en este ejemplo he seleccionado cargar contenidos en un SharePoint 2007 desde un SharePoint 2007)

image

image


» Leer más, comentarios, etc...

soft·in·spain

Ubuntu o Windows

Julio 30th, 2008 - [Enlace local]

Al ordenador de casa, un PC de unos tres años, le está fallando el disco principal y se lo voy a cambiar, pero entonces me llega la duda de si ponerle Windows o Ubuntu. No es sencillo puesto que ese ordenador lo utilizamos todos en casa: Mi mujer, mis hijos y yo. A diferencia del portátil que solo tiene un usuario, yo.

Mi mujer me dice que le da igual, porque ella ya ha visto que con el portátil puedo hacer lo mismo que hacían antes, ella tampoco es que sea una power user, con un navegador, para buscar cosas y leer el correo, y el messenger (emesene), para hablar con amigas y hermanas, tiene suficiente. De hecho creo que un Asus eee sería su máquina ideal.

En ese ordenador tengo una impresora HP2360 que con el HPLIP creo que podré hacer funcionar, también tengo un lector de tarjetas de memoria externo USB que ya he probado con el portátil y funciona, pero lo que no encuentro como solucionar es que tengo una capturadora/conversor de video Adaptec AVC2210 por USB, para el que no he encontrado ningún driver y que al conectar al portátil, con Ubuntu 8.04, no la reconoce. Una alternativa sería hacer una partición en el disco de 50GB y meter ahí el XP solo para cuando necesite digitalizar una fuente de vídeo analógica.

Actualización 2/8/2008:

Ya tengo el Ubuntu en el equipo de casa. La pantalla de entrada, con las fotos de cada uno ha sido tan sencillo como Sistema > Administración > Ventana de entrada > Local y seleccionar “Human List”

Para lo de los documentos, voy a seguir un consejo que me dieron en un foro: montar una partición NTFS y allí poner lo que se ha de compartir entre todos los usuarios. Eso mientras no encuentre una mejor solución.

» Leer más, comentarios, etc...

Picando Código

20 cosas que el departamento de IT aprende de los apagones

Julio 30th, 2008 - [Enlace local]

It's fixed. SysAdmins used strong magic

Traducido del original:
20 Things I Learned From Outages de Kludge Spot.
Publicado bajo licencia Creative Commons.

» Leer más, comentarios, etc...

PHP Senior

Actualizaciones a través de Twitter exclusivas de PHPSenior

Julio 30th, 2008 - [Enlace local]


Estaba usando mi twitter personal "enriqueplace" para hacer pequeñas actualizaciones que no necesariamente terminan en un post (microbloging), pero ahora creé un usuario específico "phpsenior" para solo notificar temas relacionados con PHPSenior, links a artículos interesantes, opiniones, si estoy leyendo o respondiendo los correos que me enviaron, opiniones en caliente cuando hay un debate por un post polémico ;-), etc.

En el lateral derecho aparecerá siempre las "últimas novedades" publicadas desde el twitter.

Quién quiera estar actualizado con lo último dentro de la temática de este blog, esta es la herramienta ;-)

Nota: si usas Firefox, con la extensión TwitterFox tendrás en tu navegador notificaciones al momento de cambios en el twitter.

» Leer más, comentarios, etc...

AlexdwBlog()

Campus - Party

Julio 30th, 2008 - [Enlace local]

Bueno desde este jueves estaré por valencia en la campus-party, así que si quereis encontarme allí estaré

» Leer más, comentarios, etc...

MonoCaffe

Una consola para controlarlas todas

Julio 30th, 2008 - [Enlace local]

Hoy he descubierto "pconsole" una aplicación muy útil a la hora de realizar labores repetitivas en distintos servidores.
Ejemplo, hay que realizar unas tareas X en una cantidad de servidores Y que son iguales (un cluster quizás).
En lugar de ir uno a uno, realizando X, ejecutamos unas cuantas xterm's y se las damos a pconsole.
Es muy sencillo de utilizar. En Ubuntu Hardy Heron, sólo hace falta ejecutar

sudo aptitude install pconsole


A continuación abrimos Y+1 cantidad de xterm's y en cada una ejecutamos:


tty


Lo cual nos devuelve (como todo en Linux) la ruta del fichero de la terminal. Por ejemplo /dev/pts/5


Lo siguiente será ejecutar "pconsole" en la xterm Y+1. Esto abrirá "pconsole" y nos mostrará una especia de CLI distinta. Aquí ejecutamos:

attach /dev/pts/5 /dev/pts/3 /dev/pts/4 ...


Ahora pasamos al "Modo de Envio" con Ctrl+D y todo lo que escribimos en "pconsole" se escribe en las consolas que estan adjuntas.




Existen otras aplicaciones como cssh que permiten abrir varias conexiones de SSH paralelas, pero lo encuentro un poco lento y no funciona muy bien (en mi caso) pero también es una herramienta a considerar si no podemos ejecutar pconsole.

» Leer más, comentarios, etc...

Arragonán

Mi nube de tags en Wordle

Julio 30th, 2008 - [Enlace local]

Gracias a un post de Mamen Pradel, descubro el curioso Wordle, del que ya había visto resultados pero no sabía de dónde venían (lo sé, debería haber preguntado :) ).

Aquí el que he hecho hace un rato:

Nube de tags de arragonán

Como curiosidad, está hecho con un applet java, y ha sido desarrollado por Jonathan Feinberg, empleado de IBM Research

» Leer más, comentarios, etc...

Cerebro en la Sombra

Regala lotería y personaliza tus participaciones y décimos

Julio 30th, 2008 - [Enlace local]

¿Regalas lotería de Navidad?
¿Cansado de no saber cómo ser original a la hora de enviar el número?

Coincidiendo con las semanas previas al Sorteo Extraordinario de Navidad del año pasado lanzamos TusDecimos.com, algo tarde pero a tiempo para que se enviasen varios miles de décimos personalizados.

Después de numerosas peticiones hoy mismo hemos cambiado el diseño del décimo por el de este año, con lo que ya puedes enviar tus participaciones a tus amigos y familiares. Ya se sabe que en vacaciones se suele comprar lotería y la gente está ansiosa por regalarla. Los décimos generados puedes descargarlos, enviarlos por email o incluso al móvil del destinatario, con lo que lo tendrá bien guardado y no lo perderá, además de resultar un modo muy original de enviar el número.

TusDecimos.com

La idea surgió ni más ni menos que porque todos los años teníamos el mismo problema que la mayoría al regalar lotería, ¿cómo hacerlo distinto?. Te tocaba escanear el décimo, retocarlo a mano modificando la cantidad que regalabas… Ahora todo es mucho más sencillo.

Detalles técnicos

Ya que esto es un blog de corte técnico (aunque también publique de vez en cuando temas personales :P ), explicaré como hicimos el generador de décimos automático.

Lo principal, obviamente, es comprar un décimo :P y escanearlo, mejor a 300ppp puesto que así lo tenemos a muy buena resolución. Después debes retocarlo un poco, ajustar bien los bordes y, sobre todo, eliminar las rayas cruzadas que aparecen en la zona de los números. Nosotros vamos recortando porciones del dibujo de fondo y pegándolas sobre los números hasta que todo el dibujo queda limpio. Hay que repetir el mismo paso en las zonas de la derecha de fracción, seríe y precio del décimo. Así tendremos un billete limpio para personalizar a nuestro gusto.

 Decimo de loteria de navidad personalizado

Ahora debes obtener, a través de tu programa de dibujo como Gimp, las coordenadas que vas a necesitar:

A la hora de generar los números valoramos distintos modos de hacerlo, pero el resultado nunca era del todo satisfactorio. Lo primero en lo que piensas es en utilizar las librerías GD para insertar el texto del número, pero si lo pruebas verás que el resultado es muy pobre además de muy complicado de ajustar al espacio que ocupan, principalmente porque no tienes la fuente original que utiliza el Organismo de Loterías y Apuestas del Estado.

Finalmente optamos por un modo algo más artesano. Se hicieron los 10 dígitos básicos a mano, de manera que se ajusta perfectamente el tamaño de cada dígito y puedes hacer unos números bastante parecidos a los originales.  La serie, fracción y cantidad que juegas se hacen con una fuente normal con la función imagettftext, simplemente escoge la que más te guste. Para centrar el texto en la zona donde va utiliza la función imagettfbbox, te devolverá el tamaño del texto al pintarlo en el décimo, simplemente desplaza la posición de inicio la mitad del espacio sobrante. Nuestro script es un poco más elabordado puesto que juega, además, con el tamaño de la fuente de manera que se ajuste siempre perfectamente al espacio disponible. En líneas generales seria algo como:

  1. $size=73;//tamaño de la fuente
  2. $fuente="tufuente.ttf"; //fuente para los numeros de serie y fraccion
  3. $serie="3"; //serie que vas a ponerle
  4. $anchoespacio=135; //tamaño maximo del cuadro imaginario del espacio para la serie
  5. $xinicio=1060; //posicion izquierda del cuadro imaginario de la serie
  6. $yinicio=235; //posicion superior del cuadro imaginario de la serie
  7. $bbox = imagettfbbox($size, 0, $fuente, $serie."ª");
  8. $tw = ($anchoespacio-($bbox[2] - $bbox[0]))/2;
  9. imagettftext($src_img, $size, 0, $xinicio+$tw, $yinicio, $tc, $fuente, $serie."ª");

Esto lo repetiríamos para serie, fracción y cantidad.

Para los dígitos del décimo, mucho más simple.

  1. $decimo="23456";
  2. $len=strlen($decimo);
  3. $numero=array();
  4. for($i=0; $i<$len; $i++)
  5.     $numero[]=$decimo[$i];
  6.  
  7. for($i=0; $i<count($numero); $i++){
  8.     $number = imagecreatefromgif ("numeros/".$numero[$i].".gif");
  9.     imagecopymerge($src_img, $number, 450+($i*110), 105, 0, 0, 110, 133, 100);
  10. }

Vamos copiando cada dígito sobre la posición del décimo donde iría. Sencillo. Ya tienes tu décimo personalizado. Si quieres puedes escalarlo o hacer lo que prefieras con él.

Con esto y teniendo cuidado de que los décimos te coincidan cada año en el mismo punto al escanearlos, tienes la aplicación resuelta para siempre.

Recuerda, si vas a regalar lotería, hazlo desde TusDecimos.com.

» Leer más, comentarios, etc...

HardBit

Tip para mostrar texto con tipografías tipo píxel en C#

Julio 30th, 2008 - [Enlace local]

Navegando por el blog de mi anterior empleador, me encontré con un post de una fuente que desarrollo un excompañero (Jaime Martínez) y que pueden descargarla desde aquí, el tip consiste en saber que múltiplos usar al darle el tamaño a nuestra fuente, el consejo pueden leerlo en este comentario.

Así que vamos al ejemplo en .Net y el código seria como se ve en la siguiente imagen

code_dos_b

Si leyeron el comentario del autor de la fuente, en el comentario se decía que cuando la resolución de la pantalla era de  72 dpi tomaríamos como base  8 píxeles, así que los múltiplos serian (8, 16, 24, 32, 64, …) ahora cuando la resolución sea de 96 tomamos como base 6 y los múltiplos serian (6, 12, 18, 24, ….).

Ahora vamos a ver como queda al pintar texto como lo muestra la siguiente imagen

dos_b

Como notamos mi pantalla muestra que mi resolución es de 96 dpi y por lo tanto tengo que usar tamaños múltiplos de 6 para que se muestre correctamente. En la imagen notamos que el primer texto tiene el antialias activado y el segundo no, si descargan la imagen o la amplían lo notaran mejor.

Bueno espero les haya sido de utilidad este consejo y gracias a Jaime por la fuente.

Cualquier duda o comentario a djnavi * gmail * com

» Leer más, comentarios, etc...

Nuevos Programadores

Ordenar una lista con expresiones Lambda (múltiples criterios) VB.Net

Julio 30th, 2008 - [Enlace local]

Este post se trata de como ordenar una lista de objetos de acuerdo a varios criterios utilizando una sola expresión lambda. El ejemplo está hecho utilizando el .net framework 3.5 (Visual Studio 2008).

Tenemos una lista de objetos con la siguiente estructura:

Public Class Elemento
    Public Sub New(ByVal mNum As Integer, ByVal mPrioridad As Prioridades, ByVal mValor As Integer)
        Numero = mNum
        Prioridad = mPrioridad
        Valor = mValor
    End Sub
 
    Public Enum Prioridades
        Alta = 0
        Media = 1
        Baja = 2
    End Enum
 
    Public Numero As Integer
    Public Prioridad As Priorities
    Public Valor As Integer
End Class

Para este ejemplo utilizaremos un objeto List(Of Elemento) que llenaremos con valores aleatorios y necesitaremos ordenarla de acuerdo a los siguientes criterios:

Supongamos que nuestra lista se completó con los siguientes elementos:

Num Prioridad Valor
4 Baja 16
1 Alta 26
3 Media 87
4 Media 10
2 Baja 3
5 Alta 4
4 Media 134
2 Baja 342

Nuestro resultado debe ser el siguiente:

Num Prioridad Valor
1 Alta 26
2 Baja 3
2 Baja 342
3 Media 87
4 Media 10
4 Media 134
4 Baja 16
5 Alta 4

Por lo tanto nuestra expresión lambda será la siguiente:

Public Sub LambdaSort(ByVal lista As List(Of Element))
        lista.Sort(Function(x, y) _
                x.Numero.CompareTo(y.Numero) Or _
                (x.Numero.Equals(y.Numero) And x.Prioridad.CompareTo(y.Prioridad)) Or _
                (x.Numero.Equals(y.Numero) And x.Prioridad.Equals(y.Prioridad) And x.Valor.CompareTo(y.Valor)))
End Sub

La expresión está hecha en una sola línea que fue separada para comodidad en la lectura, por lo que iremos viendo linea a linea, en la primera declaramos la expresión lambda que va a ordenar la lista:

lista.sort(Function(x,y)

luego vamos ennumerando nuestras condiciones:

x.Numero.CompareTo(y.Numero) Comparamos el valor de x.Numero con el de y.Numero, esta comparación nos devuelve el orden ascendente o sea x < y.
(x.Numero.Equals(y.Numero) And x.Prioridad.CompareTo(y.Prioridad)) Si x.Numero = y.Numero comparamos la Prioridad de ambos al igual que lo hicimos en el punto anterior con Numero.
(x.Numero.Equals(y.Numero) And x.Prioridad.Equals(y.Prioridad) And x.Valor.CompareTo(y.Valor)) Si x.Numero = y.Numero y también x.Priridad = y.Pririodad comparamos el Valor.

Separamos cada uno de los criterios de ordenación con OR para que se aplique uno u otro y listo.

Sin duda una forma simple y rápida de ordenar una lista.

» Leer más, comentarios, etc...

HardBit

Productividad 0

Julio 30th, 2008 - [Enlace local]

Normalmente no pongo entradas sobre asuntos personales ya que pocas veces o ninguna vez a la gente le interesa leer sobre si anda enfermo el perro del tipo que anda escribiendo en el blog, pero esta vez tiene algo que ver con el trabajo y tal como lo dice el titulo de esta entrada, estas semanas (aka meses) han sido bajas en cuanto a productividad laboral se refiere y es que haciendo un “recuento de los daños” he decidido hacer un análisis para obtener información sobre el por que he sido improductivo estos últimos meses y en la empresa actual en particular, pues esto no había pasado hasta ahora.

Bien empezamos poniendo las posibilidades que pueden generar este efecto.

No hay disposición y/o ganas para laborar.
El ambiente laboral no permite ejercer un buen trabajo.
La forma de laborar(metodologías, practicas, comunicación, etc…) del equipo de trabajo no es el adecuado.

Después de un rato de pensar y analizar el asunto, la conclusión es que no es una en especial sino el conjunto de algunas y que dan como resultado tal efecto, si tuviera que darle un porcentaje sobre que influye más seria de la siguiente manera.

Posibilidad 1: 70%
Posibilidad 2: 15%
Posibilidad 3: 15%

Como notaron lo que mas influye es que no hay disposición y/o ganas de trabajar, así de fácil , asumo la responsabilidad pero (siempre hay un pero) el motivo principal el por cual disminuye las ganas de trabajar y aumenta la frustración es que las posibilidades 2 y 3 generan gradualmente la posibilidad 1.

En resumen y para no hacerla mas enredada, es que en un ambiente laboral pobre y con pocas (casi nulas metodologias, practicas, reuniones, COMUNICACION, etc..) generan gradualmente menos satisfacción al trabajar y por lo tanto una frustración reflejada en improductividad.

Pero no todo termina ahí, y es que no solo es decir sí, tengo y/o tenemos la culpa, si no la cuestión es actuar, y para eso recordé algunos artículos de Joel Spolsk (para variar)  en particular el de “El test de Joel: 12 pasos hacia un mejor código” en el que al final del articulo menciona cuatro formas de usar el test de la siguiente manera.

  1. Evalúa a tu propia empresa y dime qué puntuación obtiene, así puedo cotillear un rato.
  2. Si eres responsable de un equipo de programación, utilízalo como una guía para asegurarte de que el equipo trabaja lo mejor posible. Cuando obtengas un 12 como puntuación, puedes dejar en paz a tus programadores y dedicarte a tiempo completo a que los comerciales dejen de molestarlos.
  3. Si estás intentando decidir si aceptar una oferta de trabajo como programador, pregunta a tu futuro jefe qué puntuación obtendría la empresa en el test. Si te parece una puntuación muy baja, asegúrate de que tendrás autoridad suficiente para solucionar lo necesario. En caso contrario, acabarás frustrándote y siendo poco productivo.
  4. Si eres un inversor que quiere evaluar a un equipo de programación, o si tu empresa está considerando la posibilidad de fusionarse con otra, este test puede servir para hacer una evaluación rápida.

Lo interesante de esto es el punto tres el cual la segunda parte dice lo siguiente “Si te parece una puntuación muy baja, asegúrate de que tendrás autoridad suficiente para solucionar lo necesario. En caso contrario, acabarás frustrándote y siendo poco productivo.” y no es que solo Joel lo diga, si no que en efecto lo ando viviendo en carne propia.

Bien como comentaba no solo es cuestión de tirar caña y excusarse, lo siguiente es intentar crear el entorno y para eso haré uso de un articulo mas (por qué no) de Joel que es “Logrando resultados cuando se es peón” y a continuación en listare las estrategias mencionadas en el artículo.

Estrategia 1 Simplemente, hazlo.

Estrategia 2 Explota el Poder del marketing Viral

Estrategia 3 Crea un Repertorio de Excelencia

Estrategia 4 Neutraliza a los tarados

Estrategia 5 Huye de las Interrupciones

Estrategia 6 Vuelvete Invaluable

Para mi las estrategias mas importante son la 1 y la 6, la primera es en la cual se crea un entorno donde uno pueda ser eficiente y productivo y la estrategia 6 es que una vez que uno sea eficiente y productivo estaré un paso adelante de la situación y será mucho mas fácil de ayudar al equipo o cambiar de empresa.

Y mientras sean peras o naranjas este post me ha servido al menos para desestresarme y si mañana les aviso que estoy despedido, ohh es que alguien de la oficina lee mi blog jajaja.

» Leer más, comentarios, etc...

Picando Código

Mini-Truco: Acceso directo a Máquina Virtual en VirtualBox

Julio 29th, 2008 - [Enlace local]

Mini truco para crear un acceso directo a la máquina virtual, en vez de iniciar VirtualBox y buscarla:

VBoxManage startvm <nombre de la maquina virtual>

Con ese sencillo comando, podemos iniciar directamente la máquina. Además, podemos agregar un acceso directo en el menú de aplicaciones o algún panel, para iniciar la máquina virtual ágilmente, y usar el icono que prefieran.

Acceso Directo a Windows

Acceso Directo a Windows

Viene muy a la mano sobretodo cuando usamos más de una máquina virtual para emular distintos sistemas operativos en distintas ocasiones.

En lo personal lo usé mucho “en producción” como se dice. Teniendo la computadora con Debian GNU/Linux, debía usar Windows XP para algunas programaciones en .Net. Por eso, tengo el acceso directo a la máquina virtual con Windows XP en el menú de desarrollo, ya que solamente la necesito cuando tengo que programar en .net.

Así también tengo algunas máquinas virtuales para probar otros sistemas operativos distintos, y una especial para distribuciones GNU/Linux y Live-CD’s.

» Leer más, comentarios, etc...

Picando Código

Curso de Python por el UYLUG

Julio 29th, 2008 - [Enlace local]

Comparto esta información con ustedes, a lo mejor les puede interesar. Un curso de 4 días de Python a cargo del UyLUG.

Curso de Python Organiza:  UyLUG

Temario:

SE EMITIRÁ CERTIFICADO
Docente: Roberto Allende

Fecha:
6/8/08 al 8/8/08
Grupo A: 9:00 a 13:00
Grupo B: 19:00 a 23:00

Lugar:
Salón Azul de Artech. 18 de Julio 1645 piso 4.

Sábado 9/8/08 (Hora y Lugar a Confirmar)
Jornada: Presentación sobre PyGame y Programación para OLPC XO

Interesados inscribirse al mail charlas@uylug.org.uy a la brevedad.
LUGARES LIMITADOS.

» Leer más, comentarios, etc...

Pwned's blog - Desarrollo de Tecnologia

Si odias a Windows Vista, Mojave es la respuesta

Julio 29th, 2008 - [Enlace local]

Vista ha tenido una gran cantidad de ataques por parte de.... bueno, un monton de gente. Desde los divertidos anuncios de Apple que retratan a Vista como una especie de corazón doofus, hasta los devotos de las plataformas competidoras y las personas que odian tanto a Microsoft.

Si eres una de esas personas que sienten que Vista en realidad es un caso perdido, checa el proyecto Microsoft Mojave.

Entradas relacionadas:


Pwned's Blog

» Leer más, comentarios, etc...

Infectogroovalistic

Consumiendo Yahoo! Weather desde PHP

Julio 29th, 2008 - [Enlace local]

Esta vez me tocó mostrar el clima actual de mi ciudad desde un sitio web.
Luego de mucho investigar, decidí usar el RSS de Yahoo! Weather para tal propósito.
Asi que manos a la obra...

Como pueden ver en la documentación, a la url del RSS hay que enviarle 2 parámetros:

p: Id de la localización de la cual se quiere obtener el clima. (Para el caso de Buenos Aires, ésta sería 'ARBA0009')

u: Unidad de temperatura a emplear (c = Celcius, f = Farenheit).

Entonces la url a consumir en mi caso sería:
http://weather.yahooapis.com/forecastrss?p=ARBA0009&u=c

Ahora bien, para leer el contenido del rss nos alcanza y sobra con:


$rss = file_get_contents ('http://weather.yahooapis.com/forecastrss?p=ARBA0009&u=c');


Con esa línea obtenemos un string con todo el contenido del RSS.
Ese string lo podemos consumir desde SimpleXML fácilmente de la siguiente manera:


$yWeather = simplexml_load_string($rss);


Y una vez que tenemos el objeto $yWeather cargado, procedemos a mostrar el estado del tiempo en el navegador de la siguiente manera:


echo $yWeather->channel->item->description;


Y eso es todo, el mismo RSS contiene en el campo 'description' un bloque CDATA con el código HTML del estado del tiempo, con imagen incluída y todo.
Entonces el programa entero que muestra las condiciones actuales del clima serían esas 3 líneas de código:


<?php
$rss = file_get_contents ('http://weather.yahooapis.com/forecastrss?p=ARBA0009&u=c');
$yWeather = simplexml_load_string($rss);
echo $yWeather->channel->item->description;
?>


Quien dijo que PHP es complicado?

En la proxima nota veremos cómo leer especificamente el código de estado del tiempo y otra información disponbible en el XML para poder mostrar un contenido personalizado para el clima actual.

» Leer más, comentarios, etc...

Yet Another Programming Weblog

Varios sobre D

Julio 29th, 2008 - [Enlace local]

Se acumulan cosillas sobre D que me he ido guardando, así que, haciendo un dump:


La misma entrada y más comentarios en Varios sobre D en barrapunto

» Leer más, comentarios, etc...