Bloggingg
People under time pressure don’t work better; they just work faster
Octubre 31st, 2006 - [Enlace local]
Tom DeMarco & Timoty Lister
» Leer más, comentarios, etc...
Bloggingg
People under time pressure don’t work better; they just work faster
Octubre 31st, 2006 - [Enlace local]
Peopleware: Productive Projects and Teams,Tom DeMarco & Timoty Lister
» Leer más, comentarios, etc...
Najaraba.com: Software libre, negocios y más.
Arte e informática
Octubre 31st, 2006 - [Enlace local]
Hoy hablando con un compañero de trabajo, al que me he enterado que le gusta el diseño y las artes plásticas (echad un vistazo a su trabajo, muy interesante), he llegado a una exposición de arte que se realizó hace un año en la Facultad de Informática de San Sebastian: El Bosque Virtual. Una curiosa iniciativa. Para los que hemos pasado por ese insulso edificio es toda una alegrÃa ver el hall de
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
El verdadero valor de la metodologÃa
Octubre 31st, 2006 - [Enlace local]
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
El verdadero valor de la metodologÃa
Octubre 31st, 2006 - [Enlace local]
» Leer más, comentarios, etc...
Bloggingg
Peopleware: productive projects and teams
Octubre 31st, 2006 - [Enlace local]

La primera edición de este libro fue publicada en 1987, sus autores, Tom DeMarco y Timothy Lister hicieron de esta obra un best-seller y se convirtió en un clásico, doce años después se lanza la segunda edición de este revolucionario libro con ocho nuevos capÃtulos.
Sinceramente, es el libro de gestión de proyectos software más interesante que he leÃdo hasta el momento. Al igual que Ed Yourdon yo también recomendarÃa comprar una copia de este libro a tu jefe, y si ya eres jefe, entonces cómprale uno a cada miembro del departamento. Es una lectura obligada, te cambia la manera de pensar sobre la gestión de proyectos Software, después de leerlo parece como si aquà en España hiciésemos todo al revés, y todavÃa nos quedase muchÃsimo que aprender.
De Marco y Lister demuestran en esta obra que los mayores problemas en el desarrollo del software son humanos y no técnicos. Gestionar los recursos humanos en un proyecto de estas caracterÃsticas es muy diferente de gestionar personal de cualquier otro proyecto.
El trabajo de programador es un trabajo creativo, los desarrolladores no pueden estar bajo presión, deben de estar relajados y cómodos, en un espacio confortable y sin ruidos. Para DeMarco y Lister esto es fundamental, y para los más escépticos, incluso aportan pruebas de rendimiento demostrando estos hechos.
Destaca sobre todo, el contraproducente efecto de la práctica abusiva de las horas extras tan de moda en España, éstas acaban por quemar al programador que no dudará en fugarse en cuanto pueda. También asustan los gastos que conlleva reemplazar a un buen programador, por eso cualquier manager deberÃa evitar la fuga de los buenos talentos. Un buen jefe deberá mimar a sus empleados e invertir en ellos como una inversión, se supone que trabajar en su empresa ha de ser interesante y divertido, sólo de esta manera se sacarán los mejores resultados.
En definitiva, intentad leer este libro, y una vez que lo hayáis terminado regalárselo a vuestro jefe o a vuestros compañeros. Es de lectura obligada. Joel Spolsky afirma que todos los managers estarÃan obligados a leerlo... no sólo una vez, sino una al año.
Peopleware. Productive Projects and Teams.
Second Edition.
Tom DeMarco & Timothy Lister.
» Leer más, comentarios, etc...
Bloggingg
Peopleware: productive projects and teams
Octubre 31st, 2006 - [Enlace local]

