Noticias Weblogs Foros Wiki Código

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

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

BLOG - 3wstudio.com.ar

UML, que es?

Febrero 28th, 2007 - [Enlace local]

Introduccion

UML es un lenguaje estándar para escribir planos de software. UML puede utilizarse para visualizar, especificar, construir y documentar los artefactos de un sistema que involucra gran cantidad de software.

Es un lenguaje muy expresivo, que cubre todas las vistas necesarias para desarrollar y luego desplegar tales sistemas. Aunque sea expresivo, UML no es dificil de aprender ni de utilizar.

UML es solo un lenguaje y por tanto es tan solo una parte de un metodo de desarrollo de software. UML es independiente del proceso, aunque para utilizarlo optimamente se debería usar en un proceso que fuese dirigido por los casos de uso, centrado en la arquitectura, iterativo e incremental.

El vocabulario y las reglas de un lenguaje como UML indican como crear y leer modelos bien formados, pero no dicen que modelos deben crearse ni cuando deberian crease. Esta en la terea del proceso de desarrollo de software.

UML es un lenguaje para:

Visualizar:

Especificar:

Especificar significa cosntruir modelos preciso, no ambiguos y completos.

UML, cubre la especificación de todas las decisiones de análisis, diseño e implementación que deben realziarse al desarrollar y desplegar un sistema.

Construir:

UML no es un lenguaje de progamación visual, pero sus modelos pueden conectarse con una gran cantidad de lenguajes de programacion.
Esto permite la ingeniería directa: la generacion de código a partir de un modelo UML. Lo contrario también es posible, se puede contruir un modelo UML a partir de una implementación.

La combinación de estas dos vías de generación de código y de ingeniería inversa produce una ingeniería de “ida y vuelta”, entendiendo por esto la posibilidad de trabar en una vista gráfica o textual, mientras las herramietnas mantienen la consistencia entre las dos vistas.

Ademas de esto, UML es lo suficientemente expresivo y no ambiguo como para permitir un ejecución directa de modelos, la simulación de sistemas y la instrumentación de sistemas en ejecución.

Documentar:

Al desarrolar un software se produce toda clase de artefactos además de código ejecutable, como por ejemplo: requisitos, arquitectura, diseño, código fuente, planificación de proyectos, pruebas, prototipos, versiones.

UML cubre la documentación de la arquitectura de un sistema y todso sus detalles. También proporciona un lenguaje para expresar requisitos y pruebas. Finalmente proporciona un lenguaje para modelar las actividades de planificación de proyectos y gestión de versiones.

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

BLOG - 3wstudio.com.ar

UML, que es?

Febrero 28th, 2007 - [Enlace local]

Introduccion

UML es un lenguaje estándar para escribir planos de software. UML puede utilizarse para visualizar, especificar, construir y documentar los artefactos de un sistema que involucra gran cantidad de software.

Es un lenguaje muy expresivo, que cubre todas las vistas necesarias para desarrollar y luego desplegar tales sistemas. Aunque sea expresivo, UML no es dificil de aprender ni de utilizar.

UML es solo un lenguaje y por tanto es tan solo una parte de un metodo de desarrollo de software. UML es independiente del proceso, aunque para utilizarlo optimamente se debería usar en un proceso que fuese dirigido por los casos de uso, centrado en la arquitectura, iterativo e incremental.

El vocabulario y las reglas de un lenguaje como UML indican como crear y leer modelos bien formados, pero no dicen que modelos deben crearse ni cuando deberian crease. Esta en la terea del proceso de desarrollo de software.

UML es un lenguaje para:

Visualizar:

Especificar:

Especificar significa cosntruir modelos preciso, no ambiguos y completos.

UML, cubre la especificación de todas las decisiones de análisis, diseño e implementación que deben realziarse al desarrollar y desplegar un sistema.

Construir:

UML no es un lenguaje de progamación visual, pero sus modelos pueden conectarse con una gran cantidad de lenguajes de programacion.
Esto permite la ingeniería directa: la generacion de código a partir de un modelo UML. Lo contrario también es posible, se puede contruir un modelo UML a partir de una implementación.

La combinación de estas dos vías de generación de código y de ingeniería inversa produce una ingeniería de “ida y vuelta”, entendiendo por esto la posibilidad de trabar en una vista gráfica o textual, mientras las herramietnas mantienen la consistencia entre las dos vistas.

Ademas de esto, UML es lo suficientemente expresivo y no ambiguo como para permitir un ejecución directa de modelos, la simulación de sistemas y la instrumentación de sistemas en ejecución.

Documentar:

Al desarrolar un software se produce toda clase de artefactos además de código ejecutable, como por ejemplo: requisitos, arquitectura, diseño, código fuente, planificación de proyectos, pruebas, prototipos, versiones.

UML cubre la documentación de la arquitectura de un sistema y todso sus detalles. También proporciona un lenguaje para expresar requisitos y pruebas. Finalmente proporciona un lenguaje para modelar las actividades de planificación de proyectos y gestión de versiones.

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

Navegapolis

¿Se pueden alcanzar niveles de madurez CMMI evaluables con SCAMPI empleando prácticas ágiles?

Febrero 28th, 2007 - [Enlace local]

pseudo cmmiEsta es la pregunta a la que responde el informe "Implementing CMMI using a Combination of Agile Methods" publicado por el Departamento de Sistemas de la universidad colombiana del Cauca y el Departamento de Ciencias de la Computación de la Universidad de Chile.

Este informe expone algunas conclusiones del proyecto de investigación  de los mismos autores: SIMEP-SW, del que hay un borrador publicado en las páginas de la universidad de Chile.

