CODIGO.actionscript
Eventos click y doble click en un botón con Actionscript 3
Mayo 31st, 2007 - [Enlace local]
En este post explicaré cómo detectar un doble click sobre un botón en flash con actionscript 3 gracias a la clase MouseEvent que nos permite detectar directamente el evento dobleclick. El uso de la clase MouseEvent es muy simple, únicamente hemos de crear un listener que detecte el evento y ejecutar una acción. clip.doubleClickEnabled = true clip.addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick); function [...]
» Leer más, comentarios, etc...
Blog de Sergio �lvarez Fernández
FlashDevelop 3.0 beta
Mayo 31st, 2007 - [Enlace local]
Ya disponible FlashDevelop 3.0 beta.
Para usarlo es necesario tener instalado .Net Framework 2.0.
Saludos! ![]()
» Leer más, comentarios, etc...
Navegapolis
Scrum: reunión de planificación del sprint
Mayo 31st, 2007 - [Enlace local]
Descripción general
En esta reunión, tomando como base las prioridades y necesidades de negocio del cliente, se determinan cuáles y cómo van a ser las funcionalidades que se van a aportar al producto durante el próximo sprint.
En realidad esta reunión consiste en dos: En la primera, que puede tener una duración de una a cuatro horas, se decide qué elementos de la pila del producto (product backlog) se van a desarrollar.
» Leer más, comentarios, etc...
EsLoMas.com
Algunos experimentos básicos con Protégé y Jena
Mayo 31st, 2007 - [Enlace local]
Por fin estoy de vuelta. Hace casi mes y medio que no escribo nada en el blog, pero han sido por causas mayores, no es que me haya olvidado de él, asà que no ha pasado a formar parte de esos millones de blogs abandonados que hay por Internet. Voy a aprovechar esta vuelta a la rutina semanal de escritura para recopilar una serie de cosas que he ido utilizando en los últimos meses, en la elaboración de algunos experimentos dentro de mi proyecto de doctorado relacionado con la Web Semántica. Posiblemente a mucha gente le suene a chino, aunque la verdad es que hay gente que usa esta serie de cosas. Si no estás al corriente de esta serie de cosas y tienes algo de curiosidad, puedes echar un vistazo a la introducción a la web semántica que escribà hace unos meses, o a este otro post algo más teórico sobre técnicas y lenguajes para la representación del conocimiento.
Entrando ya en materia, en este post resumo una serie de cosas que he utilizado para la creación y el manejo de OntologÃas, mediante la utilización del entorno de desarrollo de ontologÃas Protégé y el marco de desarrollo para la Web Semántica Jena.
» Leer más, comentarios, etc...
Syntax Error
Instalar un servidor Linux casero: Ubuntu Festy 7.04
Mayo 31st, 2007 - [Enlace local]
Todo informático acaba en un momento u otro instalando su propio servidor casero, para centralizar sus fotos y música, descargar del emule, tener las impresoras siempre online, hasta para su propia web casera (o entorno de desarrollo web).
Hace unos meses hice una instalación usando un KUbuntu 6.06 desktop, y aprendiendo de los fallos (y aprovechando un ordenador algo más nuevo) volvà a montar un server, ésta vez un Ubuntu Festy 7.04 server.
Éste artÃculo es un log de lo hecho hasta tener un servidor usable, una base dónde empezar a montar cosas, que serán justamente motivo de futuros artÃculos en Syntax Error.
El ordenador propiamente es un Pentium III 933 con 512 MB de RAM, un par de discos duros PATA IDE (uno de 40 GB y otro de 80 GB) y un disco duro externo USB 2.0 de 200 GB con su placa PCI USB 2.0 (los que venÃan con el ordenador eran USB 1.1
El Sistema Operativo a instalar es un Ubuntu Festy 7.04 versión server (no la desktop), que facilita mucho el trabajo. En el momento de la instalación habÃa una red interna con un router que me daba DHCP (no es necesario) e internet.
Dicho ésto, ahà va el “log” de la instalación:
Fase 1 - Autoarranque - F2 Language > Español - “Instalar en el disco duro” > Carga el sistema de arranque - Nombre de la máquina: server - Particionado: Manual (se detectan HD USB!!) 40GB:[20GB sys / 1 GB swap / 10 GB server (punto montaje “/server”)] / 80GB:[Todo es punto de montaje “/home”] - Zona horaria: PenÃnsula - Está el Reloj en UTC? No - Nombre Completo usuario (no superusuario): José Pérez - Nombre user: pepe - Contraseña: pepito - repetir contraseña > Instala el sistema base - Selección de Programas - Preset: LAMP Server > Instala > Grub > Reset Primer inicio > Checked errors. Reset. > Login. !! $ ifconfig //que configuración tiene de red > 192.168.1.100 ????????????????? $ ping 192.168.1.1 > ok !!! $ ping www.google.es > OK!!!! $ less /etc/network/interfaces //como está setada la red > DHCP… ah, ok. Setado de red $ sudo su //pasar a root $ passwd //setar password $ vim /etc/network/interfaces //editar configuración de red > iface eth0 inet static > address 192.168.1.100 > netmask 255.255.255.0 > network 192.168.1.0 > broadcast 192.168.1.255 > gateway 192.168.1.1 $ vim /etc/resolv.conf //editar servidores DNSs > nameserver xx.xx.xx.xx //ip del servidor DNS a conectarse para resolver nombres $ /etc/init.d/networking restart //Resetear red Actualización del sistema $ less /etc/apt/sources.list //Verificar repositorios activos [$ vim /etc/apt/sources.list //Verificar repositorios activos > Descomentar repositorios > Si no se quiere instalar desde el CD, comentar el repositorio “cdrom”] $ apt-get update //actualizar repositorios $ apt-get upgrade //actualizar el sistema Montar disco duro externo USB $ mkdir /mnt/datos //creamos el directorio de montaje $ vol_id /dev/sda1 //extrae la info del volumen sda1. Sustituir sda1 por la unidad en cuestión > Nos apuntamos el UUID $ vim /etc/fstab > Al final de todo escribimos: UUID=xxxxx /mnt/datos vfat //xxxxx es el UUID que nos hemos apuntado; vfat es el tipo de partición del disco a montar $ mount -a //recargamos el fstab Instalar Server ssh $ apt-get install openssh-server //instalar el server $ vim /etc/ssh/sshd_config //editar configuración > Protocol 2 … > PermitRootLogin no … > AllowUsers jane john > ssh probado y funcionando
Más adelante vendrá el log del servidor WEB con soporte PHP y MySQL y su FTP
Saludos!
» Leer más, comentarios, etc...
PHPBSD.net
El futuro de BugZilla
Mayo 31st, 2007 - [Enlace local]
Bugzilla es un sistema de seguimiento y notificación de errores desarrollado en Perl ampliamente conocido e increÃblemente potente. Aunque nació para gestionar el desarrollo de Mozilla es aplicable a prácticamente cualquier proyecto de desarrollo de software (incluso a otros tipos de proyecto).
Pocos dÃas antes del lanzamiento de su última versión (la 3.0) iniciaron una discusión en la wiki acerca de los posibles lenguajes a los que podrÃa migrar el código del bugzilla:
Es una interesante comparación entre distintos lenguajes de programación usables para construir aplicaciones web. Las consideraciones previas que exponen son válidas para muchos desarrollos:
- Fácil desarrollo
- Fácil modificación y mantenimiento
- Buen rendimiento
- LibrerÃas de funciones disponibles
- Internacionalización
- Seguridad
- Que obligue a codificar “bien”
Esperemos que se decidan por el PHP… aunque con Ruby y Python en juego, nosé, nosé :)
Etiquetas en Technorati: bugs, bugzilla, notas, php, programación, webmasterbugs, bugzilla, notas, php, programación, webmaster
» Leer más, comentarios, etc...
avemundi
srr - sistema rapido de recuperación
Mayo 31st, 2007 - [Enlace local]
La semana pasada mi portatil me jugó una mala pasada. La FAT del disco duro de la partición de Windows quedó hacha trizas y no hubo manera de recuperarla con la consola de recuperación ni con nada. Tuve que reinstalar...
» Leer más, comentarios, etc...
Ideas + IngenierÃa del Software
Google Gears: Unplugged Web 2.0
Mayo 31st, 2007 - [Enlace local]
Hace unos dÃas escribÃa sobre aplicaciones web offline sin saber que Google sacaba ya su solución: Google Gears. Los estándares son buenos, pero ¿quién quiere esperar a un estándar cuando tus ingenieros son los mejores?
Lo acabo de instalar. Al entrar en Google Reader, la primera aplicación que lo soporta, aparece el siguiente mensaje:
Lo quedo en modo offline y el monitor de red ni se inmuta a partir de entonces: puedo leer noticias "desenchufado".¿Y si ahora me quedo sin conexión? /etc/init.d/net.eth0 stop... Ok. Puedo seguir viendo noticias, están en mi caché local. En la ayuda de Google Reader indican que deberÃa poder cerrar la ventana y volver, sin conexión, y deberÃa funcionar. Lo pruebo y efectivamente funciona (parece que hay un pequeño problema y el contenido no se carga hasta que pulso algún enlace en la página, pero bueno, es una beta sobre otra ;) ).
Nada que no pudiese hacer antes con alguno de los miles de lectores RSS que ya hay, pero no es lo mismo. Las aplicaciones de sincronización han muerto. En breve todas las aplicaciones serán Web y nuestros datos estarán en un único sitio, cacheados en varios.
Google lo ha vuelto a hacer, justo a tiempo para competir con
Corrección: Silverlight no incorpora nada para trabajo offline.
» Leer más, comentarios, etc...
Joan Garnet
Entorno de prueba para desarrolladores web
Mayo 31st, 2007 - [Enlace local]
Marc Palau ha escrito un completo artÃculo en el que muestra como preparar un entorno de prueba para desarrollo web. Esto incluye todos los navegadores en los que testear. Muy útil para desarrollos en los que tiremos de mucho JavaScript o CSS.
Ir a: Entorno de prueba para desarrolladores web (Windows)
» Leer más, comentarios, etc...
Pensamientos ágiles
Google presentará hoy Gears su apuesta para el desarrollo offline de aplicaciones Web
Mayo 31st, 2007 - [Enlace local]
Quedan 3 horas para que comienze en Londres el Google Developers Day, una reunión global de todos los desarrolladores de Google. Independientemente de la amplia agenda de sesiones, el principal anunció del dÃa parece que será Google Gears.
Google Gears es un plugin open source para navegadores web que ofrece un API Javascript para el desarrollo de aplicaciones que se pueden ejecutar tanto offline como online e independientemente del navegador. Parece ser que Gears ofrece, en sus 700K de tamaño, tres APIs: 1. para manejar objetos, 2. una base de datos relacional para almacenar los objetos y realizar búsquedas, y 3. un API para la sincronización de datos mediante Javascript.
Después de que Adobe haya apostado fuerte por Apollo este movimiento de Google parece encaminado definitivamente a popularizar este tipo de aplicaciones web "persistentes". ¿Estamos pues ante el futuro de la programación web?
Más sobre esto en la noticia en Techcrunch.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Requirements Networking Group
Mayo 31st, 2007 - [Enlace local]
Volviendo a mis órigenes uno de los temas que mas me sienta es el de requerimientos y en esta ocasión les presento un nuevo sitio que acabo de descubrir, la verdad es que no se como llegue a el lo mas seguro es que a través de bloglines, en fin, su nombre es Requirements networking group en el cual te puedes inscribir de manera gratuita y puedes encontrar mucha información acerca del tema de requerimientos, encontrarás autores de artÃculos de la talla de Karl Wiegers, muy recomendable.» Leer más, comentarios, etc...
MadeInFlex
Caso de estudio: Flex store simplificado version Cairngorm
Mayo 30th, 2007 - [Enlace local]
Con la idea de preparar varias aproximaciones a la solución de un mismo problema he pasado la aplicación Flex Store simplificada desarrollada por Joan Garnet tanto a cairngorm como a guasax.
En la primera versión que desarrolló Joan mostraba en el ejemplo una serie de buenas practicas en cuanto a la organización de código y separación de conceptos dentro de una aplicación Flex simulando una Flex Store simplificada.
En este ejemplo vemos esa misma aplicación pasada, con los mÃnimos cambios posibles, a Cairngorm.
» Leer más, comentarios, etc...
MadeInFlex
Cursos de Flex en Sevilla y Madrid
Mayo 30th, 2007 - [Enlace local]
Debido a la gran acogida del Curso de Flex Profesional Nivel I en Sevilla, volvemos a proponer, junto con Método Profesional nuevos cursos de Flex, ahora también en Madrid
» Leer más, comentarios, etc...
Pensamientos ágiles
Como hacerse rico con un mini-juego de flash
Mayo 30th, 2007 - [Enlace local]
El otro dÃa comentaba como hacerse rico con una infraestructura sencilla. Hoy no me puedo resistir a comentar como hacerse rico con una arquitectura incluso mucho más sencilla.
Tan simple como: 1. coger una idea que funciona en alguna otra parte (por ejemplo WOW), 2. crear un mini juego en Flash, y 3. ver como ingresas 8.000 dólares al mes con el jueguecito. 
No es exactamente rico, pero da para unos caprichos.
Fuentes:
How to get rich programming.
3 tips to profit from casual games.
» Leer más, comentarios, etc...
PHPBSD.net
Herramientas gráficas online
Mayo 30th, 2007 - [Enlace local]
Hace unos dÃas descubrÃa My Cool Button gracias a Digital Inspiration y me hizo recordar algunas herramientas relacionadas que de vez en cuando he usado. Si eres programador PHP y no muy diseñador te irán de perlas:
- Generador de botones 80×15. En el mismo graphicsguru.com se ofrecen varias herramientas útiles.
- Generador de Favicon con texto. Para generar favicions sin imágenes, sólo texto y combinaciones de colores.
- Generador de bordes redondeados y gradientes. Pues eso, para generar cajas con bordes redondeados y gradientes. Lo interesante es que ya te ofrece el código HTML y las imágenes necesarias recortadas.
- Generador de Textos. Estás cansado del clásico LoremIpsum. Pues aquà tienes un generador de textos aleatorios pero con algo de “sentido”.
- Generador de email. Para evitar el spam un generador de imágenes con tu dirección de correo.
- Generador de paletas de colores. A partir de una foto te genera una paleta de colores.
- …y como no el clásico CoolText. de la época web 1.0 :) pero todavÃa muy útil.
Googleando encuentras cientos de webs con herramientas similares, lo anterior sólo es una selección de las que me he ido guardando en mi delicious… ¿conoces más q consideras “imprescindibles”?
Etiquetas en Technorati: diseño, herramientas, imágenes, notas, webmasterdiseño, herramientas, imágenes, notas, webmaster
» Leer más, comentarios, etc...
Joan Garnet
FlashDevelop 3.0.0 Alpha
Mayo 30th, 2007 - [Enlace local]
Ha salido una nueva versión de FlashDevelop. Ahora con soporte para AS2, AS3 y haXe.
Si no trabajas con Flex Builder, ésta es una alternativa muy recomendable al editor de Flash.
En el post del anuncio hay más información.
» Leer más, comentarios, etc...
Pensamientos ágiles
Recovery-Oriented computing
Mayo 30th, 2007 - [Enlace local]
Recovery-Oriented Computing (ROC) es (más bien era) un proyecto de investigación para la creación de servicios altamente fiables en internet. ROC se centra en la recuperación ante fallos, de hecho asume que no importa lo sólido o robusto que sea el software o el sistema analizado, ya que siempre existirá la posibilidad de fallo (humano, hardware, software).
Sus tres leyes básicas son:
- Las tasas de fallo de software y hardware son significantes y siempre aumentan.
- Los fallos no se pueden nunca predecir por completo de antemano.
- El herror humano, especialmente durante mantenimiento, es una de las mayores fuentes de errores.
Fuentes:
The Berkeley/Stanford Recovery-Oriented Computing (ROC) Project.
Wikipedia.
» Leer más, comentarios, etc...
Variable not found, 0:1
Internet Explorer Developer Toolbar
Mayo 30th, 2007 - [Enlace local]
Hace un par de semanas Microsoft publicó la versión definitiva del complemento Internet Explorer Developer Toolbar, un plugin para IE indispensable para todos los que jugamos con XHTML y CSS y nos volvemos locos cada dÃa intentando que los elementos aparezcan donde deben.
Las principales caracterÃsticas de esta herramienta son:
- Permite identificar zonas de la página paseando por encima con el ratón, permitiéndonos visualizar en todo momento de qué elemento se trata, sus atributos y las reglas de estilo CSS aplicadas a cada uno. Los elementos también pueden seleccionarse desde la estructura (DOM) de la página.
- Activación o desactivación directa de caracterÃsticas como estilos o scripts.
- Asimismo, se pueden ver de forma rápida los atajos de teclado o el orden de tabulación, importante para cumplir las normas de accesibilidad.
- Es posible indicarle que "bordee" elementos concretos, como divs, tablas, elementos posicionados u otros.
- Permite mostrar u ocultar imágenes o propiedades de éstas como el archivo de origen (src), el tamaño o el peso.
- Permite validar HTML, CSS, WAI y feeds RSS de forma directa.
- Dispone de reglas para medir zonas de la página a nuestro antojo.
- Formatea y colorea el código fuente de las páginas para facilitar su lectura.
- Nos permite eliminar la caché del navegador, asà como visualizar o eliminar las cookies asociadas a la página consultada, o incluso deshabilitar su uso.
La siguiente captura de pantalla muestra la herramienta en funcionamiento sobre Internet Explorer 6:
Funciona con IE6 e IE7. En el primero se activa pulsando el icono con una flechilla que aparece en la barra de herramientas; en el segundo también, pero ojo, este icono no está visible por defecto. De momento está disponible sólo en inglés, y se puede descargar en esta dirección.
Ah, aunque supongo que ya lo conoceréis a estas alturas, el equivalente para Mozilla Firefox es la extensión Firebug, toda una maravilla, también indispensable para cualquier desarrollador web.
» Leer más, comentarios, etc...
Ideas + IngenierÃa del Software
Entierra con el hacha las pantallas de edición
Mayo 29th, 2007 - [Enlace local]
Cuando conocà Flickr, me gustó. Pero cuando me convertà en usuario me enamoró por lo terriblemente bien hecho que está el interfaz, muy especialmente un detalle: si algo en la pantalla es editable por mÃ, lo puedo editar directamente. Por ejemplo, si doy de alta una foto, cuando estoy en su pantalla de detalle, si pulso en el tÃtulo, el texto se convierte -elegantemente- en un campo de entrada, y puedo editar el valor, que se almacena vÃa Ajax (como el componente inline de Dojo).
Esa comodidad viene de romper con un hábito habitual: separar las pantallas de ver y de editar. ¿Para qué? Yo, usuario de la aplicación, no quiero tener que pasar a "modo edición" cada vez que quiera cambiar un dato. Si estoy viendo algo que puedo editar, debo poderlo editar, sin indicarle a la aplicación "¡oye, que voy a editar!". El componente de edición inline a mà me encanta pero para muchos usuarios puede ser confuso, por lo que, en una aplicación web, este principio se traduce a que si un dato no es editable debe aparecer como texto (¡no en un campo deshabilitado!), y si es editable, en un campo.
Esto en muchos entornos se traduce en jsps llenas de ifs, o, con suerte, de c:ifs, lo cual ni es productivo, ni mantenible, ni legible. Sin embargo, si puedes utilizar JSF y Tomahawk, no debes dejar pasar el atributo displayValueOnly de (casi) todos los campos de entrada. Permite, mediante una expresión JSF, decidir si algo se muestra como texto o como campo. Mejor, imposible. Y, para gestionar también el permiso de visibilidad sobre una propiedad, tienes el rendered. Con estos dos atributos manejas los tres permisos elementales (visibilidad, lectura y escritura) de la forma mÃnima.
Se acabó tener que programar varias pantallas en función de permisos y modos. Con una única pantalla podemos mostrar sólo lo que un usuario pueda ver (¡a nivel de propiedad!) y editar sólo lo que pueda editar.
» Leer más, comentarios, etc...
programania
Mono y Team Foundation ya no están separados
Mayo 29th, 2007 - [Enlace local]
El Visual Studio ya no goza de exclusividad sobre el Team Foundation de Microsoft. Desce hace unos meses, se ha emprendido una iniciativa para implementar herramientas cliente que permitan que otras alternativas al Visual Studio para hacer uso del Team Foundation, llamada tf4Mono. Pero esta opción tiene sus pros y sus contras. El proyecto se [...]
» Leer más, comentarios, etc...
Pensamientos ágiles
Meebo, cuando el cliente grande acecha
Mayo 29th, 2007 - [Enlace local]
Me ha parecido bastante interesante el análisis que hacen en Businessweek de la situación actual de Meebo.
Si algo me ha enseñado mi trabajo actual es que no hay nada peor que tener a un "mega-cliente" en el cogote, presionando constantemente para obtener resultados para ayer, y tirando del proyecto a golpe de talonario y más personal. Parece que algo parecido le está pasando a Meebo. Todo el capital de riesgo que ha recibido hace que los inversores comiencen a pedir resultados. Y cuando estás sufriendo para construir un producto estable, llega un super cliente y empieza a exigir resultados. ¿No os suena?:
"Can we wait for two weeks after the launch?" asks Jen, 26. "They're dying for it now, now, now," Sternberg responds. "I want it to be really solid," Jen says, her leg bouncing against the black vinyl of her chair. Sternberg thinks for a moment and comes up with a compromise: "I'll tell them we're shooting for a week, maybe two--that we want a quality product."
¿Puede pasar Meebo de ser un producto para geeks a convertirse en otra historia de éxito de la web 2.0? ¿Es el factor diferencial las jornadas de trabajo de 14 y 16 horas?
En resumen, capital de riesgo, presión, dificultad para encontrar el personal adecuado, y muchas horas trabajando. Muy interesante lectura.
» Leer más, comentarios, etc...
MonoCaffe
Mejorando el aspecto de Firefox en Ubuntu
Mayo 29th, 2007 - [Enlace local]
Gracias a que Firefox permite la modificación de sus gráficos a través de sencillas hojas de estilo CSS que podemos encontrar -en el caso de Ubuntu- en /usr/lib/firefox/res/ se pueden hacer cosas extraordinarias como las que ha hecho fatsheep y que ha publicado en los foros de Ubuntu
Desde allà podeis descargar un pequeño script que instalará una hoja de estilo para mejorar la apariencia de los formularios. Podeis descargarlos desde el foro (previo registro) o desde aquÃ:
firefox-widgets-1.1.tar.bz2
Las mejoras son increibles, podeis contemplarlo en ésta imagen:
El único inconveniente de éste script, es que al actualizar Firefox se perderán estos cambios y habrá que repetirlos.
» Leer más, comentarios, etc...
Pensamientos ágiles
Java en tiempo real
Mayo 29th, 2007 - [Enlace local]
Java Real-Time System 2.0 fue presentado por Sun Microsystems en la pasada JavaOne. Durante la última semana han aparecido unos cuantos enlaces sobre este sistema donde se explica a qué escenarios y sectores está orientado.
- The case for Real-Time in the Enterprise : Entrevista a Greg Bollella y Dave Hofert, distinguished engineer y manager de Sun Real-Time Java Marketing respectivamente, en la Java One.
- Real-Time Garbage Collection : Una nueva entrevista a Bollella y Hofert, sobre como funciona la recolección de basura en estos sistemas.
- El podcast de Javaposse donde la segunda parte está también dedicada a Java Real-Time System 2.0 y donde también participan Bollella y Hofert.
Los tres enlaces anteriores son podcasts.
Por otra parte BEA Systems no se queda atrás y anuncia WebLogic Event Server una versión ligera de su servidor de aplicaciones, y WebLogic Real Time 2.0, que aseguran ofrece pausas de tan sólo 10 milisegundos.
En este artÃculo de BEA es donde se pueden leer las notas más interesantes. Como que según ellos, Java RTS pone realmente en apuros a las aplicaciones nativas escritas en C/C++ en cuanto a escalabilidad y rendimiento, o como uno de sus clientes dentro de los servicios financieros perdÃa 200.000 dólares al dÃa hasta que comenzó a utilizar WebLogic RTS. Según promocionan en WebLogic, WebLogic Event Server es capaz de soportar la evaluación de 10.000 reglas y la ejecución de 50.000 transacciones complejas por segundo (no hay datos sobre el hardware utilizado para el test).
» Leer más, comentarios, etc...
Yet Another Programming Weblog
Visualizando redes sociales: amigos en Barrapunto y menéame
Mayo 29th, 2007 - [Enlace local]
He hecho dos programitas que sacan las relaciones de amistad en en el interior de dos comunidades virtuales, barrapunto y menéame. Después he sacado imágenes gráficas de dichas relaciones, para visualizar, en lo posible, la compleja estructura de esas "relaciones sociales". Aunque el análisis de los datos no es muy riguroso, el resultado puede interesar tanto a los que les gusta el análisis de redes sociales online como a los que les gusta la ver programitas de ejemplo. En este caso están hechos en Erlang, y están acompañados de algún enlace que he ido recopilando en el camino.
Me gusta mucho ver gráficos relacionados con las ciencias que tratan de estudiar la complejidad, como los de visual complexity, no porque sepa mucho de ello, sino como mero aficionado. El caso es que llamó mucho la atención también la representación visual de la red social de feevy (comentado por gente que sabe de esto, de entre los cuales me excluyo, en Un mar de flores).
Pues bien, el otro dÃa se me ocurrió que se podrÃa hacer lo mismo con los usuarios de barrapunto, que en el fondo no deja de ser una red con unas relaciones muy bien definidas: la relación de amistad y enemistad. Y también se me ocurrió que lo podrÃa hacer con un programita que capturara esas relaciones y las dejara en formato DOT. Para ello he usado Erlang. ¿Por qué? Pues porque si. Se podÃa haber hecho con wget o curl y awk, y/o perl o ... Pero bueno, me apetecÃa hacer algo más que un Hola mundo! en este lenguaje. Y, a decir verdad, me lo he pasado muy bien programando en él y descubriéndolo.
Comentaba Alex que para visualizar la redes sociales solÃan usar SocNetV, pero que en este caso usó Graphviz Ambos admiten para modelar las redes el lenguaje de definición DOT. Son los programas que yo he usado para los gráficos que viene a continuación.
Primero la imagen tal cual, sin ordenar demasiado, con socnetv:

Intentando desenredar la red, estos programas tienen criterios para representar la información en función de una serie de parámetros que suelen calcularse en función del las distintas definiciones de centralidad...
Pegaré aquà las imágenes que creo que van a dar una información más interesante. Esta siguiente está generada con el socnetv, aplicando una de las ordenaciones en circulo por centralidad (en este caso, creo, "in degree centrality"):

Usando el comando nop bp.file | twopi -Tpng -o bptwopi.png, de graphviz:

La imagen que más me gusta es esta, que da alguna información de la organización, pero acercándose uno puede ver detalles (usando nop bp.file | fdp -Tpng -o bpfdp.png)... Lo malo es que subiéndola a flickr se baja tanto la resolución como la calidad. Se admiten sugerencias para subir las imágenes a un sitio donde las dejen poner a mucha resolución...Actualización: Gracias a resete-e y su cuenta de flickr pro hay imágenes de alta resolución. Muchas gracias ;)

Mientras iba haciendo el primer programa, se me ocurrió que casi por el mismo precio podrÃa tener un segundo programa que obtuviese los datos de menéame. Solo apuntar que en este caso la red está aún más enmarañada porque hay más actores y más relaciones...
Las imágenes análogas a las anteriores serÃan:
(Nota: La última imagen parece en negro, pero si se pincha sobre ella sale a resolución completa...)