La primera edición de este libro fue publicada en 1987, sus autores, Tom DeMarco y Timothy Lister hicieron de esta obra un best-seller y se convirtió en un clásico, doce años después se lanza la segunda edición de este revolucionario libro con ocho nuevos capÃtulos.
Sinceramente, es el libro de gestión de proyectos software más interesante que he leÃdo hasta el momento. Al igual que Ed Yourdon yo también recomendarÃa comprar una copia de este libro a tu jefe, y si ya eres jefe, entonces cómprale uno a cada miembro del departamento. Es una lectura obligada, te cambia la manera de pensar sobre la gestión de proyectos Software, después de leerlo parece como si aquà en España hiciésemos todo al revés, y todavÃa nos quedase muchÃsimo que aprender.
De Marco y Lister demuestran en esta obra que los mayores problemas en el desarrollo del software son humanos y no técnicos. Gestionar los recursos humanos en un proyecto de estas caracterÃsticas es muy diferente de gestionar personal de cualquier otro proyecto.
El trabajo de programador es un trabajo creativo, los desarrolladores no pueden estar bajo presión, deben de estar relajados y cómodos, en un espacio confortable y sin ruidos. Para DeMarco y Lister esto es fundamental, y para los más escépticos, incluso aportan pruebas de rendimiento demostrando estos hechos.
Destaca sobre todo, el contraproducente efecto de la práctica abusiva de las horas extras tan de moda en España, éstas acaban por quemar al programador que no dudará en fugarse en cuanto pueda. También asustan los gastos que conlleva reemplazar a un buen programador, por eso cualquier manager deberÃa evitar la fuga de los buenos talentos. Un buen jefe deberá mimar a sus empleados e invertir en ellos como una inversión, se supone que trabajar en su empresa ha de ser interesante y divertido, sólo de esta manera se sacarán los mejores resultados.
En definitiva, intentad leer este libro, y una vez que lo hayáis terminado regalárselo a vuestro jefe o a vuestros compañeros. Es de lectura obligada. Joel Spolsky afirma que todos los managers estarÃan obligados a leerlo... no sólo una vez, sino una al año.
Peopleware. Productive Projects and Teams.
Second Edition.
Tom DeMarco & Timothy Lister.
» Leer más, comentarios, etc...
MadeInFlex
ArrayCollection, ejemplo simple.
Octubre 31st, 2006 - [Enlace local]
El proovedor de datos por excelencia recomendado por Adobe en Flex 2 son los ArrayCollections. A continuación podeis ver un sencillo ejemplo que muestra como Flex no deja de ser en si mismo un sofisticado MVC donde podemos modificar la fuente de datos y gracias a la mágia del DataBinding ver la repercusión de estas acciones en la vista (que en este caso es un simple control de lista).
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
creationComplete="initAC()">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.controls.List;
[Bindable]
private var ac:ArrayCollection;
private var cont:Number;
private function initAC():void {
var arr:Array = ["Elemento 1", "Elemento 2", "Elemento 3"];
ac = new ArrayCollection(arr);
cont = ac.length;
}
private function insertItem(event:Event):void {
ac.addItem("Elemento " + (++cont));
}
private function deleteItem(event:Event):void {
if(list.selectedIndex != -1)
ac.removeItemAt(list.selectedIndex);
else
Alert.show("Selecciona un elemento de la lista");
}
private function updateItem(event:Event):void {
if(list.selectedIndex != -1)
ac.setItemAt("Modificado", list.selectedIndex);
else
Alert.show("Selecciona un elemento de la lista");
}
]]>
</mx:Script>
<mx:List dataProvider="{ac}" id="list"/>
<mx:Button label="Insertar" click="insertItem(event)"/>
<mx:Button label="Borrar" click="deleteItem(event)"/>
<mx:Button label="Modificar" click="updateItem(event)"/>
</mx:Application>
» Leer más, comentarios, etc...
mundoxbase.info
Nueva revisión de Fwh 2.8
Octubre 31st, 2006 - [Enlace local]
Fivetech acaba de sacar una nueva construcción de su afamada librerÃa GUI para Windows. Esta revisión añade nuevas funcionalidades y corrige algunos errores.
Construcción Octubre 2006
===================
* Mejora: En FWH, el método GoBottom() de la clase TMGet ahora desliza el control get multilÃnea, asà que el texto más abajo queda visible.
* Mejora: Pequeñas correcciones en el método Paint() de la clase TGet.
* Corrección: La función TVSETITEMTEXT() daba errores de GPF. Ahora está bien.
* Nuevo: Ejemplo de un “simple” terminal ASCII funcionando, programa desarrollado por Enrico M. Giordano. El ejemplo lo puedes encontrar en
samples\Terminal.prg.
* Mejora: En la clase TTreeView, se pone correctamente el color de fondo de los items cuando se utliza la clausula COLOR
* Corrección: En las clases TTreeView y TTVItem el método Colapse ha sido renombrado a Collapse.
* Mejora: La clase TXBrowse procesa
* Nuevo: Se ha implementado el comando @
* Mejora: El método KeyDown() de la clase TXBrowse procesa correctamente el bloque de código bkeyDown.
* Mejora: Se ha modificado el ejemplo samples\TestSay2.prg para mostrar como cambiar el color de un SAY una vez que se ha pulsado sobre el.
* Mejora: Pequeños cambios sobre la clase TDbOdbcDirect.
* Nuevo: Nuevo método AEvalWhen() en la clase TToolBar para evaluar todos los botones de la barra de herramientas.
* Corrección: Pequeqas correcciones en la funcisn MsgInfo() y las funciones similares Msg… cuando visualizan una fecha usando xHarbour.
* Corrección: Pequeqa corrección sobre la clase TWBrowse cuando se usa lCellStyle como “.T.” y un bloque de código como color de fondo.
* Corrección: En FWPPC, la función GetWindowText() estaba corrompiendo la memoria del Pocket PC. Ahora funciona correctamente.
* Corrección: Pequeqa corrección en el mitodo New() de la clase TReport cuando el dispositivo no esta definido.
* Mejora: Se ha mejorado mucho el manejo de la memoria en FWPPC.
* Mejora: FWH es completamente compatible con el código de los CVSs de Harbour y xHarbour, tanto para Borland como Microsoft.
* Mejora: En FWPPC, debido a la sincronización con los recientes CVSs, el flag -TP no es necesario en el fichero buildce.bat. Por favor actualiza
tus ficheros make. IMPORTANTE: Tienes que reconstruir todos tus PRGs. Ahora se usa GTGUI.lib en vez de GTWIN.lib.
* Mejora: FWH es totalmente compatible con xHarbour Builder de Octubre de 2006.
» Leer más, comentarios, etc...
Najaraba.com: Software libre, negocios y más.
PHP on Rails: Code Igniter
Octubre 31st, 2006 - [Enlace local]
» Leer más, comentarios, etc...
Najaraba.com: Software libre, negocios y más.
PHP on Rails: Code Igniter
Octubre 31st, 2006 - [Enlace local]
Cuando me he puesto a hacer aplicaciones en PHP echaba de menos mis controladores, filtros, vistas y cada cosa en su sitio de Struts en la plataforma J2EE. Luego vi como Rails implementaba el MVC de una manera elegante y sencilla. y ahora he descubierto Code Igniter para PHP. Por lo que he visto es algo asà como el framework MVC de Rails, pero para PHP. Code Igniter es un framework sencillo, que
» Leer más, comentarios, etc...
programania
Spring 2.0 Annotations
Octubre 31st, 2006 - [Enlace local]
Hace tiempo que me he ausentado, pero ha sido en contra de mi voluntad , ya que otros menesteres me han retenido aunque al fin estoy de vuelta y con más fuerza que nunca.
Me ha dado tiempo a leer una noticia que ha hecho que la alegrÃa perle mi faz, Spring tiene annotations para los retractores del XML y para usarlas sólo hace falta la JDK 1.5 y la librerÃa spring.jar.
Sabéis que soy amante de demostrar el movimiento andando asà que vamos directamente al grano:
@Bean(name = “test”)
public class TestObject {
public void printName() {
System.out.println(”No Name, just an example”);
}
}
Declaramos un bean en el contexto de Spring con la annotation @Bean.
@Bean(name=”main”)
public class Main {
private TestObject test;
/**
* this method should be called from spring to set the variable to the other bean in the context which has the name set to test
* @param test
*/
public void setTest(TestObject test) {
this.test = test;
}
public static void main(String[] args){
TOAnnotationXmlApplicationContext appctx = new TOAnnotationXmlApplicationContext(”classpath*:applicationContext.xml”);
Main m = (Main) appctx.getBean(”main”);
m.test.printName();
}
Esta parte es algo más compleja ya que a parte de declarar un bean en el contexto de Spring hacemos inyeccion de dependencias a través del nombre del bean, es decir, Spring detecta que existe en el bean Main una propiedad de una clase creada previamente (TestObject) llamada test (como el bean creado anteriormente) asà que automáticamente lo inyecta. Bonito ¿verdad?
El XML quedarÃa asÃ:
El XML se reduce a la mÃnima expresión. Lo único malo de las annotations es que ligan nuestra aplicación al container de Spring asà que en mi caso no las recomiendo para la aplicación final pero si para desarrollar rápidamente un prototipo el XML ya se hará más tarde. También tengo que comentar que Spring 2.0 soprta annotations para crear Aspectos con AspectJ y para manejar transacciones de manera declarativa, osea, que el que lo desee puede decir adiós al XML.
Para los que quieran indagar más la Url es:
https://spring-annotation.dev.java.net
No Tags» Leer más, comentarios, etc...
Vivir del Software
Financiación: ¿cuanto necesito?
Octubre 31st, 2006 - [Enlace local]
Esta es una pregunta difÃcil. Cuanto necesitamos depende de nosotros mismos, pero tendrÃamos que tener claro cuanto necesitamos para saber si lo que ganamos es suficiente para vivir de esto, que es nuestro objetivo. Esto no quiere decir que desde el primer mes vayamos a ganar dinero o frustrarnos si no lo conseguÃmos. Lo que tenemos que saber es cuanto necesitamos para saber que tal nos va y tomar decisiones al respecto, sea lo que sea.
Continua leyendo "Financiación: ¿cuanto necesito?"
» Leer más, comentarios, etc...
Cómo convertir una IP en formato texto a su valor numérico
Octubre 31st, 2006 - [Enlace local]
En un boot de Windows CE, de cuyo nombre no me dejan acordarme, no ha mucho tiempo tuve que realizar un parser de una IP en formato texto a valor númerico, sin biblioteca en tiempo de ejecución, depurador y sin cualquiera otra extensión. Limitado a un espacio de 128K con todo incluÃdo, arranque, asignación de memoria, inicio de red las más noches, carga sobre SD los sábados…
Bueno, tras este homenaje al insigne escritor español, vuelvo a empezar.
Es cosa interesante esta de los sistemas de arranque, con todas sus limitaciones, tanto a la hora de desarrollarlos como a la de depurarlos. Windows CE lleva un modelo de arranque en tres etapas. La primera la suministra el fabricante del microprocesador y la implementa el ingeniero de hardware. Normalmente va integrada dentro de la propia flash del micro y apenas tiene código para buscar el dispositivo de arranque real. Vamos, que es como una BIOS.
Luego está el fichero llamado "eboot.nb0", que se situa sobre el almacenamientos secundario (una tarjeta Secure Digital en mi caso, en otros un disco duro, un CD o una ROM). Este fichero es lanzado por la BIOS (para entendernos), y serÃa el equivalente al arranque de un XP. En el CE estamos limitados a 128 KB de tamaño, en el que tenemos que embutir como podamos todo lo necesario para arrancar la máquina. Luego ese fichero termina llamando a NK.BIN, que realmente es el sistema operativo, almacenado en una imagen con el nombre descrito.
En el caso que nos ocupa, el "eboot.nb0" ha de inicializar la RAM y su correspondiente MMU, los puertos serie, la tarjeta de red (puesto que existe la opción de conectar el Platform Builder en lugar de arrancar el sistema operativo desde la placa), el puerto paralelo si lo hubiera, el pcmcia y los sistemas de ficheros básicos. Y sorprendentemente, todo eso apenas ocupa 80K de código.
Este "eboot.nb0" lo suministra el fabricante del chip, aunque todos terminan tomando el modelo de Microsoft, que viene de la época del MS-DOS y apenas ha evolucionado. Y el fabricante te da unas especificaciones, y si quieres otras, pues te toca meterle mano a ese código.
Aunque existe un depurador para ello, no es habitual disponer de él, por lo que te las tienes que ingeniar. Normalmente este fichero saca un montón de información por puerto serie… una vez que has conseguido poner dicho puerto serie en marcha, por lo que si lo que vas a modificar no tiene que ver con el hardware de la máquina, pues lo mejor es hacerte un proyecto en el PC simulando lo mejor que puedas la tarea, y luego copiar el código y rezar para que no tenga demasiados bugs.
En mi caso el fabricante suministra la conexión con el Platform Builder mediante DHCP, y si tienes un dispositivo sin pantalla (como es mi caso), la cosa se puede volver muy, pero que muy interesante, pues estás poco menos que ciego. Por ello decidà cambiar el boot de DHCP a IP estática, IP que vendrÃa indicada en un fichero de texto ASCII con el formato habitual de "aaa.bbb.ccc.ddd".
Pero eso suponÃa el tener que convertir dicha cadena, una vez cargada de SD mediante una serie de funciones un tanto barrocas, a un unsigned int, que es el formato que realmente entiende el ordenador. El mayor problema es que no disponemos de nada, apenas de lo que el fabricante haya incluÃdo en ese fichero. Por suerte la función atoi sà que está implementada…
Otro problema es localizar dónde cambiarla o asignarla, aunque no vamos a entrar en él, la cosa puede convertirse en una búsqueda interesante, entretenida, forzosamente desesperante y tendente al suicidio. Pero supongamos que hemos descubierto el lugar correcto y sabemos cómo hacerlo. Sólo nos queda realizar la conversión.
En ip tendremos el valor final de la IP convertida, y en ucAsciiIP, el valor original en formato texto. El código es el siguiente:
UCHAR ucAsciiIP,*ptemp;
unsigned long ip=0;
int i,j=0;ptemp=ucAsciiIP;
for(i=0;i<4;i++)
{
ptemp=&ptemp[j];
if(i<3)
{
j=0;
while(ptemp[j]!=’.’)
j++;
ptemp[j]=0;
}
ip+=atoi(ptemp)<<(i*8);
j++;
}
Aunque el pedazo de código pueda parecer lioso, es muy sencillo. Vamos buscando los puntos y sustituyéndolos por un cero; luego la cadana anterior contiene el número correspondiente entre 0 y 255 en formato ASCII. La llamada a atoi realiza la conversión, y volvemos a iterar. El condicional que compara si i es menor que tres está porque el último número ya tiene su terminador nulo.
De esta forma hemos realizado un parser de IPs compacto, rápido y que sólo utiliza una función de la biblioteca de tiempo de ejecución. La implementación de atoi es trivial, y la dejamos para ejercicio del lector.
Una ventaja importante de este código es que la IP en formato cadena no tiene que tener un formato fijo, sino que valores como "192.168.2.1", "133.5.4.6" o "1.3.5.5" son perfectamente válidos y parseables.
» Leer más, comentarios, etc...
Buayacorp
Evasión del filtro anti-phising en Firefox 2.0
Octubre 31st, 2006 - [Enlace local]
Al parecer la última versión de Firefox 2 hace una validación sencilla para comprobar si un sitio es falso o no.
Por ejemplo, al entrar a la siguiente dirección se muestra la advertencia indicando que es un sitio fraudulento: http://200.119.135.99/ebay/login5878/
Sin embargo, al ingresar a la misma dirección pero con el IP en formato hexadecimal, ya no aparece tal advertencia: http://0xc8.0x77.0x87.0x63/ebay/login5878/
Fuente: http://ha.ckers.org/
» Leer más, comentarios, etc...
Buayacorp
Más sobre validación de datos en PHP
Octubre 30th, 2006 - [Enlace local]
Como habÃa mencionado anteriormente, para desarrollar aplicaciones seguras, hay que conocer bien la herramienta o lenguaje con el que se trabaja. Espero que estos pequeños quiz intenten mostrar algunas de las fallas más comunes que cometen los que recién empiezan o ya desarrollan con PHP.
El código mostrado a continuación, ¿tiene alguna falla? ¿cuál?
<?php if ( empty( $_GET['user'] ) && empty( $_POST['user'] ) ) { die( 'Bad parameter' ); } if ( ( empty( $_GET['user'] ) && intval( $_GET['user'] ) < 0 ) || ( empty( $_POST['user'] ) && intval( $_POST['user'] ) < 0 ) ) { die ( 'Bad parameter' ); } $sql = 'SELECT id, name, email FROM users WHERE id = ' . mysql_real_escape_string($_REQUEST['user']); echo $sql; ?>
Como ya saben, el código mostrado sólo es referencial, pero vale comentar la forma correcta de implementar ese pedazo de código.
» Leer más, comentarios, etc...
MadeInFlex
[Transient] Metadata tag
Octubre 30th, 2006 - [Enlace local]
Sin ningún tipo de duda una de las cosas más elegantes que tiene AS3 es el sistema de metadata asociado al código que permite resolver de forma fácil y elegante aspectos bastante complejos de resolver por otros medios.
Uno de los metatags que más me gusta es [Transient], el cual paradójicamente no viene documentado en la ayuda. Cuando trabajamos con VO's compartidos entre cliente y servidor mediante el metatag [RemoteClass] ya sea sobre AMF0 o AMF3, podemos tener VO's con propiedades presentes en el lado cliente pero que no queremos hacer llegar al servidor.
Por ejemplo, imaginemos la siguiente clase:
package {
[RemoteClass(alias="com.mif.vos.DomainVO")]
public class DomainVO {
public var list:Array;
private var _list:ArrayCollection;
public function get listAC ():ArrayCollection
{
if (_list == null)
{
_list = new ArrayCollection (list);
}
return _list;
}
public function set listAC (listAC:ArrayCollection):void
{
this._list = listAC;
}
}
}
Esta clase al serializarse para ser mandada al server sobre AMF-X tendrÃa dos propiedades list (propiedad pública) y listAC (getter / setter). Pero listAC es una propiedad que no se deberÃa pasar al servidor, ya que sus datos son los mismos que los de list, pero enmascarados en un ArrayCollection (p.e para aplicar vistas, filtros o bindings).
Para evitar la serialización de esta propiedad basta con ponerle el metatag [Transient].
package {
[RemoteClass(alias="com.mif.vos.DomainVO")]
public class DomainVO {
public var list:Array;
private var _list:ArrayCollection;
[Transient]
public function get listAC ():ArrayCollection
{
if (_list == null)
{
_list = new ArrayCollection (list);
}
return _list;
}
public function set listAC (listAC:ArrayCollection):void
{
this._list = listAC;
}
}
}
» Leer más, comentarios, etc...
MadeInFlex
The Flexifier
Octubre 30th, 2006 - [Enlace local]
¿Quieres probar Flex sin tener que descargar ni instalar nada?. Si ese es tu caso estás de enhorabuena ya que Ben Forta, Ray Camden y Ted Patrick han creado el Flexifier. Esta curiosa web te permite escribir cualquier ejemplo o código Flex y seguidamente pulsar el botón "Try it" para ver el resultado al instante.
» Leer más, comentarios, etc...
knocte :: MonoTema
Firefox 2.0 e Internet Explorer 7.0
Octubre 30th, 2006 - [Enlace local]
Mucho se ha hablado ya en internet sobre estas dos nuevas versiones de los navegadores más usados. Yo no voy a dar más el coñazo contando lo mismo, pero sà voy a dar mi opinión sobre ello. En primer lugar, me parece genial que Microsoft se haya puesto las pilas y haya decidido mejorar un software que, a pesar de su monopolio y su uso masivo, llevaba más de 5 años sin actualizarse, provocando asÃ
» Leer más, comentarios, etc...
Spejman's Blog
Actualizar Ubuntu Dapper a Edgy Eft
Octubre 30th, 2006 - [Enlace local]
Para actualizar Ubuntu de Dapper a Edgy Eft tenemos que ejecutar los siguientes comandos:
1. Cambiamos los repositorios de dapper a edgy:
sudo sed -e 's/dapper/edgy/g' -i /etc/apt/sources.list
2. Actualizamos las listas de paquetes:
sudo apt-get update
3. Pasamos de Dapper a Edgy Eft ( esto tardará un ratito ... )
sudo apt-get dist-upgrade
» Leer más, comentarios, etc...
La luna ilumina por igual a culpables e inocentes
Combinando el modo grabar/reproducir con el modo API de código de Selenium
Octubre 30th, 2006 - [Enlace local]
Selenium (http://www.openqa.org/) es una herramienta open-source estupenda para realizar pruebas de sistema / aceptación de aplicaciones web. Selenium incluye una herramienta que se integra con Firefox y que permite grabar todo lo que hagamos con Firefox, guardarlo en un archivo, y reproducirlo después. Además, Selenium también incluye la posibilidad de escribir nuestras pruebas directamente en Java, C#, Python y Ruby.
Para un proyecto real, estábamos muy interesados en utilizar Selenium y su herramienta para grabar / reproducir pruebas. Sin embargo, querÃamos hacer dos cosas que no se pueden hacer con la filosofÃa de grabar / reproducir: la primera es añadir código adicional que compruebe el estado de la aplicación y el estado de la base de datos y la segunda ejecutar todas las pruebas grabadas automáticamente cada cierto tiempo.
Por suerte el código de una prueba cuando se graba es muy similar al código que habrÃa que escribir en un lenguaje, por ejemplo en Java o CSharp. A continuación incluyo el código de una sencilla prueba
Código 1. Prueba grabada con Firefox.
class NewTest
def test_foo
open "/links_jsp/Default.jsp"
assertTitle "Links"
clickAndWait "//a[contains(@href, 'LinkNew.jsp')]"
assertTitle "Links"
type "name", "Prueba"
type "link_url", "Prueba"
type "description", "URL de prueba"
clickAndWait "//input[@value='Insert']"
assertTitle "Links"
end
end
Código 2. Prueba escrita en Java
import com.thoughtworks.selenium.*;
import junit.framework.*;
public class Selenium_InsertarEnlace extends TestCase {
private Selenium sel;
public void setUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http:/localhost:8080");
sel.start();
}
public void testInsertarEnlace() {
sel.open("/links_jsp/Default.jsp");
assertEquals("Links", sel.getTitle());
sel.click("//a[contains(@href, 'LinkNew.jsp')]");
sel.waitForPageToLoad("5000");
sel.type("name", "Prueba");
sel.type("link_url", "Prueba");
sel.type("description", "URL de prueba");
sel.click("//input[@value='Insert']");
sel.waitForPageToLoad("5000");
assertEquals("Links", sel.getTitle());
}
public void tearDown() {
sel.stop();
}
public static void main(String[] args) {
junit.textui.TestRunner.run(new TestSuite(Selenium_InsertarEnlace.class));
}
}
Código 3. Prueba escrita en CSharp
using Selenium;
using NUnit.Framework;
namespace MyTests {
[TestFixture]
public class Selenium_InsertarEnlace {
private ISelenium sel;
[SetUp]
public void SetUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http:/localhost:8080");
sel.Start();
}
[Test]
public void testGoogle() {
sel.Open("/links_jsp/Default.jsp");
Assert.AreEqual("Links", sel.getTitle());
sel.Click("//a[contains(@href, 'LinkNew.jsp')]");
sel.WaitForPageToLoad("5000");
sel.Type("name", "Prueba");
sel.Type("link_url", "Prueba");
sel.Type("description", "URL de prueba");
sel.Click("//input[@value='Insert']");
sel.WaitForPageToLoad("5000");
Assert.AreEqual("Links", sel.getTitle());
}
[TearDown]
public void TearDown() {
sel.stop();
}
}
}
Para ejecutar la prueba en Java, es necesario tener en ejecución el servidor de Selenium ("java -jar selenium-server.jar") y tener en el PATH la ruta a Firefox. Al ejecutar la prueba en Java (necesitamos "selenium-java-client-driver.jar") se abrirá una nueva instancia del Firefox y, en la salida estándar veremos el resultado de la prueba. La prueba en CSharp no la hemos ejecutado, pero deberÃa ser igual de sencillo.
Ahora es posible añadir a la prueba todas las comprobaciones adicionales que queramos como, por ejemplo, conectar con la BBDD para asegurarnos que el enlace está ahÃ.
Estamos escribiendo un sencillo script para traducir automáticamente el código de una prueba capturada a código Java. Si alguien está interesado no tiene más que escribirme.
» Leer más, comentarios, etc...
La luna ilumina por igual a culpables e inocentes
Combinando el modo grabar/reproducir con el modo API de código de Selenium
Octubre 30th, 2006 - [Enlace local]
Saludos.
Selenium (http://www.openqa.org/) es una herramienta open-source estupenda para realizar pruebas de sistema / aceptación de aplicaciones web. Selenium incluye una herramienta que se integra con Firefox y que permite grabar todo lo que hagamos con Firefox, guardarlo en un archivo, y reproducirlo después. Además, Selenium también incluye la posibilidad de escribir nuestras pruebas directamente en Java, C#, Python y Ruby.
Para un proyecto real, estábamos muy interesados en utilizar Selenium y su herramienta para grabar / reproducir pruebas. Sin embargo, querÃamos hacer dos cosas que no se pueden hacer con la filosofÃa de grabar / reproducir: la primera es añadir código adicional que compruebe el estado de la aplicación y el estado de la base de datos y la segunda ejecutar todas las pruebas grabadas automáticamente cada cierto tiempo.
Por suerte el código de una prueba cuando se graba es muy similar al código que habrÃa que escribir en un lenguaje, por ejemplo en Java o CSharp. A continuación incluyo el código de una sencilla prueba
Código 1. Prueba grabada con Firefox.
class NewTest
def test_foo
open "/links_jsp/Default.jsp"
assertTitle "Links"
clickAndWait "//a[contains(@href, 'LinkNew.jsp')]"
assertTitle "Links"
type "name", "Prueba"
type "link_url", "Prueba"
type "description", "URL de prueba"
clickAndWait "//input[@value='Insert']"
assertTitle "Links"
end
end
Código 2. Prueba escrita en Java
import com.thoughtworks.selenium.*;
import junit.framework.*;
public class Selenium_InsertarEnlace extends TestCase {
private Selenium sel;
public void setUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http:/localhost:8080");
sel.start();
}
public void testInsertarEnlace() {
sel.open("/links_jsp/Default.jsp");
assertEquals("Links", sel.getTitle());
sel.click("//a[contains(@href, 'LinkNew.jsp')]");
sel.waitForPageToLoad("5000");
sel.type("name", "Prueba");
sel.type("link_url", "Prueba");
sel.type("description", "URL de prueba");
sel.click("//input[@value='Insert']");
sel.waitForPageToLoad("5000");
assertEquals("Links", sel.getTitle());
}
public void tearDown() {
sel.stop();
}
public static void main(String[] args) {
junit.textui.TestRunner.run(new TestSuite(Selenium_InsertarEnlace.class));
}
}
Código 3. Prueba escrita en CSharp
using Selenium;
using NUnit.Framework;
namespace MyTests {
[TestFixture]
public class Selenium_InsertarEnlace {
private ISelenium sel;
[SetUp]
public void SetUp() {
sel = new DefaultSelenium("localhost",
4444, "*firefox", "http:/localhost:8080");
sel.Start();
}
[Test]
public void testGoogle() {
sel.Open("/links_jsp/Default.jsp");
Assert.AreEqual("Links", sel.getTitle());
sel.Click("//a[contains(@href, 'LinkNew.jsp')]");
sel.WaitForPageToLoad("5000");
sel.Type("name", "Prueba");
sel.Type("link_url", "Prueba");
sel.Type("description", "URL de prueba");
sel.Click("//input[@value='Insert']");
sel.WaitForPageToLoad("5000");
Assert.AreEqual("Links", sel.getTitle());
}
[TearDown]
public void TearDown() {
sel.stop();
}
}
}
Para ejecutar la prueba en Java, es necesario tener en ejecución el servidor de Selenium ("java -jar selenium-server.jar") y tener en el PATH la ruta a Firefox. Al ejecutar la prueba en Java (necesitamos "selenium-java-client-driver.jar") se abrirá una nueva instancia del Firefox y, en la salida estándar veremos el resultado de la prueba. La prueba en CSharp no la hemos ejecutado, pero deberÃa ser igual de sencillo.
Ahora es posible añadir a la prueba todas las comprobaciones adicionales que queramos como, por ejemplo, conectar con la BBDD para asegurarnos que el enlace está ahÃ.
Estamos escribiendo un sencillo script para traducir automáticamente el código de una prueba capturada a código Java. Si alguien está interesado no tiene más que escribirme.
» Leer más, comentarios, etc...
MadeInFlex
Introducción a Web Services con .NET y FLEX
Octubre 30th, 2006 - [Enlace local]
Los Web Services o servicios web por su traducción al español son aplicaciónes que nos permiten el intercambio de datos por XML.La virtud de estos radica en que cualquier aplicación puede consumirlos , es decir si el servicio web esta contruido bajo .NET, Java, PHP, CFML , cualquier cliente que use estas tecnologÃas puede consumirlo lo que lo hace multiplataforma y sobre todo muy portable.
La base de los Web Services para el intercambio de datos es SOAP (Simple Object Access Protocol), el cual es usado a menudo para intercambiar información entre las operaciones del Web Service, además usa XML para codificar las llamadas de RPC (Remote Procedure Calls).
También existe WSDL(Web Service Definition Language) que no es mas que la descripción de los mensajes y de los tipos de mensajes que el Web Service recibirá o enviara, en concreto WSDL nos dice que métodos podemos consumir, asà como lo que debemos de enviar y recibir, además nos puede presentar una descripción de funcionalidad de estos métodos.
Descarga e instalación de las herramientas
Primero que nada debemos contar con las herramientas de desarrollo necesarias para nuestro pequeño tutorial. Para poder ejecutar aplicaciones elaboradas en .Net 2.0 requerimos descargar el .NET Framework 2.0 redistribuible.
Posteriormente debemos obtener el Visual Web Developer 2005 Express y SqlServer 2005 Express Edition descargables aquÃ. Visual Web Developer 2005 o VWD es una herramienta de desarrollo para aplicaciones web (ASP.net o Web Services) enfocada a estudiantes, desarrolladores nuevos o a alguien que quiere aprender esta tecnologÃa y SqlServer 2005 Express Edition es una versión de sqlserver 2005 a menor escala y muy eficiente para desarrollos personales (si cuentas con Microsoft Access no es necesario que descargues SqlServer Express) lo mejor de todo es que estas herramientas son totalmente gratuitas como lo son todas las Express Editions de Microsoft.
Por último descargaremos Flex Builder de http://www.adobe.com/downloads/
Nota: Algo importante y de mucha flexibilidad es que no es necesario contar con Windows XP professional o 2000 o 2003 server que cuentan con IIS(Internet Information Services que es el servidor de http de Microsoft), ya que si estas trabajando bajo Windows XP Home Edition , Visual Web Developer Express edition cuenta con su propio servidor de HTTP, en pocas palabras no hay mas impedimento para empezar a desarrollar.
Una vez instaladas las herramientas empecemos a generar nuestro Web Service.
Creación de Web Services en .NET.
Abramos Visual Web Developer Express edition y seleccionemos Archivos>Nuevo Sitio Web y seleccionemos la opción servicio web ASP.NET, después especifiquemos donde queremos guardar los archivos y por último seleccionemos el lenguaje en el que vamos a desarrollar. En este caso lo haremos con C# pero también se puede desarrollar con VisualBasic.NET
Creación de Web Service ASP.NETDemos clic en aceptar y automáticamente Visual Web Developer nos genera una plantilla automática de un Web Service. Ahora exploremos brevemente lo que se nos presenta en pantalla.
Vista de código de Web ServicePrimeramente tenemos el código en la parte central, esto es lo que VWD nos genera automáticamente en C# para empezar a crear nuestros Web Services.