La siguiente tabla muestra los porcentajes de cumplimiento que en diferentes áreas de proceso de CMMI se pueden obtener combinando prácticas de varios modelos ágiles (XP, ASD, Scrum, FDD CC y Evo). Los autores exponen que añadiendo prácticas específicas apropiadas, se podría obtener una evaluación de nivel de madurez 2.

 

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

Variable not found, 0:1

¿Dónde se han ido los programadores?

Febrero 28th, 2007 - [Enlace local]

Vía el magnífico Coding Horror he encontrado un interesante post en el que se comenta algo tan curioso como increíble: durante entrevistas de trabajo para cubrir vacantes de puestos de programación, se constata que la inmensa mayoría de los candidatos no son capaces de codificar ni los programas más simples.

Habitualmente se trata de personas con titulaciones medias o superiores, cierta experiencia previa y un conocimiento de tecnologías de programación, al menos en teoría, relativamente alto, perfectamente capaces de mantener una conversación sin soltar barbaridades destacables.

Y lo más increíble de todo es una de las técnicas que usan para "filtrar" el personal en las entrevistas de selección: el "test FizzBuzz". La prueba consiste en solicitar a los candidatos:

Escribir un programa que imprima los números del 1 al 100. Sin embargo, hacer que en los múltiplos de tres se imprima la palabra "Fizz" en vez del propio número, y en los múltiplos de cinco se imprima "Buzz". Para aquellos números múltiplos de tres y cinco simultáneamente, se debe imprimir "FizzBuzz".

Si piensas que esta prueba es una chorrada, atento a las conclusiones que sacan los que la han puesto en práctica. La mayoría de los graduados, ingenieros, diplomados en informática no pueden hacerlo. Incluso muchos auto-proclamados programadores expertos tardan más de diez minutos en escribir una solución.

No sé si se trata de una exageración, pero en realidad se toca un tema muy espinoso y cierto como la vida misma: la falta de preparación de los futuros (y algunos actuales) programadores.

Y está claro que una de las medidas a tomar, desde el punto de vista de una empresa, es reforzar las pruebas y criterios de selección de su personal. No sé si el "FizzBuzz" es la solución, pero sin duda es un buen ejemplo: intentar conocer al candidato, sus habilidades y limitaciones básicas puede ayudar a descartar tarugos que pululan por el ciberespacio y han anidado masivamente en sitios web de ofertas de empleo. De esta forma, se evitará que entren en casa.

Pero el origen del problema es anterior a todo esto. ¿Qué se está enseñando en los centros de formación? ¿Qué nivel se exige a los estudiantes? ¿Existe todavía vocación en esta profesión?

Preocupante, ¿no?

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

Pensamientos ágiles

EclEmma, de lo mejor en cuanto a cobertura de código

Febrero 28th, 2007 - [Enlace local]

Hacía tiempo que no me encontraba con un plug-in de Eclipse que me haya cautivado más. Se trata de EclEmma, nominado a mejor herramienta de desarrollo Open Source basada en Eclipse del 2007; y sólo puedo decir que realmente... se lo merece. Ha sido instalarla y caer enamorado.

Y es que no requiere ningún esfuerzo por parte del desarrollador. Nada de tener que ejecutar ant, o maven, o tener que abrir ficheros HTML con tus informes de cobertura. Nada. Simplemente ejecuta tus unit tests, y ahí tienes toda la información de cobertura. Y lo mejor de todo es que te colorea temporalmente el código marcándote las partes que han sido cubiertas y las partes que no lo han sido.

Como bien dicen en su página principal: Fast develop/test cycle, Rich coverage analysis, y Non-invasive:. Y encima, la instalación tan cómoda como actualizar desde el update site y reiniciar. Hasta casi estoy pensando que tengo ganas de volver a trabajar para sentir esa sensación de placebo que da el subir en el nivel de cobertura... es broma :D

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

.NET o no .NET, esa es la cuestión

Trabajar con doble buffer en un Panel

Febrero 28th, 2007 - [Enlace local]

Generalmente cuando trabajo con gráficos suelo pintar sobre el área cliente de la propia ficha, pero esta vez he tenido que hacerlo por narices en un panel.

Activar el sistema de doble buffer de una ficha es muy sencillo, tenemos que cambiar su estilo y aplicarlo. Algo así: 

this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint,true);
this.UpdateStyles();

El primer valor de ControlStyles indica que se va a activar el doble buffer, el segundo que se genere un evento de pintado cuando se redimensione el panel (este valor no es obligatorio pero me hace falta a mi),  y el tercero que todo el pintado se va a realizar en evento Paint (habitualmente el sistema primero pinta el fondo automáticamente en otro evento y luego llama al de pintado).

Pero lo que con una ficha es algo trivial con un Panel es imposible ya que dichos métodos son protegidos y no tenemos acceso a ellos. La solución políticamente correcta consiste en heredar del panel para tener acceso a los miembros protegidos del mismo, pero entonces quitamos la posibilidad de trabajar en el editor visual (a no ser que te crees un componente propio basado en un panel, pero es casi peor el remedio que la enfermedad).

Pero como el menda es bastante políticamente incorrecto, buscando por aquí y por allí ha encontrado un método alternativo mucho más fácil que el anterior, método que consiste en llamar a dichas funciones protegidas mediante el uso de la reflexión (y aquí es donde uno agradece ciertos aspectos del .NET):

 

