martes, 28 de mayo de 2013

Interfaz para dispositivos con S.O. iOS de control de servicios de un hogar digital

Por fin puedo mostrar imágenes del que hasta ahora ha sido mi proyecto mas ambicioso. Compendio de tecnologías: iOS, Servicios Web y OpenGL ES. 
No hubiera sido posible sin la ayuda del DTIC de la Universidad de Alicante y su maravilloso Middleware DAI. 







martes, 12 de marzo de 2013

glProject para iOS con OpenGL ES

Otra de las cosas que me ha estado trayendo de cabeza es la integración de la versión OpenGL ES y iOS. Debido a que esta es una versión reducida, no existen muchas de las funciones de integración entre contextos y ventanas de visualización, GLUT. Para la obtener las coordenadas de un objeto 3D en la ventana de un iPAD, hemos de desarrollar una proyección. Para ello he tenido que generar una versión que me de respuesta a este problema, aquí os dejo este algoritmo:


int glhProjectf(float objx, float objy, float objz, float *modelview, float *projection, int *viewport, float *windowCoordinate)
{
    //Transformation vectors
    float fTempo[8];
    //Modelview transform
    fTempo[0]=modelview[0]*objx+modelview[4]*objy+modelview[8]*objz+modelview[12];  //w is always 1
    fTempo[1]=modelview[1]*objx+modelview[5]*objy+modelview[9]*objz+modelview[13];
    fTempo[2]=modelview[2]*objx+modelview[6]*objy+modelview[10]*objz+modelview[14];
    fTempo[3]=modelview[3]*objx+modelview[7]*objy+modelview[11]*objz+modelview[15];
    //Projection transform, the final row of projection matrix is always [0 0 -1 0]
    //so we optimize for that.
    fTempo[4]=projection[0]*fTempo[0]+projection[4]*fTempo[1]+projection[8]*fTempo[2]+projection[12]*fTempo[3];
    fTempo[5]=projection[1]*fTempo[0]+projection[5]*fTempo[1]+projection[9]*fTempo[2]+projection[13]*fTempo[3];
    fTempo[6]=projection[2]*fTempo[0]+projection[6]*fTempo[1]+projection[10]*fTempo[2]+projection[14]*fTempo[3];
    fTempo[7]=-fTempo[2];
    //The result normalizes between -1 and 1
    if(fTempo[7]==0.0)        //The w value
        return 0;
    fTempo[7]=1.0/fTempo[7];
    //Perspective division
    fTempo[4]*=fTempo[7];
    fTempo[5]*=fTempo[7];
    fTempo[6]*=fTempo[7];
    //Window coordinates
    //Map x, y to range 0-1
    windowCoordinate[0]=(fTempo[4]*0.5+0.5)*viewport[2]+viewport[0];
    windowCoordinate[1]=(fTempo[5]*0.5+0.5)*viewport[3]+viewport[1];
    //This is only correct when glDepthRange(0.0, 1.0)
    windowCoordinate[2]=(1.0+fTempo[6])*0.5;  //Between 0 and 1
    return 1;
}
Esta versión implementada en C++, ha de ser llamada por las clases de Objective-C. Para ello estas clases deben de tener la extensión .mm.

Generación Certificados SSL para IIS 5.1