Este archivo se encuentra dentro de la carpeta App_Code de nuestro proyecto, inicialmente se llama Service.cs, noten que la extensión hace referencia al lenguaje que esta escrito, si estuviera en vb.net seria Service.vb
También se encuentra un archivo a nivel del proyecto llamado Service.asmx, este archivo con esa extensión (asmx) es la de un Web Service construido en .net y Visual Web Developer lo crea de igual manera por nosotros.
Ahora enfoquémonos en la parte importante que es el código.
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://tempuri.org")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
//Eliminar la marca de comentario de la lÃnea siguiente si utiliza los componentes diseñados
//InitializeComponent();
}
[WebMethod (Description="Método que me devuelve la cadena hola a todos")]
public string HelloWorld() {
return "Hola a todos";
}
}
Esté es un método que ha sido creado por VWD para nosotros y si queremos hacer una comparación, ¡se parece mucho a actionscript!, en la lÃnea 17 quiere decir que es un método Web, esto es muy importante ya que cada vez que queramos generar un método nuevo debemos escribir una lÃnea idéntica a [Webmethod]
La siguiente lÃnea es una función pública llamada “HelloWorldâ€? que lo que me regresará es una cadena y en la lÃnea 19 la cadena correspondiente “Hola a todosâ€?. Si el modificador de acceso lo ponemos como private no funcionara, solo el Web Service en si mismo podrÃa consumir este método private y no asà para el consumidor en general.
Ahora es tiempo de probar como se ve mi Web Service en el navegador. Para esto nos dirigiremos al botón de iniciar depuración.