//Activating DoubleBuffer techniques. We must do it with reflection because Panel.SetStyle is a protected member.
MethodInfo m=typeof(Panel).GetMethod("SetStyle",System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
Object[] parameters=new Object[2];
parameters[0]=
new ControlStyles();
parameters[0]=
ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint;
parameters[1] =
new bool();
parameters[1] =
true;
m.Invoke(m_pnlGuachindeil, parameters);
m =
typeof(Panel).GetMethod("UpdateStyles", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
m.Invoke(m_pnlGuachindeil,
null);

Siendo justos deberíamos controlar si el valor de m es válido, pero como este código va prefijado si algo falla es que debemos terminar, así que dejamos la salida, el lanzamiento de la excepción y la captura de la misma al sistema (eso si lo hace, cosa que no siempre ocurre como hemos podido ver en alguna entrada anterior).

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

.: El Blog de Inwe :.

Zend Framework

Febrero 28th, 2007 - [Enlace local]

Es un framework basado en la arquitectura MVC (Model-View-Control), el cual nos ayudará a crear aplicaciones más robustas y seguras, además de ofrecernos una forma sencilla de usar servicios web con PHP 5. Actualmente se encuentra en la versión 0.8 (totalmente estable), se espera que la versión estable 1.0 dí la luz sobre Abril.

Uno de los atractivos que tiene este framework, es que está soportado por la compañía Zend, que no es más que la empresa que está detrás de PHP, por lo que es un sinónimo de calidad y de soporte, ya que al ser una aplicación de código abierto, hay muchos programadores trabajando en él a lo largo del mundo.

Para todos aquellos que quieran aprender más sobre este gran framework, os recomiendo la lectura de las siguientes guías, sobre todo la primera ya que es más introductoria. Os recomiendo para la serie Understanding the Zend Framework que os registráis en IBM para obtener toda la información y el documento en pdf (es gratis):

,

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

Buayacorp

Colección de Wallpapers

Febrero 28th, 2007 - [Enlace local]

Para los interesados, Hamad Darwish publicó las imágenes que preparó para la colección de fondos de pantalla de Windows Vista, por lo que el mismo comenta, sólo 2 de un total de 34 imágenes fueron incluidas finalmente en este sistema operativo.

Windows Vista Wallpaper

Estos fondos de pantalla (1920x1200) están disponibles para descarga en un solo archivo comprimido (30.9MB).

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

Spejman's Blog

Ejecutar weka desde linea de comandos

Febrero 28th, 2007 - [Enlace local]

Weka es una librería de algoritmos de aprendizaje automático para realizar tareas de minería de datos (data mining). Incluye también un entorno gráfico muy útil.

Para un proyecto de adquisición léxica en el que estoy trabajando necesitaba ejecutar weka desde línea de comandos, como no ha sido directo averiguar como se hace os hago un resumen.

La idea es que tenemos que escoger un algoritmo, entrenarlo, guardarnos el modelo generado con este entrenamiento y usarlo para clasificar los datos que queramos.

  1. Entrenamiento: Una vez escogido el algoritmo (en nuestro caso utilizaremos un árbol de decisión weka.classifiers.trees.J48) creamos el modelo entrenando el árbol con los datos de entrenamiento:

    java -Xmx[MEGABYTES_DE_MEM_PARA_LA_TAREA]M -cp [PATH_A_weka.jar] [ALGORITMO_DE_APRENDIZAJE+PARÃ?METROS] -t [FICHERO_ENTRENAMIENTO] -d [FICHERO_DONDE_SE_GUARDA_EL_MODELO]

    Por ejemplo:

    java -Xmx1024M -cp /opt/weka-3-4-9/weka.jar weka.classifiers.trees.J48 -C 0.25 -M 2 -t rweka.arff -d rweka.model

  2. Clasificación: Con el modelo generado en el paso anterior y los datos para clasificar ejecutamos:

    java -Xmx[MEGABYTES_DE_MEM_PARA_LA_TAREA]M -cp [PATH_A_weka.jar] [ALGORITMO_DE_APRENDIZAJE] -l [FICHERO_CON_EL_MODELO] -T [FICHERO_A_CLASIFICAR] -p 0

    En mi caso:

    java -Xmx1024M -cp /opt/weka-3-4-9/weka.jar weka.classifiers.trees.J48 -l rweka.model -T rweka.arff -p 0

    Este paso nos retornará por la salida estándar la clasificación de cada elemento del fichero en una línea con el número de este elemento en primer lugar, seguido de la clase que asigna el algoritmo y de información adicional:
    [NÚMERO_ELEMENTO] [CLASE_ASIGNADA] [CONFIANZA_EN_LA_RESPUESTA] [CLASE_REAL]

Notas:

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

Navegapolis

Ideas de negocio

Febrero 27th, 2007 - [Enlace local]

esnegocioUna dierección interesante para quienes les gusta diseñar y compartir ideas de negocio innovadoras, y para los que quieren ganar dinero con los que trabajan gratis.

Blogalaxia Tags: esnegocio ideas negocio innovación emprendedores

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

Navegapolis

Jornadas sobre testeo de software

Febrero 27th, 2007 - [Enlace local]

logoEl Instituto Tecnológico de Informática organiza ya la cuarta edición de las Jornadas Internacionales sobre Testeo de Software, JTS2007, para divulgar entre las empresas del sector TIC la importancia del testeo de software.
Cuenta con la participación de expertos nacionales e internacionales en software testing, que expondrán las tendencias actuales más relevantes y enseñarán practicas y conocimientos de aplicación directa en el trabajo diario.

Blogalaxia Tags: JTS2007 testeo+de+software pruebas+de+software Valencia

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

.NET o no .NET, esa es la cuestión

Un gallinfante de regalo a quien sepa la respuesta

Febrero 27th, 2007 - [Enlace local]

Esta entrada va a ser muy cortita. Es una pregunta dejada al aire, por si alguien la quiere recoger...

Existe la estructura RectangleF, que es un rectángulo con sus coordenadas marcadas en coma flotante.

Existen infinitud de métodos que permiten dibujar y operar con dichas estructuras como elementos de delimitación (DrawString, DrawImage, DrawEllipse, etc, etc...)

Entonces, ¿por qué no existe un método Invalidate que nos acepte un RectangleF?

Evidentemente existe un workaround, y es crear una región a partir de un RectangleF pero ya tenemos que trastear con asignaciones de memoria dentro de lugares en los que cuanto más rápido vayamos, mejor.

miControl.Invalidate(new Region(miRectangleF));

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

Pensamientos ágiles

Guía para la resolución de problemas en Java 6

Febrero 27th, 2007 - [Enlace local]

Un simple link a la Troubleshooting Guide for Java SE 6 with HotSpot para el afortunado que esté trabajando con ella :)

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

.NET o no .NET, esa es la cuestión

UAC (Usuarios Autistas Carentes de toda razón)

Febrero 27th, 2007 - [Enlace local]

Ya lo dijo no sé quién: la condición humana consiste no estar nunca contento. O dicho de otra forma mucho más políticamente incorrecta, los programadores están intentando hacer programas cada vez más robustos frente a los usuarios, y el universo está haciendo usuarios cada vez más manazas, y por desgracia, de momento quién gana es el universo.

Antes windows era inseguro, o eso se decía, ahora windows es más seguro, o eso se dice. Antes la gente se quejaba porque se les instalaban virus, troyanos y demás fauna maliciosa, sin caer en la cuenta de que la culpa de que eso ocurriera en del propio usuario, o como dice alguien que conozco, el problema está entre la silla y el teclado. Y esto nadie puede discutirlo.

Porque señores, salvo excepciones, todos esos bichitos que pueden convivir en nuestros ordenadores no se instalan solos, sino que requiere la intervención activa del usuario; como poco has de navegar por lugares peligrosos, aceptar cosas que no deberías o instalar toda la mierda que venga en los cds de regalo.

O mejor el típico mensaje de correo cadena en el que se promete un video porno sadomasoquista con un teléfono móvil tremendamente interesante (el vídeo, no el teléfono), el último chiste sobre Bill Gates o el programa de apuestas que te va jubilar.

Pero siempre, siempre, está la intervención del usuario que decide aceptar e instalar. Y que nadie me vengan con cuentos chinos sobre cosas que se instalan solas o que mágicamente aparecen en el escritorio de tu ordenador.

La solución a ello es bien sencilla, y consiste en encontrar un método que impida la instalación automática mediante una simple pulsación de tecla de cualquier software, así como la necesidad de implementar algún sistema activo para que cuando se vaya a realizar una acción potencialmente crítica en un equipo el usuario sea consciente de que se está metiendo en camisa de once varas.

La solución clásica de windows y de la mayoría de los sistemas operativos consiste tener al menos 2 tipos de cuentas: aquellas en las que es posible realizar cualquier acción y otras en las que se impida activamente el poder destrozar cualquier cosa. Pero este modelo tiene una contrapartida en equipos de escritorio y para usuarios avanzados, y es que hay que estar continuamente cambiando de usuario ante ciertas tareas, lo que a veces resulta bastante tedioso y pesado.

Linux lo soluciona mediante la promoción automática del programa previo introducción de la clave de acceso de administrador; y muchas distribuciones vienen preparadas para no tener que hacer otra cosa más que introducir dicha clave.

Windows Vista lo soluciona de una manera similar pero mucho más elegante y sencilla. Es lo que se llama UAC. Mediante este sistema cuando vamos a hacer una tarea potencialmente peligrosa la pantalla se oscurece y windows nos pregunta si realmente queremos realizar tal acción. Un simple clic de ratón o la pulsación de una flecha y enter aceptan la acción, pero lo importante es que de ninguna manera podemos ignorar que vamos a realizar una acción potencialmente peligrosa. No valen justificaciones como que " no me he dado cuenta de que el mensaje preguntaba eso", " no me ha dicho nada", " es que estaba pensando en otra cosa".

El cambio de contexto que se produce dentro del ordenador es tan brutal que no deja lugar a dudas de que se va a realizar una acción peligrosa, y quizá sea eso lo que disguste en gran medida la mayoría de la gente, pero es una efectiva forma de llamar la atención. Sería equivalente a vivir en una cueva hace un millón de años y estar comiéndonos una chuleta tan tranquilamente, levantar la vista, y ver a un león acechándonos.

Pero lo queremos todo, queremos que nuestro windows sea seguro pero no queremos tomar medidas para ello, somos unos inconformistas de tomo y lomo, incapaces de ver lo que tenemos delante de las narices, y menos aún comprender que el único modo de evitar que cometamos pifias por nuestra propia estupidez es disponer de un sistema parecido al UAC. Y si Windows Vista te pregunta continuamente cada vez que abres o cambias de sitio uno de tus documentos ve pensando en hacer un curso de informática para enterarte de algunas cosas...

Quizás no sea el el mejor sistema de todos, pero lo prefiero por encima del de Linux, no veas lo que jode estar todo el día que creando una clave de acceso cada diez minutos. Porque Señores, si no se han dado cuenta, el funcionamiento bajo Linux es ese.

Estamos tan embebidos en nuestra propia estulticia que somos incapaces de reconocer una buena idea aunque provenga de lo que algunos llaman el lado oscuro de la informática; porque a ver una cosa, señores, todos esos que os quejais de que el UAC es como una mosca cojonera, despotricais por tener que mover el ratón unos centímetros o por pulsar dos teclas, decidme, ¿existe otra manera más sencilla de hacerlo? Al que no le guste que proponga una idea mejor.

Es muy bonito eso de despotricar de forma descerebrada sin detenerse ni un segundo a pensar las tonterías que se están diciendo. Cualquiera con dos dedos de frente se da cuenta de que es la única forma de evitar que el usuario compulsivo (por no decir tonto) se vea cogido en sus propias redes. No me refiero a la forma en que el UAC lo hace, sino a la necesidad de tener que preguntarle al usuario si está seguro de la tontería que va a cometer. Y la forma en que el UAC lo hace es, a mi modo de ver, la mejor de todas las posibles dentro de un entorno doméstico.

Y si no estáis de acuerdo, proponed una mejor.

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

Linking Paths día a día

Maneras de vivir

Febrero 27th, 2007 - [Enlace local]

Y no, no me refiero a la canción de Leño, un clásico. Los dos últimos sábados, he tenido dos reuniones similares pero muy diferentes. De empresas pequeñas que buscan una forma de hacerse un hueco, aunque el concepto de pequeño es muy distinto en ambos casos, como también lo es el de hueco. No es que sean opuestas, pero por un lado se busca dominar el mundo, por el otro vivir de otra forma. En un lado hay sueños, en el otro ambición.

¡Qué se le va a hacer, yo soy un soñador!.


No sé si estoy en lo cierto
lo cierto es que estoy aquí
otros por menos se han muerto
maneras de vivir.

Descuélgate del estante
y si te quieres venir
tengo una plaza vacante
maneras de vivir.

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

Linked

Maneras de vivir

Febrero 27th, 2007 - [Enlace local]

Y no, no me refiero a la canción de Leño, un clásico. Los dos últimos sábados, he tenido dos reuniones similares pero muy diferentes. De empresas pequeñas que buscan una forma de hacerse un hueco, aunque el concepto de pequeño es muy distinto en ambos casos, como también lo es el de hueco. No es que sean opuestas, pero por un lado se busca dominar el mundo, por el otro vivir de otra forma. En un lado hay sueños, en el otro ambición.

¡Qué se le va a hacer, yo soy un soñador!.

No sé si estoy en lo cierto
lo cierto es que estoy aquí
otros por menos se han muerto
maneras de vivir.

Descuélgate del estante
y si te quieres venir
tengo una plaza vacante
maneras de vivir.

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

Buayacorp

La (in)seguridad de Internet Explorer

Febrero 27th, 2007 - [Enlace local]

Este último fin de semana, mientras hacía una lectura de los sitios a los que estoy suscrito, encontré una interesantísima entrada en el que describe un bug que hace que Internet Explorer facilite los ataques XSS.

Para los que no siguieron el enlace, intentaré resumir de que trata el bug que se comenta ahí:

En teoría, cualquier documento que es servido por un (valga la redundancia) servidor web, está acompañado por una cabecera Content-type, que indica al navegador el tipo de archivo que es, en base a esto el navegador normalmente asocia una acción (interpretar el documento, pasar el control a otra aplicación o finalmente preguntar al usuario que desea hacer con ese archivo).

El caso es que Microsoft implementó algo que se denomina MIME Type Detection, donde básicamente se usan los primeros bytes de un archivo para intentar determinar el tipo o contenido del mismo, esta característica incluso está mencionado en el RFC 2616 (sección 7.2.1 Type).

Any HTTP/1.1 message containing an entity-body SHOULD include a Content-Type header field defining the media type of that body. If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource. If the media type remains unknown, the recipient SHOULD treat it as type "application/octet-stream".

De la cita, se puede ver que sólo se debe usar esta característica si el servidor web NO envía el Content-type correspondiente para el documento que está enviando al cliente.

Como casi todo en la historia de Internet Explorer, Microsoft tiene su propia forma de interpretar los estándares, y es que gracias a la característica antes mencionada, un archivo de texto plano, imagen u otro tipo de documento puede ser interpretado como HTML siempre y cuando éstos incluyan contenido HTML.

Si alguien tiene Internet Explorer a la mano, puede ver que si entra a http://test.buayacorp.com/xss.txt, se mostrará el mensaje "Esto es un archivo de texto" para un archivo de texto plano que contiene lo siguiente:

code:
<script>alert("Esto es un archivo de texto")</script>

Gracias a este bug, múltiples aplicaciones o sitios que permiten subir contenidos a sus usuarios son vulnerables, entre los que se me vienen a la mente:

No recomiendo un navegador en especial (usen Firefox! :D ), puesto que fácilmente podría hacer el ridículo con los últimos bugs reportados en varios navegadores.

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

PHP Senior

Taller PHP5: “Semana 2 - Ingeniería Inversa”

Febrero 27th, 2007 - [Enlace local]

Esta es la letra de la Semana2 del Taller sobre PHP5:

La "empresa" SurForce, entendiendo que el postulante ha estudiado cabalmente el material que se le sugirió como base, solicita que se apliquen los conceptos aprendidos y resuelva los siguientes requerimientos:

Preparar el entorno de trabajo

  1. Bajar el "proyecto base" desde el repositorio SVN: usando las herramientas instaladas obtener los fuentes del proyecto que se encuentra actualmente alojado en el servicio Google Code.
  2. Reconstruir la base de datos que necesita el sistema (subdirectorio "sql").
  3. Probar todas las opciones del sistema

Documentar el sistema

Se necesita hacer "ingeniería inversa", es decir, usted recibe un sistema que desconoce y que no cuenta con documentación. Se le solicita que analice el sistema y presente una documentación que contenga los siguientes diagramas UML.
  1. Diagrama de "Casos de Uso"
  2. Diagrama de "Paquetes" (presentación, dominio y persistencia)
  3. Diagrama de "Clases" de cada paquete.

Cuestionario

Contestar el siguiente cuestionario (en caso afirmativo indicar claramente en que parte del fuente, en caso negativo, justificarlo de forma detallada)
  1. ¿En qué parte del sistema se realiza "herencia"?
  2. ¿En alguna parte del sistema se usa "polimorfismo"?
  3. ¿Si tuviera que agregar otro tipo de usuario, como un Administrador, qué haría?
  4. Obtenga un ejemplo de "encapsulamiento" y explíquelo detalladamente.

Forma y límite de la entrega

Tienen una semana para investigar, experimentar, y aplicar los conocimientos. El plazo de entrega es el próximo lunes sin prórroga.

Para la documentación deberá usar las siguientes herramientas:
IMPORTANTE: El desarrollador que exceda de esta fecha límite (lunes 5 de marzo) o que en la documentación falte alguno de los requerimientos, será descartado del taller.

PD: todas las dudas sobre los requerimientos podrán hacerse en los comentarios de esta entrada.

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

diego sevilla's weblog

Cuando Google llama a tu puerta

Febrero 27th, 2007 - [Enlace local]

Hace tiempo que no escribo nada por aquí, salvo alguna foto. No sé a qué se debe exactamente. Quizá a que tengo que hacer tantas cosas que escribir aquí me parece una pérdida de tiempo.

Sin embargo, están pasando muchas cosas en mi vida, bastante importantes, y quiero escribir alguna de ellas. Por ejemplo, como el título indica, Google me ha llamado porque están montando un centro de investigación en Zúrich. Esto sucedió hace unos meses. Hablaron conmigo, les envié el currículum y no supe nada más hasta hace poco. Pensé que mi currículum no era ninguna cosa del otro mundo y que se habían olvidado del tema, ya que tendrían cien mil solicitudes mejor que la mía.

Hace poco recibí una llamada al móvil de la que no entendí una palabra al principio. Decía algo así como “Hi sfdsfaisodfsifd sfsf Google UK”. Cuando entendí esto último y logré cambiar el chip a inglés… por fin pude entender lo que me decía. Según parece, la que habló conmigo en primera instancia ya no estaba en Google y por eso se habían retrasado en llamarme.

En fin, que concertaron una entrevista con alguien de Google Zurich. Me explicaron que Google es una empresa guiada por el “Engineering”, por lo que ellos mismos eran los que en última instancia decidían si contrataban o no. Por lo tanto, la entrevista sabía que iba a ser de corte tecnológico, con acertijos, etc.

Esta tarde me han llamado. Después de preguntarme cosas sobre el currículum (como en qué medida había participado en evolution y en Mono, si había escrito tests unitarios para mi código, en qué había consistido la revisión de código que había hecho, etc.) ha cambiado el tercio para hacerme preguntas de programación que tienen preparadas. Reproduzco más o menos en español lo más interesante del diálogo. En realidad ha sido en inglés: (G = Google, D = Diego):

[G] - Déjame que te pregunte una coas. Imagina que tienes una cadena de caracteres con palabras dentro y quieres ordenar las palabras en orden inverso. ¿Cómo lo harías?

[D] - Eh… esto… Construiría una lista de palabras con un list<string>, iría introduciendo las palabras en ella y luego recorrería la lista de forma inversa escribiendo en la cadena original.

[G] - OK, ¿y qué complejidad tendría eso?

[D] - Sería O(n), porque se tienen que hacer un par de recorridos por la cadena de longitud n.

[G] - OK, ¿Y en cuanto a memoria?

[D] - Pues sería también de orden O(n+m), donde n es el número de caracteres de la cadena (duplicados en total, ya que la lista contiene los mismos caracteres en total) más m nodos de lista donde m es el número de palabras.

[G] - OK. ¿Y se te ocurre una manera de hacerla usando sólo la cadena original?

(Aquí, en vez de estar pensando en el algoritmo, yo sólo pensaba “¡Coño, esto tiene que ser fácil!” “Me cago en la leche” Y a la vez pensando en qué decirle al tipo en inglés para que no se aburriera)

[D] - Let me see… si invierto la cadena… no, eso no, porque blah blah…

(pienso un poco … Después me he dado cuenta)

[D] - Ahh, OK, si invierto la cadena, luego puedo invertir cada palabra dentro de esa cadena, y ya está.

[G] - OK, sí, esa es la respuesta, ¿cuál es la complejidad, etc.?

(La siguiente pregunta era de otro algoritmo. En realidad ninguno de los dos eran muy complicados, pero sí que indican a ellos que tienes las herramientas necesarias)

[G] - OK, ahora otro problema diferente. Imagina que tienes una secuencia de números, y que te digo que busques si en la secuencia hay dos números tales que sumados me de otro número.

[D] - Yo le he dicho, para ir aclarando, por ejemplo, que tengo dos números dentro de la cadena, i y j, que al sumarlos dan k: i+j=k

[G] - Así es.

(piensa otro medio minuto)

[D] - OK, ordeno la secuencia y empiezo a recorrerla con dos índices. Uno al principio y otro al final. Avanzo el del final hacia el principio mientras el resultado del índice de la izquierda más el de la derecha sea mayor que k. Cuando llegue a uno que es menor que k, incremento el índice de la derecha, y así sucesivamente.

[G] - OK, ¿y qué orden tiene eso?

[D] - (aquí me he equivocado y le he dicho que ordenar era O(log2n), cuando en realidad es O(nlog2n). No importa, él me ha corregido). OK, sería O(log2n), porque el recorrido final es O(n).

[G] - O(n log2n)

[D] - Oh, sí, efectivamente, perdón.

[G] - ¿Y no se podría hacer más rápido?

[D] - (claro, he pensado “¡coño!” otra vez…) Se podría construir otro array, donde se apuntara de alguna manera el número necesario… no, espere… pero eso necesitaría de otro array, y antes me ha dicho que no utilizara mucha memoria

[G] - Sí, pero eso era para el de ahora. ¿Qué harías si puedes utilizar más memoria y otros arrays?

[D] - Si puedo utilizar bastante memoria, lo mejor sería un hash o un array de booleanos inverso si sé ma magnitud de los números (por ejemplo, de 1 a 1000 puedo construir un array de booleanos de 1000 elementos).

[G] - OK, y si usas hash, ¿qué función usarías?

[D] - Pues depende de la cantidad de memoria que quisiera utilizar. Eso define el tamaño del hash y el número de bits de la indización. Normalmente se utilizan funciones módulo N, donde N es el tamaño de los índices del hash, y también se pueden evitar colisiones y hacer algoritmos más eficientes con el direccionamiento abierto y el doble hashing, o incluso teniendo tablas precalculadas de hash como utiliza gperf, que siempre da O(1) al evitar las colisiones.

[G] - OK, muchas gracias. Creo que la entrevista está llegando a su fin… Si tienes alguna pregunta que hacerme…

[D] - Hombre, pues si puedo preguntarte, me gustaría que me comentaras qué te ha parecido la entrevista :)

