Cómo crear tu propio framework PHP especializado en un tema: Inventaria

Si alguna vez os habéis preguntado qué framework o qué gestor de contenidos utilizar, y no habéis llegado a ninguna conclusión quizás es porque lo que realmente necesitéis lo podéis hacer vosotros mismos con un poco de esfuerzo…y digo esto porque lo que necesitamos últimamente en la comunidad de programadores es gente que haga las cosas bien, gente como Pedro Luis, que nos regala el código de una web que tuvo que realizar en su trabajo. Pedro es Ingeniero Informático y le gusta hacer las cosas como un ingeniero debe hacerlas, con base y fundamento jeje

Nuestro amigo ha subido a su directorio lo que véis en el vídeo, el proyecto Inventaria, un motor de sitio web para organizar departamentos de un colegio, la tecnología que utiliza en su pequeño y humilde pero potente framework es: jQuery, PHP, mySQL y XHTML+CSS. Está pensada para que se pueda escalar fácilmente, añadiendo nuevas clases que harán de controladores y vistas…sí, le falta el modelo para completar el círculo del patrón MVC pero, quién necesita realmente un modelo cuando tienes el gestor de plantilla Smarty?… puede hacer el controlador y la comunicación con este sistema de plantillas de modelo al mismo tiempo? efectivamente, y así es como nuestro querido amigo Pedro lo ha pensado y ahora, sigamos viendo algo de código.

La estructura del sitio es algo que ya hemos visto en otros frameworks más famosos, primero tiene un index.php y por medio de un fichero .htaccess , redirige todas las peticiones menos multimedia a este script, que simplemente se conecta a la base de datos y renderiza la vista que la acción de la URL especifica, algo que todos conocemos:

//Extract Controller, Action and parameters from URL
  $query = $_SERVER['QUERY_STRING'];
  $request = explode('/', $query);
  $controller = (!empty($request[1])) ? $request[1] : 'main';
  $action = (!empty($request[2])) ? $request[2] : 'index';

y Pedro lo hace de forma muy inteligente y compactada, como véis es código que se entiende a la primera incluso las condiciones anidadas en una única línea. El motor o núcleo es tan sencillo que entra en esas menos de 100 líneas, un resultado de una acción se guarda directamente filtrado y procesado mediante el uso a la llamada de un controlador asociado creado en la variable $instance, que es la instancia de la clase perteneciente al controlador que la URL especifica…

 

include('controllers/'.$controller.'.php');
$instance = new $controller;
$result = call_user_func(array($instance, $action), $params);
$view = $result['view'];
$data = $result['data'];
 
render_view($view, $data);

aquí podéis ver que se carga el controlador, se crea la instancia de la clase y se procesa el resultado para llamar seguidamente al renderizador de la vista, que podría ser,al mismo tiempo cualquier otra clase, pero en este caso es smarty y cerramos el ciclo del patrón Modelo – Vista – Controlador de una de las maneras más simples que he visto en estos días jeje

Si profundizamos en el Controlador, veremos que implementa sólo dos, el encargado de la página principal y el que maneja las materias del departamento del colegio, y funciona casi como una capa por encima de la clase de la base de datos, es decir, hace las consultas de listados, modificaciones, inserciones o borrados fáciles sólo pensando un poquito.

Para instalarlo sólo hay que crear una base de datos ,poner los valores de configuración en index.php e install.php, que por simplicidad ni siquiera se ha creado un config.php jaja, y lanzamos este install.php, tras lo que podemos cargar la web en el navegador.

Para probar este software directamente en mi PC me he bajado el maravilloso paquete de MoWeS (Servidor Apache2+mysql5+php5+image-magick+phpmyadmin en 23MB), he descomprimido Inventaria en el directorio www/inv de MoWeS, después he creado una base de datos con juego de caracteres UTF8 con una instrucción sencilla en phpmyadmin:

 

CREATE DATABASE `inventaria` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

y he puestos los datos de configuración en index.php e install.php

  $host = 'localhost';
  $dbname = 'inventaria';
  $dbuser = 'root';
  $dbpass = '';

para lanzar localhost/inv/install.php ,lo que me devuelve:

Creating departments data table...OK
Creating materials data table...OK
Creating constraints...OK
Creating departments data
---------------------------
Creating Religión table...OK
Creating Plástica table...OK
Creating Ciencias Sociales table...OK
Creating Tecnología table...OK
Creating Francés table...OK
Creating Latín table...OK
Creating Música table...OK
Creating Gestión Administrativa table...OK
Creating Física y Química table...OK
Creating Educación Física table...OK
Creating Biología y Geología table...OK
Creating Filosofía table...OK
Creating Orientación table...OK
Creating Matemáticas table...OK
Creating Lengua table...OK
Creating Inglés table...OK

con lo cual, ya tenemos todo, ya podemos entrar en localhost/inv/. Si queremos cambiar el directorio inv por cualquier otro sólo tendríamos que cambiar las referencias en las plantillas de inv al nuevo nombre, por ejemplo, “inventaria”.
A partir de aquí ,es tarea del lector avanzar el proyecto y enfocarlo hacia una web que trate de manzanas, cómics, o por qué no? una tienda o cualquier otra cosa!
Ya no tenéis excusa para hacer las cosas bien desde cero, tenéis el conocimiento en vuestras manos, usadlo sabiamente :)

Mención especial a Pedro por compartir con nosotros su código, gracias!

Descargar inventaria.

Creación de una tienda o catálogo con Joomla

Hoy en día tenemos millones de opciones a la hora de crear una tienda, hoy estudiaremos el caso de utilizar Joomla y una solución a medida como es “VirtueMart” o “Tienda”.

Desde los primeros arbores del gestor de contenidos Joomla, cuando era Mambo, todo era un poco confuso, cada uno tenía que escribir muchos módulos y extensiones para tener un soporte decente multilenguaje y con e-commerce, pero actualmente toda esa confusión se ha disipado, hemos vuelto a poder dedicarnos a disfrutar del montaje de una tienda en unos cuantos clicks y ,ajustando un par de parámetros, solucionando pequeños bugs, desarrollamos un portal, catálogo y cesta de la compra con pasarela de banco incluída de una manera profesional.

 
A petición de 7p he eliminado el vídeo porque el cliente no deseaba comprometer su información.
Substituyo el vídeo de la presentación de la web y las modificaciones que hice por un par de vídeos que muestran la tecnología usada en este encargo.

Cómo usar VirtueMart con Joomla:

Tutorial:

El encargo en este caso tenía que ver con texto a formatear, algún algoritmo que escribir sencillo…Lo más importante y lo que más prisa le corría al cliente era el formato del carro de la compra, algunos botones, textos, estilos css, etc. y sobre todo que funcionaran los impuestos correctamente, que en España se cobrara el IVA para todas las provincias menos para Ceuta, Melilla, etc. Además la tienda tenía el bug de virtuemart de paypal, todo corregido en apenas unos días.También se hicieron algunas optimizaciones del código y bugs.Por ejemplo en la parte de productos, antes de añadirlos a la cesta el cliente pidió que cuando un producto tuviera hijos que no comprobara el stock hasta seleccionar uno de ellos y si no tenía hijos sí.

 

Introducción al IDE de XCode, Objective C e iOS

Curso de creación de aplicaciones de iOS

Hardware y Software que “nos exigen”

  • OSX (Snow Leopard al menos) actualizado a la última versión, para poder instalar el IDE de la manzanita. Nos quieren obligar a comprarnos un Mac, peeero, también podéis instalaros el VMWare Fusion  en un PC (o el VMWare normal pero sin soporte OpenGL), u Oracle VM VirtualBox sobre Windows o GNU/Linux y descargar una imagen de OSX de la red para este software-emulador, e incluso…crearos un Hackintosh, que no es muy caro y están de moda jeje
  • XCode 4 + iPhone SDK: podéis descargarlo de Internet si no tenéis dinero para la licencia de developer, aunque si queréis publicar pronto una aplicación podéis daros de alta en el programa de desarrolladores de la empresa, pagando claro!…
  • iPhone/iPad/iPod: pues hombre, estaría bien  tenerlo para poder probar lo que escribamos, ya que el simulador (no es un emulador!) que trae el IDE se comporta de manera algo distinta a como debería ser…pero bueno, para empezar tampoco vamos a tirar la casa por la ventana jeje Si tienes un dispositivo intenta instalarte el AppWizard para el siguiente paso -no te diré como conseguirlo-

Hardware de los dispositivos iOS

  • El iPhone 4 tiene una resolución de pantalla de 960×640 a 326 ppi.
  • El iPhone 3 tiene una resolución de 480×320 píxels
  • La resolución del iPad es de 1024×768 a 132 ppi