Iniciar depuración
o presionando la tecla F5. Nos aparecerá una leyenda si deseamos agregar un archivo web.config con la depuración habilitada, seleccionemos la opción aceptar

Agregar archivo de configuración
Noten que en la parte inferior izquierda aparece habilitado y trabajando nuestro servidor de desarrollo de ASP.NET , aquà es donde trabajaremos continuamente en este tutorial.

Servidor de ASP.NET
Posteriormente me aparece mi navegador predeterminado y vemos nuestro Web Service con el método “HelloWorld�

Web Service en Navegador
Está página que podemos observar listará todos los métodos disponibles que yo construya en mi Web Service de una manera que se pueda leer fácilmente y humanamente posible, ya que si damos clic en la descripción de servicios me desplegara el archivo WSDL que no es nada fácil entender y leer.

Web Service Definition Language
Ahora copiaremos la dirección del archivo WSDL de nuestro Web Service que se encuentra en la barra de direcciones del Navegador,o la anotaremos en algún lado ya que esta la ocuparemos posteriormente para hacer el llamado al Web Service desde FLEX.
Por el momento no nos importa y seguramente en muchas ocasiones no tendremos que lidiar con este archivo. Lo que haremos ahora es regresar a nuestro Service.asmx y daremos clic en el método “HelloWorld�

Web Service en Navegador
Enseguida nos aparece el nombre del método y un botón de invocar para probar nuestro Web Service. Demos clic en el botón y nos aparecerá el resultado de haber invocado nuestro método “HelloWorld�

Web Service que me regresa una cadena
Esto quiere decir que hemos ejecutado con éxito el método “HelloWorld� de nuestro Web Service. Detengamos la depuración por el momento regresando al entorno de desarrollo de VWD presionando el siguiente botón:

Detener depuración
Nota:
Si estas usando Internet Explorer, cuando cierras el navegador la depuración se detiene automáticamente y regresamos al ambiente de desarrollo.
El navegador se cerrara y por el momento debemos de hacer algunas consideraciones antes de poner esto en un servidor de producción.
Es importante que en ambientes de producción se cambie el espacio de nombres (Namespace) al nombre de dominio donde se publicara por ejemplo http://www.madeinflex.com, pero para ambientes de desarrollo y pruebas lo podemos dejar de esta manera (http://tempuri.org).No menos importante es asignar un atributo de descripción al Web Service, además agregaremos tambien un atributo de descripción a nuestro método “HelloWorld�, por lo consiguiente nos acostumbraremos a dar una descripción breve pero muy informativa acerca de nuestros métodos.
En resumen , cambiemos el espacio de nombres (Namespace), asignemos atributos de descripcion tanto al Web Service como al método "HelloWorld" como se puede apreciar en el código:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://www.madeinflex.com/",
Description="Servicio web proporcionado por el equipo de madeinflex")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
//Eliminar la marca de comentario de la lÃnea siguiente si utiliza los componentes diseñados
//InitializeComponent();
}
[WebMethod (Description="Método que me devuelve la cadena hola a todos")]
public string HelloWorld() {
return "Hola a todos";
}
}
Una vez concluido esto podemos empezar a consumir nuestro método desde FLEX.
Consumir un Web Service desde FLEX
Bien ahora vayamos a FLEX y abramos Flex Builder. Enseguida dirijamonos a File>New>Mxml Application