La realización de procesos relativamente sencillos en tecnologías y versiones actuales, son excesivamente complicados en versiones antiguas. Uno de los casos que recientemente me he encontrado es la de generación de certificados para servicios web y paginas web en SSL para poder lograr una encriptación en la comunicación de los mismos. Este tutorial trata de explicar este proceso:
Partimos de una versión de 5.1 de Internet Information Server en Window. El desarrollo comienza con la instalación tanto de la web como del servicio web de forma similar a la realización sin ningún tipo de seguridad. Para ello hemos de copiar en la carpeta c:\inetpub\wwwroot las carpetas de nuestras aplicaciones, y realizar el proceso de creación a traves de IIS.
Posteriormente procedemos a generar los certificados:
Vamos a IIS-> Botón Derecho en Sitio Web Predeterminado->Propiedades->Pestaña Seguridad de Directorios. 
En comunicaciones seguras->Certificado de servidor->Generamos certificado. En este proceso hemos de seleccionar la opción de realizar un certificado exportable.
Esto nos generara en C:\ un archivo llamado certreq.txt.
Ahora necesitaremos un programa denominado OpenSSL descargable desde http://www.openssl.org/source/. Lo instalamos  en C:\ 
Entramos en C:\OpenSSL-Win32\bin y ejecutamos:
  • openssl genrsa -des3 -out CA.key 1024, aquí nos pedirá indicar una contraseña que luego tendremos que indicar de nuevo
  • openssl req -new -key CA.key -x509 -days 1095 -out CA.cer (Si aquí nos da un error, ejecutamos antes) (1*)
  • (1*) set OPENSSL_CONF=c:\OpenSSL-Win32\bin\openssl.cfg y luego ejecutamos la anterior sentencia. Al ejecutar nos pedirá datos de la empresa a la que queremos generar el certificado.
  • Por último ejecutamos: openssl x509 -req -days 730 -in c:\certreq.txt -CA CA.cer -CAkey CA.key -CAcreateserial -out SelfSignedCert.cer
  • Esto nos enlazara el archivo certreq.txt creado antes y nos generara uno nuevo llamado SelfSignedCert.cer en C:\OpenSSL\bin\SelfSignedCert.cer. Este será el que habrá de utilizar el Taller para conectarse al servicio web.
Una vez generado esto nos vamos de nuevo a IIS->Sitio Web Predeterminado. Botón derecho y en la pestaña Seguridad de Directorios pulsamos de nuevo Certificado de Servidor. Aquí continuamos con el proceso iniciado y deberemos de seleccionar el nuevo certificado generado que está en  C:\OpenSSL\bin\SelfSignedCert.cer.
Bien, una vez hecho esto nos vamos IIS->Web de Autoservice->Botón derecho->Propiedades->Pestaña Seguridad de Directorios y en la sección Comunicaciones Seguras-> Pulsamos en Modificar. Marcamos Requerir Canal Seguro->Aceptamos->Aplicamos
Este proceso ha de hacerse una única vez, dándonos la opción de poder tener varios servicios web o web.
Si todo ha ido correctamente, ya podremos acceder a ellos a través de https:\\
No obstante os pongo los enlaces que he utilizado:

lunes, 7 de mayo de 2012

Reflexiones metodologías ágiles


Los modelos de desarrollo de software, no dejan de ser eso, modelos. Cada organización tiene sus características y vicisitudes.
Actualmente, para que una organización tenga éxito, esta claro que han de aceptar las bondades de las metodologías agiles, sobre todo SCRUM y XP. Aportan agilidad al desarrollo y menos inconvenientes ante cambios solicitados por parte del cliente, seguros de que se van a producir.
Cada institución, dependiendo de sus cualidades empresariales y laborales, intenta adoptar singularidades de estas metodologías. Fundamentalmente técnicas como las de plantear hitos o sprint que invaliden al cliente de solicitar modificaciones durante ese periodo de tiempo.
Durante el desarrollo de estos periodos de tiempo, en parte debido al desconocimiento de la metodología y, sobre todo, a la corta plantilla laboral; se abstienen de realizar el proceso de reuniones periódicas. Se limitan a realizar una semanal. Minimizando así el tiempo dedicado a estas fases de las metodologías.
La labor cambia en organizaciones de tamaño medio/grande. En éstas, sí suelen tener departamentos especializados y equipos de desarrollo subdividos que han adoptado profundamente el empleo de estas metodologías en el desarrollo de software.

Personalmente sostenemos que es básica la implantación de estas metodologías en una empresa propia de desarrollo de software. Aportan agilidad y satisfacción por parte del cliente al entregar una demo totalmente funcional en cada una de las etapas planificadas. El cliente ve su “programa” a menudo.
Quizá, el método ideal sería una mezcla de SCRUM y XP. Ya que es básico dedicarle una parte mas importante al diseño del producto como así contempla XP. Y la planificación en el desarrollo propuesta por SCRUM.

No cabe duda que estas metodologías involucran mas al empleado, aunque a su vez, le cargan de mas presión; pero ve su trabajo mas satisfactorio al realizar tareas multidisciplinares.
Ayudando si cabe, a su propia formación y currículum, al tener que estar al día de muchas novedades tecnológicas. en varias áreas.