[G] - Hombre…. no te lo puedo decir… esto no soy yo quien lo evalúa… Pero en fin… te puedo decir que vas a hacer la siguiente entrevista…

Lo cual quiere decir que quizá no lo haya hecho tan mal…

Sinceramente, lo que más trabajo me ha costado es explicar por el teléfono y sin saber el problema de antemano en inglés las cosas… Cosas como “recorrer un array”, no recordaba cómo se decían. Quizá como “go through the array”, pero no estoy muy seguro… He querido poner esta entrevista para que si alguien se ve después en esta tesitura, al menos sepa a qué enfrentarse.

Y ahora el verdadero problema… Esto es un sueño, sin duda. Google es una de las empresas más importantes e innovadoras del mundo. Pero esto también significaría dejar mi vida aquí y emprender otra dirección. Es difícil conciliar pareja y familia con eso.

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

Vivir del Software

¿Cuanto me cuesta un cliente?

Febrero 26th, 2007 - [Enlace local]

Todos tenemos claro que cuesta mucho conseguir un cliente. Muchas visitas, muchas ideas, pocos éxitos (proporcionalmente). También sabemos que conseguir un cliente nuevo cuesta seis veces lo que cuesta mantener a un existente. Pero.... ¿existe un momento en que sea mejor perder un cliente que mantenerlo?, ¿en que momento deja de ser un cliente rentable?.