Creación de aplicación en FLEX
Enseguida nos aparecerá el siguiente asistente que nos ayudará a configurar la aplicación.
Tenemos 3 tipos de proyectos , el primero es el que ocuparemos para conectar FLEX con nuestro Web Service, el segundo es para acceder a datos mediante coldfusion y flash remoting, y por último flex data services (FDS) que requiere de un servidor Java para aplicaciones mas robustas por ejemplo data pushing, colaboración en tiempo real etc. Si quieren saber más acerca de Flex Data Services den un vistazo al artÃculo que Carlos público aquÃ

Asignación de nombre de proyecto en FLEX
Damos clic en siguiente y ahora asignamos un nombre de proyecto, en este caso se llamara mifwebservice, puedes llamarlo como tu quieras y damos clic en finalizar.

Boton finalizar para comenzar proyecto FLEX
Enseguida nos aparecerá la vista en código en la parte central y en la parte superior izquierda el nombre del proyecto con los archivos. Ahora vamos a cambiarnos a la vista de diseño dando clic en el botón design que se encuentra arriba de mi código MXML.
Al dar clic en design la perspectiva cambia y ahora estamos en modo de diseño. Para este tutorial arrastraremos 2 componentes, un botón y un label. Estos componentes se encuentran del lado izquierdo justo debajo de donde se encuentra el panel de navegación.
Arrastraremos un botón al área de trabajo y le asignaremos la etiqueta “LLamar a web service de .NET� dirigiendonos al panel de common que se encuentra del lado derecho como se muestra en la figura.