Recomendaciones en el desarrollo de software

Basándonos en la entrevista realizada y las características obtenidas en cuanto al desarrollo de software, varias son las recomendaciones que indicaremos a la empresa:

        I.         Planificación previa de entrevistas, visitas y duración de hitos
Se han de planear entrevistas con las personas que utilizarán el software y visitarlos durante varias veces al mes. Fundamentalmente para identificar el conocimiento que tienen las personas que utilizarán el software.
Debiéndose identificar el tipo de usuario que es: común, avanzado o especialista. Además del sistema operativo del que tienen conocimiento.
Esto aclarará bastante las ideas a la hora del desarrollo del proyecto.
Conocer al cliente para satisfacer sus necesidades informáticas.

      II.         No planificar cambio de sistema operativo para el cliente únicamente por el software a desarrollar.
Para no tener que hacerte cargo de la migración de tu cliente a un nuevo sistema operativo deberían ser capaces de realizar el desarrollo del software dentro de las “comodidades” del usuario.
Si irremediablemente ha de ser así, se ha de asumir y planificar, la formación del cliente al 100% en este nuevo entorno.

     III.         Utilización de herramientas de desarrollo y Frameworks consolidados y “cómodos”.
En la medida de los posible no utilizar lenguajes o entornos de desarrollo desfasados. Esto incluye una formación continua por parte del equipo de desarrollo.
Se ha de ser práctico y tener el conocimiento necesario de herramientas que hagan la vida mas fácil a la hora del desarrollo.
Esto incluye a todos los miembros del equipo pertenecientes al desarrollo. Incluyendo el conocimiento de productos básicos para el testeo de las aplicaciones, controles de versiones, … que permiten la agilidad en el desarrollo.

   IV.         Planificar el desarrollo del producto en base únicamente a lo acordado con el cliente
No inventarse funcionalidades del producto que no ha sido acordadas y que para el cliente pueden no ser funcionales. No intentar ponerte en el lugar del cliente para estimar qué le puede servir de ayuda.
Si no te lo han pedido y no ha sido acordado simplemente NO debes hacerlo.
Si constantemente inviertes el tiempo en incluir este tipo de funcionalidades acarrearán dos consecuencias inmediatas: retardos temporales en entregas y disconformidad por parte del cliente en el software solicitado.

     V.         Busca la sencillez en el producto.
Deberíais ser capaces de desarrollar un producto accesible y con una interfaz clara y sencilla.
Busca referencias claras a la hora de aplicar la accesibilidad de tu producto. Y tener siempre en cuenta que tú No eres el que va a utilizar el software.
No caer en casos como en el de la imagen mostrada:




   VI.         Utiliza y construye librerías y controles propios.
Para buscar una mayor agilidad en el desarrollo de productos de características similares construye una serie de librerías/controles personales que puedan ser reutilizados de forma independiente en diferentes proyectos.
Invierte tiempo en madurar como profesional, mejorando la legibilidad y el estilo de tú código para que pueda ser entendido sobre todo por tus propios compañeros de equipo.
En resumen, abandonar el “egoísmo” que todo programador implícitamente atesora.

  VII.         Asignación de tareas.
Para la asignación de tareas, todo el equipo debería ser capaz de hacer de todo. Para ellos lo ideal es que el equipo sea multidisciplinar, para no incurrir en graves problemas con el cliente en caso de inconvenientes laborales en el personal del equipo de desarrollo.
Pudiendo definir, si así lo estima oportuno, una política de asignación de tareas en base a la carga de trabajo del equipo.

VIII.         No reinventar la rueda.
Por último y no por ello mas importante. Si ya dispone de la tecnología, componentes, librerías,… para hacer una determinada tarea, no pierdas el tiempo en intentar realizarlo a tú manera. Si te va a suponer inversión de tiempo, inviértelo en ampliar el conocimiento sobre ese producto ya existente.


jueves, 22 de septiembre de 2011

Incipiente alarma de "Burbuja Social"