Continua leyendo "¿Cuanto me cuesta un cliente?"

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

Linked

¿Cuánto me cuesta un cliente?

Febrero 26th, 2007 - [Enlace local]

Todos tenemos claro que cuesta mucho conseguir un cliente. Muchas visitas, muchas ideas, pocos éxitos (proporcionalmente). También sabemos que conseguir un cliente nuevo cuesta seis veces lo que cuesta mantener a un existente. Pero…. ¿existe un momento en que sea mejor perder un cliente que mantenerlo?, ¿en qué momento deja de ser un cliente rentable?.

Supongamos que tengo un cliente. Consigo venderle 3000 euros (con lo que sea, no importa). Mi coste de ejecución (o lo que tenía pensado imputar al coste que tuvo el producto, para amortizarlo) es 2000, y los otros 1000 son “ganancias”. ¿Todo bien, no?.

Lo primero que se nos olvida es que con esos 1000 euros tenemos que financiar nuestras labores comerciales, no son gratis. Pero no es eso lo que más nos puede preocupar, o al menos no lo que nos va a decir si es mejor perder un cliente que mantenerlo (aunque es un coste importante). Y es que lo que realmente va a decidir si un cliente es rentable o no es el tiempo que te consuma después de poner en marcha el proyecto/producto/solución.