Asignar etiqueta a botón
Ahora volveremos a cambiar la vista y nos pasaremos a la perspectiva de código dando clic en source. En nuestro código MXML tenemos dos etiquetas una de un botón y una de una etiqueta. Lo que queremos es que al dar clic al botón mande llamar a nuestro Web Service y el control de etiqueta nos despliegue el mensaje “Hola a todos�.
Lo primero que vamos a hacer es crear una etiqueta de tipo webservice asignándole un id y diciéndole donde es la dirección del Web Service o mejor dicho del WSDL que anotamos con anterioridad, si no recordamos cual es nuestra dirección WSDL regresemos a VWD y presionemos F5, posteriormente daremos clic en descripción de servicios y copiaremos la dirección que se presenta en la barra de direcciones del navedador.
Enseguida, en la etiqueta del botón asignaremos una acción clic, esta accionara la comunicación con mi Web Service.
Por último ligaremos el atributo text a nuestro resultado en la etiqueta label, y asignaremos una referencia al resultado de mi webservice con la propiedad lastresult. Esto es importante ya que lastresult no pertenece al Web Service sino a la clase webservice de FLEX.
El código se debe de ver como aquÃ(en su máquina la dirección WSDL puede variar)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Button x="22" y="10" label="LLamar a web service de .NET"
width="201" click="mifWebService.HelloWorld()" />
<mx:Label x="26" y="46" text="{mifWebService.HelloWorld.lastResult}"/>
<mx:WebService id="mifWebService"
wsdl="http://localhost:2876/WebSite3/Service.asmx?WSDL" />
</mx:Application>
A continuación probemos nuestra aplicación ya sea con las teclas CTRL+F11 o con el botón run.