Segunda actualización: No tenÃa donde poner los ficheros de datos, pero Eduardo de http://hombrelobo.com/ me cedió amablemente espacio, asà que todos los interesados en los datos en bruto pueden jugar con ellos y con graphviz, SocNetV y con lo que quieran. Traté de embeber los svg en HTML, pero creo que no merece la pena porque son muy grandes y firefox (al menos) se queda un poco tonto. Mejor bajárselos y verlos con algún visor... Bueno, los enlaces:
- El fichero de datos de las "amistades" en barrapunto, en formato dot
- El fichero de datos de las "amistades" en menéame, en formato dot
- Las "amistades" en barrapunto, en formato svg
- Las "amistades" en menéame, en formato svg
Se ve que hay islitas, cosa que me ha sorprendido, por aquello de los seis grados de separación, pero también lo comentaba Ugarte en su entrada. Pensándolo un poco más detenidamente, tanto en este caso como en el de los enlaces feevy son casi todas relaciones fuertes en el sentido en el que se comenta en un mar de flores. No todas las relaciones débiles entre usuarios (yo leo poco a tal, yo conozco a cual, pero no le sigo) no salen en este esquema, es seguro que en ese caso todos estarÃan conectados... No obstante, en el caso de las gráficas de las dos comunidades, las islas son menores que en feevy, la red está más clusterizada... (este razonamiento hay que tomarlo con precaución: yo soy sólo un aficionado ;))
Se me pasó por la cabeza un proyecto más ambicioso en en que se definiesen parámetros de búsqueda (expresiones regulares y alguna otra cosa...) pero me resultó demasiado grande para el poco uso que le iba a dar. Si alguien tiene ganas, se puede modificar muy fácilmente para sacar la red de slashdot (casi trivial) o de digg... ¿twitter? (por cierto, que alguien sacó el gráfico de los usuarios holandeses de twitter, también vÃa de Ugarte)
En otro orden de cosas... lo he programado en Erlang y ha sido una gratÃsima experiencia. Hay quien dice que la iteración es humana, la recursión es divina, pero Erlang con su tail recursion (recusión terminal) te la facilita o más bien te la hace obligatoria para recorrer los conjuntos de datos. Pero tanto el uso de esa recursión, el manejo de listas y tuplas como la sintaxis me ha resultado muy muy natural. El hecho de que cada "sentencia" sea separada por comas, el final un punto, las flechas... todo muy intuitivo, un poco como escribir un texto, salvando las distancias ;)
Otro punto fuerte de el lenguaje es el tratamiento de la concurrencia, que es muy sencillo teniendo en cuenta una serie de premisas que ya comentó Joe Armstrong en su entrevista en Thinking parallel. Erlang no usa threads nativos sino que tiene sus propios "procesos ligeros" con lo que logra una gran escalabilidad en cuanto a número de procesos disponibles.
En este ejemplo no se observa muy bien, porque no creo que el programa lo requiriese, pero el lector atento del código podrÃa añadirle una cierta concurrencia para hacer peticiones en paralelo, pero en este caso no es muy útil...
Aquà voy a pegar el código que he usado tal cual, con la advertencia que no es un código muy probado y tal y cual, etc, etc :)
(por cierto y a modo de recordatorio, el comando que he usado para generar el código HTML con resaltado de sintaxis es enscript --highlight=erlang --color --language=html --output=soc_graph.html soc_graph.erl)
Blogger se comió los tabuladores, los he sustituido por espacios...
El programa de barrapunto:
-module(soc_graph).
-export([do_it/0]).
-export([get_friends/1]).
-export([get_users/1]).
do_it() ->
init_file(),
get_users({self(),1}),
end_file().
%get_users gets user list
get_users({Pid,Step}) -> get_users(0,{Pid,Step}).
get_users(Pan,{Pid,Step}) ->
URL=io_lib:format("http://barrapunto.com/search.pl?threshold=-1&op=users&sort=1i&start=~.10B",[Pan]),
{ ok, {Status, Headers, Body }} = http:request(URL),
{match, Matches}=regexp:matches(Body,"barrapunto.com/~.*/journal"),
Lst_new = [string:substr(Body,Start+16 ,Length-16-8 ) || {Start,Length} <- Matches],
case Lst_new of
[] -> get_users_done;
%_ -> spawn(soc_graph,get_friends,[{Pid,Lst_new}]),
_ -> get_friends({Pid,Lst_new}),
get_users(Step+Pan,{Pid,Step})
end.
%get_friends gets user id and get friend list
%Pid is unused (refactoring?)
get_friends({Pid,[H|T]}) ->
URL=io_lib:format("http://barrapunto.com/~~~s/friends",[H]),
io:format("~s~n",[H]),
{ ok, {Status, Headers, Body }} = http:request(URL),
Reg_exp="barrapunto.com/~.*/friends",
{match, Matches}=regexp:matches(Body,"barrapunto.com/~.*/friends"),
Frnd_new = [string:substr(Body,Start+16 ,Length-16-8 ) || {Start,Length} <- Matches],
New_user=replace_forb_chars(H),
Frnd_flt=lists:filter(noself(New_user),Frnd_new),
to_file([{H,Frnd_flt}]),
get_friends({Pid,T});
get_friends({Pid,[]}) -> ok_friends.
noself(H) ->
fun(S) ->
case regexp:match(S,H) of
{match,_,_} -> false;
nomatch -> true;
{error,_} -> true
end
end.
%replace_forb_char replaces special (regexp) characters in user name
replace_forb_chars(S) ->
replace_forb_chars(S,".$()*+").
replace_forb_chars(S,[RH|RT]) ->
Regexp="["++[RH]++"]",
{ok,Newstr,_}=regexp:gsub(S,Regexp,Regexp),
replace_forb_chars(Newstr,RT);
replace_forb_chars(S,[]) ->
S.
%to_file writes friends into DOT file
to_file(Frnd) ->
%this line violates DRY (Refactor?)
{ok,F}=file:open("bp.file",[write]),
to_file(F,Frnd).
to_file(F,[{User,Frnds}|T]) ->
%TODO: Format of map/frineds
Out_Frnd= fun(Frnd)-> io:format(F,"\"~s\" -> \"~s\"~n",[User,Frnd]) end,
lists:map(Out_Frnd,Frnds),
to_file(F,T);
to_file(F,[]) ->
file:close(F),
ok_to_file.
%init_file initializes the DOT file
init_file() ->
%this line violates DRY (Refactor?)
{ok,F}=file:open("mnm.file",[write]),
io:format(F,"digraph mydot {~nnode [color=red, shape=ellipse];~n",[]),
file:close(F).
%end_file inserts the coda in the DOT file
end_file() ->
%this line violates DRY (Refactor?)
{ok,F}=file:open("mnm.file",[append]),
io:format(F,"[weight=1, color=black];~n}~n",[]),
file:close(F).
La modificación para menéame:
-module(soc_graph).
-export([do_it/0]).
-export([get_friends/1]).
-export([get_users/1]).
do_it() ->
init_file(),
get_users({self(),1}),
end_file().
%get_users gets user list
get_users({Pid,Step}) -> get_users(1,{Pid,Step}).
get_users(Pan,{Pid,Step}) ->
URL=io_lib:format("http://meneame.net/topusers.php?sortby=0&page=~.10B",[Pan]),
{ ok, {Status, Headers, Body }} = http:request(URL),
{match, Matches}=regexp:matches(Body,"/user/[^\"]*"),
Lst_new = [string:substr(Body,Start+6 ,Length-6) || {Start,Length} <- Matches],
case Lst_new of
[] -> get_users_done;
%_ -> spawn(soc_graph,get_friends,[{Pid,Lst_new}]),
_ -> get_friends({Pid,Lst_new}),
timer:sleep(1000),
get_users(Step+Pan,{Pid,Step})
end.
%get_friends gets user id and get friend list
%Pid is unused (refactoring?)
get_friends({Pid,[H|T]}) ->
URL=io_lib:format("http://meneame.net/user/~s/friends",[H]),
io:format("~s~n",[H]),
Reg_exp="friends_of=[^\"]*",
{ ok, {Status, Headers, Body }} = http:request(URL),
{match, Start, Length}=regexp:match(Body,Reg_exp),
User_Id = string:substr(Body,Start+11 ,Length-11 ),
Frnd_new=get_friends_page(1,User_Id,[]),
New_user=replace_forb_chars(H),
Frnd_flt=lists:filter(noself(New_user),Frnd_new),
to_file([{H,Frnd_flt}]),
get_friends({Pid,T});
get_friends({Pid,[]}) -> ok_friends.
%get_friends_page gets friend list
%Pid is unused (refactoring?)
get_friends_page(Page,User_Id,Frnd) ->
Reg_exp2="/user/[^\"]*",
URL2=io_lib:format("http://meneame.net/backend/get_friends_bars.php?id=~s&p=~.10B&type=from",[User_Id,Page]),
{ ok, {Status2, Headers2, Body2 }} = http:request(URL2),
{match, Matches}=regexp:matches(Body2,Reg_exp2),
Frnd_new = [string:substr(Body2,Start2+6 ,Length2-6) || {Start2,Length2} <- Matches],
case Frnd_new of
[] -> Frnd;
_ -> get_friends_page(Page + 1,User_Id,lists:append(Frnd,Frnd_new))
end.
noself(H) ->
fun(S) ->
case regexp:match(S,H) of
{match,_,_} -> false;
nomatch -> true;
{error,_} -> true
end
end.
%replace_forb_char replaces special (regexp) characters in user name
replace_forb_chars(S) ->
replace_forb_chars(S,".$()*+").
replace_forb_chars(S,[RH|RT]) ->
Regexp="["++[RH]++"]",
{ok,Newstr,_}=regexp:gsub(S,Regexp,Regexp),
replace_forb_chars(Newstr,RT);
replace_forb_chars(S,[]) ->
S.
%to_file writes friends into DOT file
to_file(Frnd) ->
%this line violates DRY (Refactor?)
{ok,F}=file:open("mnm.file",[append]),
to_file(F,Frnd).
to_file(F,[{User,Frnds}|T]) ->
%TODO: Format of map/frineds
Out_Frnd= fun(Frnd)-> io:format(F,"\"~s\" -> \"~s\"~n",[User,Frnd]) end,
lists:map(Out_Frnd,Frnds),
to_file(F,T);
to_file(F,[]) ->
file:close(F),
ok_to_file.
%init_file initializes the DOT file
init_file() ->
%this line violates DRY (Refactor?)
{ok,F}=file:open("mnm.file",[write]),
io:format(F,"digraph mydot {~nnode [color=red, shape=ellipse];~n",[]),
file:close(F).
%end_file inserts the coda in the DOT file
end_file() ->
%this line violates DRY (Refactor?)
{ok,F}=file:open("mnm.file",[append]),
io:format(F,"[weight=1, color=black];~n}~n",[]),
file:close(F).
- Sequential programming y Concurrent Programming: primeros pasos en Erlang
- Erlang stdlib: lo primero que deberÃa mirar uno de un nuevo lenguaje. Reinventar la rueda es una cosa muy fea, a no ser que vayas a hacer una rueda más bonita ;P
- Erlang Cookbook: ejemplos de cosas comunes en erlang. Recetillas
- Comenté alguna otra referencia para empezar con este lenguaje en Programando con Erlang
» Leer más, comentarios, etc...
Buayacorp
15 herramientas gratuitas para detectar vulnerabilidades de Inyección de SQL
Mayo 29th, 2007 - [Enlace local]
Una fallo de inyección de SQL (o SQL Injection en inglés) es ...
...es una vulnerabilidad informática en el nivel de la validación de las entradas a la base de datos de una aplicación. El origen es el filtrado incorrecto de las variables utilizadas en las partes del programa con código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación o de script que esté incrustado dentro de otro.
Según estadÃsticas publicadas por WhiteHack Security, los fallos de inyección de SQL y otro tipo de vulnerabilidades afectan a un gran número de sitios web, por lo que el uso de herramientas automatizadas que detecten posibles problemas de seguridad son más que recomendables.
En Security-Hacks, han publicado una lista de herramientas destinadas a encontrar y explotar vulnerabilidades de inyección de SQL.
- SQLIer
- SQLbftools
- SQL Injection Brute-forcer
- SQLBrute
- BobCat
- SQLMap
- Absinthe
- SQL Injection Pen-testing Tool
- SQID
- Blind SQL Injection Perl Tool
- SQL Power Injector
- FJ-Injector Framwork
- SQLNinja
- Automagic SQL Injector
- NGSS SQL Injector
Para evitar este tipo de ataques se debe hacer uso de consultas parametrizadas o funciones que el lenguaje de programación provea para este fin, en lo posible no debemos reinventar la rueda y hacer funciones que algunas veces no sirven de nada.