Habilidades que necesitamos para programar aplicaciones de iOS

  • Programar en Objective C: programar aplicaciones de iPhone en XCode es, básicamente, empezar a conocer cómo funciona Objective C y cómo asociar los objetos del Interface Builder a nuestro código. Para eso existen cientos de tutoriales, algunos más famosos que otros como “Masters of the Void“, pero lo mejor es seguir un libro gratuito de la propia empresa (en el apartado de desarrolladores) o ir a una biblioteca y pillarse libros como Objective C for dummies, iPhone application development for dummies, y luego algo más serio como iOs4 Programming Cookbook de O’Reilly, ya que contienen multitud de ejemplos y trucos para desarrollar todo lo que deseemos/necesitemos.
  • Hay un libro de la web de MacProgramadores bastante bueno sobre Objective C con especial énfasis en su origen (NeXT) y XCode, lo han borrado de la web, pero seguro que lo encontráis…

Introducción a XCode e iOS4 SDK

Conceptos básicos:

XCode

  • Xcode es el IDE que nos ofrece Apple para desarrollar aplicaciones de iOS.
  • El SDK (Software Development Kit) incorpora herramientas para el desarrollo (entre ellas, el simulador de iPhone/iPad).
  • El lenguaje de programación es Objective-C
  • Simulador de iOS: Permite simular tanto iPhone como iPad en nuestro Mac.
  • Interface Builder: Editor visual para diseñar interfaces de usuario para nuestras aplicaciones.
  • Instruments: Herramienta de análisis que nos ayuda a optimizar y monitorizar la aplicación

Sistema Operativo iOS

  • El Sistema Operativo de los dispositivos de Apple (iOS), está formado por un conjunto de capas, que conforman el conjunto de servicios ofrecidos por el dispositivo. Arquitectura:
  • Cada capa de la arquitectura está compuesta por un conjunto de frameworks
  • La capa Core OS es la base del sistema operativo. Se encarga de realizar la gestión de memoria, el sistema de ficheros, conexión a la red y procesos que interactúan con el hardware
  • Core Services nos permite el acceso a los servicios básicos, tales como la agenda, el acceso a la base de datos, preferencias, conexión a servidores y procesamiento de URLs, etc…
  • La capa Media nos permite la ejecución de tareas multimedia. Entre ella el acceso al Audio, OpenGL, Imágenes y PDF, Animaciones, etc…
  • Cocoa Touch nos permite acceder al acelerómetro, los eventos y controles táctiles, la jerarquía de vistas, alertas, etc…gestiona la interacción visual con el usuario
  • Novedades de iOS4:
  • Multitarea: mientras ejecutamos una aplicación, al pulsar el botón “home” no se cierra sino que pasa a segundo plano, pueden continuar ejecutándose o pueden suspenderse
  • Notificaciones Locales: completa el sistema de notificaciones push (desde un servidor remoto que nosotros mismos podemos crear)
  • Core Motion: conjunto de interfaces para acceder a toda la información basada en el movimiento (giroscopio ,motion-based)
  • Data protection: sistema integrado de encriptación
  • Soporte para pantalla de alta resolución (adaptación a la antigua)

Frameworks

  • Un framework es un conjunto de librerías que nos permite añadir una funcionalidad concreta a nuestra aplicación
  • Por defecto, cuando creamos un proyecto, tenemos los frameworks esenciales para el funcionamiento básico
  • Por ejemplo, para usar bases de datos SQLite usaremos su framework, simplemente con copiar el directorio descargado de su web, aunque en la versión de XCode4 ya viene integrado, también haremos lo mismo con Cocos2D
  • Cocoa Touch: conjunto de frameworks orientados a objetos que permiten el desarrollo de aplicaciones nativas para iOS

Crear una aplicación

Pasos

  1. Abrir XCode y crear un proyecto
  2. Diseñar la interfaz de usuario
  3. Escribir el código asociado de la aplicación
  4. Compilar, ejecutar y probar (vuelta al paso 2)
  5. Medir y ajustar el rendimiento de la aplicación
  6. Producir y publicar la aplicación