Digamos que este cliente te llama casi todos los días, que siempre te tiene media hora al teléfono. 4 días x 30 minutos = 2 horas semanales. Nuestro precio/hora… por simplificar, 50 euros/hora, es decir, 100 Euros/semana, 400 Euros/mes. Mantener ese cliente me puede costar 400 euros/mes. Aunque le cobre un mantenimiento mensual de 400 Euros (que es difícil que sea, aunque no imposible), me esta consumiendo ese ingreso sólo en el teléfono. Es decir, las labores de mantenimiento de verdad se las estoy regalando, sea eso lo que sea. Ups. Y es que da igual lo que hagamos, producto, proyecto o servicio, deberíamos siempre saber lo que nos cuestan las cosas, desde que iniciamos el contacto hasta que el cliente nos deja (o nosotros le dejamos).

Oí decir a un profesor que lo que se mide se puede controlar, lo que se puede controlar se puede mejorar, y es que sin llegar a exagerar, deberíamos tener en cuenta que todo tiene un coste. No basta con no perder dinero, hay que ganarlo.

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

Linking Paths día a día

Cosas que nunca te dije.

Febrero 26th, 2007 - [Enlace local]

Imagina que tienes un cliente. Te llevas bien, hablas de muchas cosas, todo perfecto, demasiado perfecto. Hasta que las cosas no son como parecen (algo que casi siempre sucede). Te habla, le escuchas, le das tu opinión, te ignora, te vuelve a preguntas, se la vuelves a dar, entras, sales, dejas de entrar. Apuestas y estas dispuesto a hacer muchas cosas, sin embargo siempre se vuelve a lo mismo, por delante muy bien, por la espalda mejorable. Paciencia mútua, supongo, tampoco uno es un ángel ni está para dar reprimendas a nadie.