Correr aplicación
Nota importante.
Si al correr la aplicación les marca un error de seguridad les recomiendo que echen un vistazo al tip que Carlos público aqui
Nos aparecerá nuestro botón, al dar clic nos deberá aparecer un mensaje como el siguiente

Resultado del Web Service de .NET
Una vez hecho esto hemos conectado FLEX con un Web Service en .NET, en nuestro siguiente tutorial veremos como podemos enlazar datos con nuestro Web Service y desplegarlos en FLEX.
» Leer más, comentarios, etc...
Navegapolis
Flexibilidad = sÃntesis + gestión sistémica
Octubre 30th, 2006 - [Enlace local]
SÍNTESIS
¿Cuál es el mejor método el yin o el yang?. ¿La tésis o la antítesis?. ¿Los procesos o la agilidad?.
Los gestores y modelos ágiles que dan la espalda a la gestión predictiva, emplean en su trabajo un fondo de conocimiento incompleto; y lo mismo ocurre con la gestión predictiva que ignora los valores y prácticas de los modelos ágiles.
GESTIÓN SISTÉMICA
Las empresas son sistemas inter-relacionados, y no depertamentos separados conectados por procesos de negocio. Desde esta realidad sistémica, un gestor de proyectos trabajando con técnicas ágiles en una empresa cuyo departamento de personal, programadores, departamento comercial y directivos trabajan sobre supuestos predictivos, acabará con sensación de impotencia y ganas de tirar la toalla.
» Leer más, comentarios, etc...
Variable not found, 0:1
Buscar en compañÃa: msdewey.com
Octubre 29th, 2006 - [Enlace local]
Hoy he encontrado otro buscador de esos que parecen ir evolucionando hacia la humanización del servicio, Ms. Dewey.
Este, a diferencia de Chacha, del que ya hablaba en un post anterior, no introduce el factor humano en la 'maquinaria' del proceso de búsqueda, sino en el interfaz, y de forma muy espectacular.
Como puede apreciarse en la captura de pantalla, la idea consiste en utilizar a una atractiva señorita como acompañante durante nuestra búsqueda. Pero no, no se trata de una imagen estática: Ms. Dewey se mueve, habla, gasta bromas, se enfada y comenta los resultados de la búsqueda.
Por cierto, algunos truquillos: si se introduce "clone yourself" como criterio de búsqueda, aparecen dos señoritas y charlan un poco. También es curioso ver las cosas que hace y dice cuando esperas un rato sin teclear nada en el buscador. Y está claro que el interfaz se presta bastante a gracias de este tipo (podéis probar a buscar "spam", "video", "soccer"...).
Como curiosidad, aportar que esta muchacha, indio-alemana ella, se llama Janina Gavankar, es actriz, pianista, percusionista y no sé cuántas cosas más.
En fin, la verdad es que como curiosidad no está mal. Demuestra que todavÃa hay gente por ahà (parece ser que la mismÃsima Microsoft) intentando aportar algo a este segmento, aparentemente tan trillado, como es el de los buscadores.