Tipos de proyecto

  • Cocos 2d: para crear juegos (necesita el framework Cocos2D),lo veremos en otro curso, de programación de videojuegos para iPhone
  • Navigation-based : presentan la información de forma jerárquica usando múltiples vistas (diseño de pantallas)
  • Open GL : igual que cocos, además de juegos podemos crear cualquier tipo de aplicación que represente imágenes, animaciones o gráficos 3D
  • Split View-based : Aplicaciones enfocadas para iPad que muestran más de una vista en la pantalla al mismo tiempo (un control listado y una vista detalle de elementos normalmente)
  • Tab Bar : presentan una interfaz de “radio” que permite al usuario elegir entre varias opciones
  • Utility : aplicaciones que presentan una vista principal y permiten que el usuario acceda a otra vista para realizar personalizaciones básicas
  • View-based : una vista simple para implementar la interfaz
  • Window-based : plantilla universal (cualquier dispositivo con iOS) que sirve de punto de partida con un delegado y una ventana. Útil para aplicaciones con jerarquía propia

Recordar que no todos los tipos de aplicaciones pueden ser universales (para cualquier iDevice) y las que lo son tienen diferentes diseños de interfaces de usuario en subdirectorios con su nombre.

Interfaz de XCode

XCode4: editor en una ventana

XCode4: Interface Builder

XCode4: Git integrado

Tipos de ficheros de un proyecto

  • Info.plist: como todos los plist, es un XML (introducido por NeXT) constituído de propiedades de configuración en UTF-8
  • Ficheros.h: declaraciones de interfaces ,clases y atributos
  • Ficheros.m: implementación de clases y métodos definididos en los .h (aunque no necesariamente requieren un .h)
  • Ficheros .pch: cabeceras precompiladas que se añaden a las clases
  • Ficheros de objetivo: resultado de la compilación de un conjunto de ficheros de código, puede ser una librería o una aplicación. Un conjunto de objetivos forman un producto. Lo utilizaremos para publicar una aplicación en la tienda

Perfiles de compilación

  • Depuración: incluye la opción de depuración al compilar con gcc, es más lenta pero encuentra errores lógicos. Se puede depurar en el editor de texto, mini-depurador, depurador y en la consola [(gdb)]. Opción: GCC_GENERATE_DEBUGGING_SYMBOLS. Podemos usar breakpoints.
    Mientras el programa está siendo depurado podemos modificarlo (como pasaba en VisualBasic y otros lenguajes! :D) : cambiar el nº y tipo de argumentos de una función o método que esté en la pila,el tipo del valor de retorno o el nombre de una  función o método también en la pila, así como cambiar el tipo de las variables estáticas, un fichero NIB, añadir clases o cambiar sus métodos…
    Leer más >
  • Lanzamiento: mayor rendimiento de la app, tamaño de objeto final compilado menor.
  • Distribución: como el anterior pero necesita un certificado o firma de Distribución válida (con apple hemos topado xD, aunque podemos arreglar esto con algún que otro truco de Cydia…). Se añade meta-información necesaria para ser validada en la tienda.

Introducción a Objective C

¿Qué es?

  • Pequeño set de extensiones de ANSI C
  • Sus añadidos a C están basados en Smalltalk, uno de los primeros lenguajes orientados a objetos
  • Diseñado para dotar a C de toda la potencia de la orientación a objetos