Hasta que un día te llama y lo que podía haber tenido regalado hace meses lo busca fuera (me imagino que pagando). Y lo primero que le dicen (o cree entender) es que PHP es mejor que Java para el SEO (toma ya, me suena a confundir java con javascript) y ves la lúz: yo lo dejo. Se pueden aceptar muchas cosas pero uno es mayorcito para tonterias. Mejor para todos.

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

Linked

Cosas que nunca te dije.

Febrero 26th, 2007 - [Enlace local]

Imagina que tienes un cliente. Te llevas bien, hablas de muchas cosas, todo perfecto, demasiado perfecto. Hasta que las cosas no son como parecen (algo que casi siempre sucede). Te habla, le escuchas, le das tu opinión, te ignora, te vuelve a preguntas, se la vuelves a dar, entras, sales, dejas de entrar. Apuestas y estas dispuesto a hacer muchas cosas, sin embargo siempre se vuelve a lo mismo, por delante muy bien, por la espalda mejorable. Paciencia mutua, supongo, tampoco uno es un ángel ni está para dar reprimendas a nadie.


Hasta que un día te llama y lo que podía haber tenido regalado hace meses lo busca fuera (me imagino que pagando). Y lo primero que le dicen (o cree entender) es que PHP es mejor que Java para el SEO (toma ya, me suena a confundir java con javascript) y ves la luz: yo lo dejo. Se pueden aceptar muchas cosas pero uno es mayorcito para tonterías. Mejor para todos.

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