Mucho ha sido lo que se ha dicho y escrito de la Burbuja punto com acaecida a finales del S. XX., con la especulación en las salidas a bolsa de empresas tecnológicas como Terra, Netscape o Eresmas.
Lo cierto es que una de las causas fundamentales de este estallido vino dado fundamentalmente por la sobrevaloración realizada de las compañías en su salida a bolsa. Hecho que hizo perder muchísimos fondos a grandes inversores.
Esta sobrevaloración, en muchos casos 30 veces por encima de sus ingresos, creo un desajuste imposible de soportar por ninguna otra de las actividades económicas desarrolladas entonces.
Otro hecho importante fue la no existencia por parte de estas empresas de un modelo de negocio, otro de los factores que les hizo sucumbir.

Datos como la actual utilización de internet, la incursión en la posesión de móviles, el aumento en la penetración de Smartphones y el desarrollo de las nuevas “tabletas” con respecto a hace 10 años, han cambiado la forma en la consumición de este tipo de productos.

Empresas como Google que han sido puente entre la primera y la “supuesta” segunda burbuja viven casi exclusivamente de sus ingresos.
Este tipo de publicidad, año tras año, va robando un gran trozo del pastel a los medios tradicionales; hecho que esta facilitando la investigación en la ponderación de estrategias de publicidad específicas para estos modelos de negocio.
Apple, Amazon y Microsoft también se subieron al carro de la adaptación a la carrera digital. Aunque algunas sean más rentables que otras.

Al frente del nuevo escaparate financiero están empresas como Facebook o Twitter.
La incipiente alarma de la burbuja de las redes sociales viene determinada fundamentalmente por la escasa posibilidad de valoración real de cada organización, por la mala clarificación de sus modelos de negocio y la facilidad en la clonación de los mismos (simplemente aportando valor añadido a cualquiera de ellos); hecho ya acontecido con MySpace y su desplazamiento por parte de Facebook.
Aunque el actual entorno financiero no facilita el estallido de las burbujas, la mayor prueba de fuego será la salida a bolsa de estas empresas; hecho que muchas de ellas están retrasando.
Parece claro que la paciencia esta jugando a su favor, habiendo rechazado, incluso, ofertas millonarias por su compra.

Una de las diferencias básicas con respecto a la situación de hace una década es que los métodos de valoración empresarial actuales están basados en dos principios:

·      Los métodos de valoración absolutos: una empresa vale lo que es capaz de generar para sus accionistas. La gran mayoría de los analistas se inclina por el flujo de caja como la medida que mejor define el valor de una empresa, incluyendo la tasa de descuento aplicable en el tiempo.
·      Los métodos de valoración relativos: una empresa vale lo que alguien está dispuesto a pagar por ella. Se determinará el valor de una empresa en función de la valoración de otras según dos colectivos:
§  Empresas que cotizan en mercados de valores
§  Y empresas que se han vendido total o parcialmente.

En el mercado tecnológico español existe cierta susceptibilidad debido a los fiascos de hace diez años. Actualmente la anticipación de un buen proyecto de internet esta basado en dos cosas: el accionariado y el currículo de los fundadores.
En los últimos dos años ha habido un creciente interés inversor en negocios basados en internet, pero es importantísimo mostrar resultados tangibles y no solo especulativos.
Todos estos hechos creo que dejan bastante claro que la situación en lo único que se le parece a la de hace diez años es, únicamente en el marco. El entorno financiero actual no facilita el estallido de las burbujas. Siendo quizá la “Burbuja Social” no la mas acechante.

miércoles, 1 de diciembre de 2010

SELECCIÓN DIRECTA

El siguiente algoritmo define el metodo de selección directa. Su programación es fácil y comprensible, aunque no es deseable para tamaños grandes de problema.
La idea básica del algoritmo consiste en buscar el menor/mayor elemento del vector y colocarlo en la primera posición del vector. Después se busca el segundo elemento menor/mayor y se coloca en la segunda posición, y así sucesivamente hasta que todos los elementos están ordenados.


void seleccion_directa(int n)

{

  int min,k;

  int cambio;

  for(int i = 0; i < n; i++)

   {

     min = v[i];

     k = 0;

     cambio = 0;

     for(int j = i+1; j < n; j++){

          if (v[j] < min){

              min = v[j];

              k = j;

             cambio = 1;

           }

     }

     if (cambio){

              v[k] = v[i];

              v[i] = min;

     }

  }

}

 


  • Si deseamos ordenar de mayor a menor tendríamos que modificar la siguiente línea:



              if (v[j] > min)