Clases

  • Sintáxis normal de creación de clases: interfaz (.h) + implentación (.m)
  • Ejemplo de clase Persona.h:
    @interface Persona : NSObject {
    NSString *nombre;
    NSString *apellidos;
    }
    -(NSString*) nombre;
    -(NSString*) apellidos;-(void) setNombre: (NSString *) _Nombre;
    -(void) setApellidos: (NSString *) _Apellidos;
     
    +(NSString *) soyMetodoEstatico: (NSString *)  mensaje;
    @end

    Ejemplo de clase Persona.m:

    #import "Persona.h"
    @implementation Persona
    -(NSString*) nombre {
    return self.nombre;
    }
    -(NSString*) apellidos {
    return self.apellidos;
    }
    -(void) setNombre: (NSString *) _Nombre {
    self.nombre = _Nombre;
    }
    -(void) setApellidos: (NSString *) _Apellidos{
    self.apellidos = _Apellidos;
    }
    +(NSString) soyMetodoEstatico: (NSString *) mensaje{
    return mensaje;
    }
    @end
  • Ejempo de función que toma datos de la clase padre de la que hereda:
    - (id) init {
    if ( self = [super init] ) {
    [self setNombre:@"nombre por defecto"];
    [self setApellidos:@"apellidos por defecto"];
    }
     
    return self;
    }

    self es la propia instancia del objeto y super es la clase de la que hereda

  • Declaración de un método:
  • A través del corchete accedemos a un objeto, que es el primer parámetro, el segundo es la llamada al método, es como hacer
    $this->método en PHP , o puntero_a_clase -> método , en C / C++,Java.
    Por ejemplo , un método sin entrada

    [object method];

    Con entrada:

    [object methodWithInput:input];

    Con salida:

    output = [object methodWithOutput];

    Con entrada y salida:

    output = [object methodWithInputAndOutput:input];
  • Recordar que si queremos especificar una función con varios parámetros se ponen dos nombres, uno para el nombre clave de llamada y otro para el nombre interno del parámetro, el primer nombre de nombre clave no se pone, ejemplo:
    -(void) miFuncion: (int)parametro1 nombre1: (bool) parametro2 nombre3:(NSString*) parametro3;
    a esta función accedemos así, ejemplo con datos:
    [miObjeto miFuncion:7 nombre1:true nombre3: @”cadena”
    Fijaros que una cadena siempre se precede de una arroba.
  • Propiedades de una clase: (@property)
    permiten generar automáticamente métodos de acceso para los atributos de una clase, podemos sobrecargar los métodos setter & getter si no usamos las especificaciones por defecto de una propiedad, para saber cuál nos conviene primero debemos ver la gestión de memoria. Por defecto, el setter se añade automática a la propiedad definida como setNombre_variable (set+UCase(nombre_variable)), y el getter es el nombre de la variable atributo tal cual, en Persona.h el setter es setNombre y el getter nombre. Fácil.
    Para que podamos usar las propiedades es obligatorio inicializarlas con @synthesize en Persona.m (la implementación de la clase),este genera los setters y getters automáticamente. Una vez hecho además podemos especificar en esta línea de sintetización el nombre local del acceso o accesser, algo como @synthesize nombre = _nombre_local;
  • Ver más >

Gestión de memoria!: de lo más importante en Objective C

  • Con el método dealloc liberamos memoria utilizada en las instancias de nuestras clases, lo vamos a sobrecargar para hacer “release” de todas las instancias de objetos que hayamos creado
  • Se debe liberar por completo el propio objeto también ,con [super dealloc] .
  • Debemos liberar las variables de tipado fuerte
  • Para aprovechar la memoria tenemos que crear nuestro propio “recolector de basura”, algunos ven esto como muy buena idea y otros no son partícipes de que el lenguaje no tenga las bondades de Java…
  • Para gestionar qué variables están siendo utilizadas en memoria, tenemos lo que se llama el “contador de referencia” de Objective C, sólo tenemos que especificar qué hacer con las variables al asignarlas, crearlas, copiarlas, pasarlas por parámetro, etc. y la ejecución del programa hace el resto.
  • Con alloc inicializamos memoria en función del tipo o clase de una variable, por ejemplo, cuando declaramos una variable de tipo NSNumber con una instrucción como esta:
    NSNumber *number = [[NSNumberalloc initWithFloat:8.75;
    lo que pasa internamente es que el contador de referencias se pone a 1.
  • Con retain aumentamos el contador de referencias en uno, por ejemplo si deseamos liberar en un contexto la variable pero no queremos que se pierda la variable porque se usa en otro contexto, por ejemplo:
    -(
    void) setNombre: (NSString *) _Nombre {
    [self.nombre
    autorelease;
    self.nombre = [_Nombre
    retain;
    }
    Usando autorelease se libera al objeto de manera diferida, es decir, es posible usar la variable de la primera línea durante un tiempo más, le dice al compilador que la variable self.nombre se decremente al salir del contexto de la clase de la función setNombre, después le asigna un nuevo valor, el del parámetro, pero a este le dice que lo retenga aunque se borre fuera, para que sea gestionado desde la clase.
  • Con release se decrementa el contador en una unidad, si tiene valor 1 ,se borra la variable, es decir, le decimos al sistema que no la necesitamos y éste llama a dealloc automáticamente (primer punto)
  • Ojo entonces, si por ejemplo creamos un método en una clase para asignar un valor y hacemos que use release para luego hacer retain con el nuevo valor que le pasamos, siendo este no una variable sino una llamada de una función, algo así:
    ________
    – (
    void) setNombre: (NSString*) _Nombre {
    [self.nombre
    release;
    self.nombre = [_Nombre
    retain;
    }


    persona
    * ego = [[personaalloc init];

    [ego
    setNombre:[ego nombre];
    ________
    al llamar a la función setNombre, primero se libera el objeto self.nombre antes de retenerlo, por lo que ya no hay espacio reservado en memoria para esta variable y aquella pasa a estado incoherente ya que el valor que le hemos pasado es precisamente el que hemos liberado, para solucionarlo ponemos autorelease en lugar de release.
  • Ahora podremos saber qué tipo de gestión de memoria asignarle a una propiedad, por ejemplo para el nombre en nuestra clase Persona.h:
    @property (retain) NSString* nombre;
    al poner retain hemos declarado que el setter (función como setNombre pero automática) debe hacer retain sobre el valor de entrada. Pero podemos especificar con setter=setNombre nuestra propia función ;)
  • A veces tenemos que tener cuidado con lo que liberamos de la memoria, no podemos dejar todo en autorelease porque al pasar la referencia de una variable entre funciones es posible que se libere antes de tiempo, sin embargo de esto nos daremos cuenta cuando el simulador haga CRASH! jaja

Variables

  • Tipado débil: int, bool, float, etc.
  • Tipado fuerte: objetos como NSString, NSNumber, etc.
  • ejemplos de métodos con tipos distintos:
    - (int) multiplica: (int)a por:(int)b {
    return a * b;
    }
     
    - (NSString *) cadenaResultado: (int)resultado {
    NSString *res = [NSString stringWithFormat:@"El resultado es: %d", resultado];
     
    return res;
    }
     
    int resultado = [self multiplica:2 por:3];
    NSString *cadena = [self cadenaResultado:resultado];
    NSLog(@"%@", cadena); //devuelve 6
  • Un protocolo (@protocol) permite que la lista de métodos que contienen se puedan implementar por cualquier clase, puede especificarse al crear una clase en su definición de la clase que hereda de otra…
    @protocol MyProtocol
    - (void)requiredMethod;
    @optional
    - (void)anOptionalMethod;
    - (void)anotherOptionalMethod;
    @required
    - (void)anotherRequiredMethod;
    @end
     
    @interface ClassName : ItsSuperclass < protocol list >
  • Otro método para depurar es usar el log, la función NSLog(cadena) usa el mismo formato que un printf, recordar el formato:

    NSLog(@”La fecha y hora actual es %@”, [NSDatedate );

XCode Organizer

  • Una vez creada la aplicación, si queremos usarla en un iDevice, tenemos que desplegarla (necesita certificado), conectar el dispositivo por USB y probar! Pero también podemos usar el simulador ,aunque no refleja el comportamiento exacto (real) de la aplicación si que sabremos si funciona o no :)

Consejos

Diseñar como un ingeniero y producir como un artista: echad mano de vuestro amigo el arquitecto de información para encontrar la mejor manera para guardar los datos,… no es lo mismo una base de datos en SQLite que un conjunto de ficheros XML.

  • Hay que conocer el flujo de la información en el sistema de aplicaciones, por ejemplo un sistema de etiquetas debe ser recurrente en cuanto a que hay tags que se repiten, la forma óptima de hacer esto es como lo hace WordPress o algunas aplicaciones web si lo prefieres. Debemos consultar a nuestro amigo experto en marketing para el nombre del programa, así será el dominio para publicarlo, también nos aconseja qué tipo de características son viables en cuanto a lo que el público demanda y nos da su perspectiva como experto lo bonito, barato y bueno. Efectivamente, necesitamos conocer cómo construir diagramas pero no son indispensables, aunque sería ideal diseñar previamente la app con UML
  • Beta tester: antes de empezar si quiera a pensar en querer programar algo para iOS ,lo primero que debemos hacer es conocer los dispositivos, el iOS y OSX, todos los widgets del sistema operativo, así que al menos tenemos que haber probado todas las aplicaciones antes mencionadas, aunque sea en el ifón de un amigo, no vale haberlo visto en vídeo, tenemos que tocar la esencia de la magia de esta tecnología para sentir qué queremos hacer realmente.

Otros tutoriales para conocer el IDE XCode 3: nos sirve para empezar.

Ahora que conocemos el IDE de la mano de Noemi gracias a sus tutoriales de Youtube, vamos a seguir un poco más adelante, tenemos la ayuda necesitamos aquí:

Ejercicios (Deberes :)

  1. Ejercicio 1: crear un proyecto tipo “View-based”, crear una clase Persona y otra clase Usuario, establecer propiedades en las clases asociadas a sus atributos, una clase Usuario debe tener un atributo que sea una clase Persona.
  2. Ejercicio 2: Crear un NSArray e inicializarlo con clases NSNumber, luego mostrarlo con NSLog
  3. Ejercicio 3: Crear un NSMutableArray e inicializarlo con clases Persona, añadir  a dicha clase la función (sobrecargada) description para que NSLog pueda mostrar el contenido de todos sus atributos

Para corregirlo podéis enviármelo con el formulario de contacto.

<< Volver al curso de programación de aplicaciones de iOS

Siguiente: conectar interfaz con el código

Aplicaciones web multiplataforma con XSL y XML: un reto SEO

Gracias al uso de XSL vamos a transformar un XML para lo que nos convenga.

Lo primero, la utilidad, una aplicación en PHP o Java o cualquier otro lenguaje, como por ejemplo un juego o un TPV, una tienda, un portal…, cualquier tipo de aplicación puede compartir datos como hemos visto en los cursos y talleres de servicios web, pero podemos avanzar un poco más: si comprendemos el uso de una plantilla XSLT que transforme un fichero XML, siendo este la salida de nuestra aplicación, en un fichero XHTML que el navegador interpreta, sea en un móvil, un ordenador de escritorio o cualquier otro formato que necesitemos…entonces, las posibilidades son ilimitadas.

Para nosotros como webmasters, programadores, diseñadores…, un XSLT es un fichero que sirve para dar formato HTML a un fichero XML.
http://es.wikipedia.org/wiki/Extensible_Stylesheet_Language_Transformations
¿Cómo?
En español, si abres un fichero .XML con el navegador, éste lee la cabecera buscando de qué manera interpretarlo, aquí entra en juego el esquema XSLT, donde la T es de template, o sea, plantilla, en nuestro caso, una plantilla XHTML.
Bueno, vamos a los ejemplos, éste en concreto es de la W3C:
http://www.w3schools.com/xml/simplexsl.xml
como ves, es una dirección .XML que interpreta el navegador, incluso el IE6 :-).
Esto lo hace gracias a que en la cabecera aparece:

<?xml-stylesheet type=”text/xsl” href=”simple.xsl” ?>
entonces, usa la hoja de estilos o plantilla para dar formato que está en la misma dirección pero con distinta extensión:
http://www.w3schools.com/xml/simple.xsl
como ves, este fichero se basa en un esquema de TRANSFORMACIÓN

, lo que quiere decir que va a tomar el contenido del fichero inicial .XML y usando las reglas del XSL va a convertir las etiquetas con nombres comunes, en el ejemplo, son elementos del desayuno, ej.) “<breakfast_menu>” , en divisiones del tipo:
——-
<div style=”..”>
<span>
<!–etc.–>
</span>
</div>
——-
En concreto, esta regla es :
________________________________
<xsl:for-each select=”breakfast_menu/food”>
[CODIGO XHTML]
</xsl:for-each>
________________________________
para extraer los valores de un elemento de un nodo xml, se utiliza <xsl:value-of select=”RUTA/NOMBRE_NODO”/>
que es lo que se utiliza en el ejemplo para el precio, nodo <price> (que está dentro de <food>, que está dentro del menú <breakfast_menu>, que es la raíz o root del documento).
Para mostrar el valor de un atributo, por ejemplo,si a cada nodo <price> le añadimos la moneda:
<price currency=”dollar”>8.50</price>
en la plantilla xslt ,el valor se sacaría, así:
<xsl:value-of select=”price/@currency”/>
ya que estamos dentro de un bucle (o loop) que recorre todos los elementos del tipo
breakfast_menu/food
es decir, todos los <food>, dentro tienen un <price> y sacamos el atributo currency con la @.

La lista completa de referencias de XSL con templates está en:
http://www.w3schools.com/XSL/xsl_w3celementref.asp

Este es un ejemplo sencillo porque no incluye ningún DTD o definición de datos (en lenguaje XTiger), este se suele utilizar para hacer las cosas bien como ingenieros, …este DTD es un fichero que está por debajo del XML y es el que determina cómo se debe construir el árbol DOM completo, es decir, si no se siguen las reglas del DTD base, el fichero XML no es válido. Pero esto ya es pa nota jeje…hace unos años escribí un generador de código php+xhtml+jscript+css en php-gtk que creaba el esqueleto de una web en función a un xml ,el vídeo está aquí:

Resumiendo, podemos tener una aplicación que genere el mismo código XML para todas las plataformas pero cambiando sólo el esquema XSLT le diremos a la aplicación final que interpreta dicho XML cómo ha de hacerlo. Para el caso de móviles utilizaremos su lenguaje propio, al igual que si fuera una aplicación externa que necesitamos conectar/adaptar con nuestra aplicación, pudiendo usar servicios web como ya vimos en otros tutoriales si necesitamos algo más avanzado.

Para editar XSLT tienes editores a patadas :] ( Amaya )

Más tutoriales:

y más cosas habrá por ahi…

¿Quién está usando XML y XSLT hoy en día?: Blizzard lo utilizó en su primera versión de su web de Starcraft 2 ( XML , XSL -en este caso usan un script PHP que define el idioma y lo coloca en el atributo lang que se interpreta en la plantilla XSL- ), supongo que mantenía una base de datos interna en la empresa y quería reutilizarla por lo que le dió una salida xml y creó un esquema xslt bastante chulo, no me extrañaría que fuera la misma aplicación que usaran para gestionar el trabajo de los empleados… Otras empresas lo utilizan, Microsoft para su Office, OpenOffice también,…las universidades quieren pasar todo a XML, en Sun, digo, Oracle, todo se quiere hacer en función a XML para poder traspasar todas las fronteras y si no pueden usar un xslt para transformar de un lado a otro con facilidad.

Las ventajas de usar XML como código fuente es que podremos ocultar un poco mejor el XHTML final de posibles plagios e intentos de ataque, la información mostrada es muy fácil de leer, esto es bueno para la web semántica (web 3.0!), bueno para el posicionamiento (SEO),claro, de hecho Google anunció que una página en XML y XSLT iría a la cabeza antes que otra en XHTML, las arañas, webbots ,spiders, como queráis llamarlas, graban mejor información en XML y hacen las transformaciones a XHTML…además es un buen reto construir una web en XML,

¿O no?

 

Tuberías de Yahoo! en WordPress – fetching avanzado

Hace unos meses preparé una charla para la Universidad que al final no impartí por falta de tiempo, ahora os traigo todo el material para que lo utilicéis cómodamente en vuestros blogs y adaptaciones de manera muy sencilla.
Se trata de la construcción de un complejo entramado de fuentes de información que, combinadas, constituyen todo un generador de contenido fresco,afín e interesante para nuestro sitio web.
Primero crearemos un pipe en el sitio web de Yahoo! Pipes, después utilizaremos su RSS para obtener el contenido que genera y después ,usando el plugin que pongo a disposición en este mismo post, tomaremos la fuente de datos final para procesarla y añadir contenido único dinámico a nuestro blog de WordPress.
El siguiente PDF contiene todo el proceso:

Por si no queda suficientemente claro, he realizado el siguiente vídeo para mostrar el funcionamiento:

Resumen de los pasos:

  1. •Crear el PIPE DE YAHOO!! :Tomemos como ejemplo la página de noticias de CodeIgniter, el contenido que nos vamos a llevar está entre <div> •El truco está en introducir la url de la noticia dentro de una página de WordPress. •Para ello, utilizamos la url de WordPress de la página y un parámetro llamado «u» •/noticias-php/?u=
    En mi caso la url de mi Pipe es la siguiente: pipes.yahoo.com/pipes/pipe.info?_id=f227ec8e4136c537d419a4fc7cbc530a
  2. •Ir a wordpress, instalar el plugin, crear una página que utilice el plugin y un widget que tenga el RSS de Yahoo! Pipes. •Contenido de la página de WP: •[pipenews 0 “Estas son todas mis noticias sobre PHP”] •La url del widget se coge de Pipes •Ahora configurar el Plugin
  3. •Para codeigniter tenemos •<div class=”entries”> •Que se transforma en •/<div class=”entries”>(.*?)<\/div>/is •Que es la expresión regular para sacar el contenido

El plugin se puede descargar aquí: Yahoo! Pipe News Plugin for WordPress by Juan Belón. Recordar dar permisos de escritura al subdirectorio de pipenews/cache para que funcione ;)

Disfrutad :)

Aplicación web en comunicación con programas de servidor

Este vídeo muestra un ejemplo de aplicación web que se comunica mediante AJAX con un programa del servidor en perl para procesamiento de facturas telefónicas en PDF dando como resultado un filtrado de datos, con la mejor opción de ahorro de las compañías de móviles…

Página 1 de 212
footer
jbelon © | sitemap.xml