.NET o no .NET, esa es la cuestión

La máquina virtual NET está podrida por dentro, 1

Febrero 26th, 2007 - [Enlace local]

Esto ya clama al cielo. Al que me contradiga me lo como con patatas. Estoy hasta los mismísimos del .NET. Así de claro, y dado que por aquí hay filtro de contenidos, la VM .NET es una p*t* m**rd* pinchada en un palo. Así de sencillo. Y lo voy a demostrar con esta serie de artículos. A ver si se espabilan de una vez. Y a ver si aprenden a hacer las cosas bien. [Por cierto, si convenzo a mi jefe voy a girar una factura de una mañana completa mía a Microsoft, por la pérdida de tiempo que me ha ocasionado esto].

 A ver. Tomemos el siguiente código en C#:

Retangle[] m_arrowsRect=null;
float
xx = m_toppersRect[iTopper].Width / m_bitmap.Width * k_originalArrows[0].X;
float yy = m_toppersRect[iTopper].Height / m_bitmap.Height * k_originalArrows[0].Y;
m_arrowsRect[0] =
new RectangleF(xx + k_originalArrows[0].X, yy + k_originalArrows[0].Y, m_arrows[0].Width, m_arrows[0].Height);
m_arrowsRect[1] =
new RectangleF(xx + k_originalArrows[1].X, yy + k_originalArrows[1].Y, m_arrows[1].Width, m_arrows[1].Height);
m_arrowsRect[2] =
new RectangleF(xx + k_originalArrows[2].X, yy + k_originalArrows[2].Y, m_arrows[2].Width, m_arrows[2].Height);
m_arrowsRect[3] =
new RectangleF(xx + k_originalArrows[3].X, yy + k_originalArrows[3].Y, m_arrows[3].Width, m_arrows[3].Height);

Compilemos con AnyCPU y ejecutemoslo dentro de un evento SizeChanged en de una ficha. Ejecutemos en un Vista x64. ¿Qué ocurre? Pues nada, que el código llega a la primera asignación de m_arrowsRect y termina la ejecución del método sin más, sin excepciones ni nada.

Ahora compilemos con x86. ¿Qué ocurre? Se lanza una excepción en la primera asignación de m_arrowsRect.

m_arrowsRect no es una variable local (aunque lo haya puesto aquí por simplicidad), sino un miembro de la ficha. Cuando llegamos a Paint, el valor siguie siendo nill, en AnyCPU la aplicación se ejecuta sin pintar la parte que se corresponde a m_arrowsRect, pero no peta. En x86 sí, como es lógico.

Sin comentarios. Mañana, más.

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

Navegapolis

¿Qué ha sido de NTeam?

Febrero 26th, 2007 - [Enlace local]

expediente xIndagar la pista de qué ha ocurrido con el proyecto NTeam parece un "expediente X". Era una alternativa open source a Microsoft Visual Studio Team System . En poco menos de un mes consiguió un equipo de nada menos que 38! personas, fue noticia en varios medios y aquí lo comentamos ... y siempre que intento seguirle la pista el mismo vacío: nada.

En el blog de su impulsor (Alan Stevens) no hay ni rastro. Ni mirando en las fechas en las que comenzaba el proyecto se encuentra un post sobre él. La página de SourceForge es una página fantasma: 38 desarrolladores, 2 años abierta y nada de nada, y buscando por la red: nada de por qué se ha parado.

¿Sabéis qué ha sido de este proyecto?

Blogalaxia Tags: NTeam Team+System Open+source desaparición

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

Información legal y técnica