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]
Esta 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):
- Getting Started with the Zend Framework
- Understanding the Zend Framework, Part 1
- Understanding the Zend Framework, Part 2
- Understanding the Zend Framework, Part 3
- Understanding the Zend Framework, Part 4
- Understanding the Zend Framework, Part 5
- Understanding the Zend Framework, Part 6
- Understanding the Zend Framework, Part 7
- Understanding the Zend Framework, Part 8
- Understanding the Zend Framework, Part 9
» 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.

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.
- 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 - 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:
- Los archivos con los datos de entrenamiento y de clasificación han de estar en formato ARFF.
» Leer más, comentarios, etc...
Navegapolis
Ideas de negocio
Febrero 27th, 2007 - [Enlace local]
Una 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.
» Leer más, comentarios, etc...
Navegapolis
Jornadas sobre testeo de software
Febrero 27th, 2007 - [Enlace local]
El 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.
» 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:
<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:
- Fresqui: vulnerable
- Menéame: al parecer no es vulnerable porque hace una conversión de formato al subir un avatar
ANWMPo cualquier sitio que tenga instalado Drupal y permita subir archivos: vulnerable- etc, etc.
No recomiendo un navegador en especial (usen Firefox!
), 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
- 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.
- Reconstruir la base de datos que necesita el sistema (subdirectorio "sql").
- 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.
- Diagrama de "Casos de Uso"
- Diagrama de "Paquetes" (presentación, dominio y persistencia)
- 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)
- ¿En qué parte del sistema se realiza "herencia"?
- ¿En alguna parte del sistema se usa "polimorfismo"?
- ¿Si tuviera que agregar otro tipo de usuario, como un Administrador, qué harÃa?
- 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:
- Google Docs - deberá realizar un documento "formal" con toda la información que se le solicita. Luego de finalizado, deberá compartir el documento con el Gerente de Proyectos. El documento deberá llamarse "semana2-nombredeusuario".
- Gliffy - se usará para hacer todos los diagramas UML, que luego deberá grabarlos en un archivo gráfico y agregarlos al documento base (punto anterior).
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]
Indagar 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?