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)


sábado, 20 de noviembre de 2010

HEAPSORT

Otro de los algoritmos rápidos es el de Heapsort. Es un algoritmo de ordenación no recursivo apoyado en otra estructura de datos como son los montículos (Heap).
Consiste en almacenar todos los elementos del conjunto a ordenar en un heap, y luego extraer el nodo raiz del montículo en sucesivas iteraciones obteniendo el conjunto ordenado.
La clave fundamental de este algoritmo esta en una propiedad de los heap, por lo cual, el nodo raiz contiene siempre el menor elemento (o mayor, según el ordenamiento que queramos realizar) de todos los almacenados en el.
Aquí tenemos una animación gráfica del funcionamiento de este algoritmo:

miércoles, 17 de noviembre de 2010

QUICKSORT CENTRAL

El siguiente algoritmo define el método de ordenación Quicksort utilizando como elemento pivote el elemento que esta en el medio de la lista de elementos:


función QUICKSORT (variables v: vector; pi, pf: enteros)
   variables 
      i, j: índice; 
      x: elemento 
   fvar
   comienzo
   si pi < pf entonces
      x = a[(pi + pf)/2];
      i = pi; 
      j = pf;
      repetir
         mientras a[i] < x hacer 
            i=i+1 fmientras
         mientras a[j] > x hacer 
            j=j-1 fmientras
         si i <= j entonces
            SWAP (a[i], a[j]); 
            i = i + 1; 
            j = j - 1;
         fsi
      mientras i <= j;
      QUICKSORT (a, pi, j);
      QUICKSORT (a, i, pf);
   fsi
fin



  • Los elementos pi y pf serán los índices inferior y posterior respectivamente del vector.
  • Como podemos observar utilizamos como pivote el elemento que esta en la mitad del vector:  

             x = a[(pi + pf)/2];

  • Y una vez colocado en su posición hacemos una llamada recursiva con los dos subvectores, el de la parte derecha (desde i hasta pf),  y el de la parte izquierda (desde pi hasta j).
  • Este algoritmo define ordenación ascendente. Si lo que quisiésemos fuese lo contrario solo habría que modificar estas líneas:


             mientras a[i] > x hacer 
                i=i+1 fmientras
            mientras a[j] < x hacer 
                j=j-1 fmientras

QUICKSORT

Quizá uno de los mejores y mas rápidos algoritmos sea el Quicksort.
El algoritmo implementado bajo el esquema de Divide y Vencerás, que como su propio nombre indica resuelve un problema difícil, dividiéndolo en partes mas simples tantas veces como sea necesario; esta basado en los siguientes fundamentos:

  • Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote. Éste según la modalidad que hallamos elegido podrá ser el primero, último, central,...
  • Ubicar los demás elementos del conjunto a ordenar como queramos hacerlo. O los mas pequeños a su izquierda y los mayores a la derecha (orden creciente), o los mas pequeños a su derecha y los mas grandes a su izquierda (orden creciente).
  • Dividimos así la lista en dos sublistas, porque el elemento pivote ya queda ordenado. La sublista izquierda y la derecha.
  • Así repetimos el proceso de forma recursiva para cada sublista.

sábado, 13 de noviembre de 2010

CLASIFICACIÓN GENERAL

Debido a la gran diversidad de algoritmos de ordenación y "sucedáneos", podemos hacer una clasificación general:
- Directos: algoritmos cortos y fáciles de entender, son especialmente adecuados para problemas relativamente pequeños. Clasificados a su vez en tres categorías de acuerdo al método base empleado: ordenamiento por selección, por intercambio y por inserción.
- Indirectos: métodos mas complicados de entender, producidos por un refinamiento de los anteriores; sobre todo para problemas de gran tamaño, donde los anteriores producen un "gran coste temporal". En esta clasificación podemos nombrar algoritmos como Quicksort, Mergesort o algoritmos basados en otras estructuras (árboles) como el Heapsort.

miércoles, 10 de noviembre de 2010

ALGORITMOS DE ORDENACIÓN

A menudo se nos presentan un sinfín de problemas donde aparecen estructuras que almacenan datos de todo tipo. Quizá una de las estructuras mas utilizadas son los vectores o arrays.
Un vector es un conjunto finito de elementos del mismo tipo. Uno de los aspectos importantes es la necesidad de la ordenación de cualquier tipo de estos elementos. Esto permitirá acceder de forma directa a cualquiera de los elementos que forman ese conjunto de datos, para ello simplemente basta con indicar la posición que ocupa el elemento en el vector.
Es ahí donde aparece uno de los grandes problemas de la Programación: la ordenación de estos elementos.
Existe una gran cantidad de formas de realizarlo en base a una serie de factores, donde fundamentalmente influye la complejidad temporal de estos algoritmos.
¡Si!, el "tiempo" que tarda en realizarse. Cuando hablamos de tamaños pequeños de problema ese factor no es verdaderamente importante. Sin embargo aumenta gradualmente a medida que esos tamaños se van haciendo grandes.
El motivo de este blog, no es nada mas que eso. Intentar realizar una clasificación lo mas acertada posible, y un análisis de cada uno de los algoritmos.