Saltar al contenido

Mes: noviembre 2015

Breve resumen del UNETBots 2015

El pasado 28, 29 y 30 de octubre, se llevó a cabo en la Universidad Nacional Experimental del Táchira (la universidad donde me gradué y actualmente laboro) la competencia nacional de Robótica. Gracias a los profesores Dahyana Nimo y Angel Gil, Mozilla Venezuela pudo contar con un estand para promocinar la Web of things (la web de las cosas).

Día I

El primer día fue de preparación de la logística, los estudiantes preparando sus robots en distintas áreas de la universidad, algo muy cool pues brindaba un ambiente Hacker a la institución. Se inicio una inauguración no formal del evento en el auditorio A, donde se realizaron tres ponencias de distintas organizaciones: la primera fue de Fundaelect sobre el uso de robots para el arreglo de instituciones eléctricas (al principio no estaba motivado por la parte política pero al ver los robots, todo cambió), la segunda fue por parte de Mozilla Venezuela sobre la Web de las Cosas (donde explicó como vivimos parte del futuro propuesto en la película Volver al futuro) y finalmente culminó con la de Telefónica sobre el uso de redes neuronales para detectar fallos en los equipos de telecomunicaciones. Fue un día suave, sin eventos de robots como tal y que sirvió para conocerse entre sí.

Día II

El segundo día fue el mas cargado de actividades, comenzó con una excelente inauguración: primero con una obra de teatro de un profesor loco y sus robots, luego el coro de la universidad interpretó varias canciones de películas y series geek, dando un toque único al evento, posteriormente hubo palabras de las autoridades de la universidad, luego una ponencia de la Universidad Simón Bolívar para mostrar los avances de la investigación realizada en el país y promover en alumnos, la ejecución de ideas de negocio.

Al finalizar la inauguración, se hizo una exposición de robots infantil. Para mí fue algo muy bien porque es impresionante la imaginación de los niños, quienes no se dejan llevar por limitaciones o ideas «no factibles». Ademas, siempre es bueno contar con una generación de relevo para que sigan llevando este tipo de actividades en el futuro.

Luego comenzaron las competencias en las distintas disciplinas, la mayoría de la gente iba por SUMO pues es la única donde se ven dos robots compitiendo al mismo tiempo. A pesar de que la universidad estaba en paro de docencia de pregrado, la asistencia fue masiva.

En el stand de Mozilla Venezuela, pudimos seguir expandiendo información sobre la Web de las cosas, hicimos reclutamiento para fundar el Firefox Club de la UNET, se promovió Firefox OS e inclusive tuve la oportunidad de conversar con unos alumnos que les gustaría modificar el sistema operativo para migrar a dispositivos de seguridad.

Día III

El día final la atención se la llevó las finales de las competencias de robots, en el caso de Mozilla Venezuela logramos conversar con personas de otras universidades para motivarlos a participar en la organización y fundar sus propios clubs en sus universidades. Ya en este día hicimos una rifa de una franela y entregábamos recuerdos de Firefox a cambio de Tweets que promocionaran las tecnologías de Mozilla y la web abierta.

Finalmente procedimos al acto final, donde se entregaron los respectivos premios, reconocimientos, la estudiantina de la UNET tocó canciones regionales y luego nos fuimos todos a la celebración post-evento.

Fue una gran oportunidad participar en este evento, me alegra como existe una nueva generación de estudiantes que sigan realizando investigaciones de robótica a pesar de las dificultades que atraviesa el país, fue posible dar a conocer el futuro de la web (que va mas allá de los navegadores) a estudiantes de todas partes del país, ver la competencias de robots fue una nueva experiencia para mí y sobre todo, que fue organizado por mi universidad.

Espero que este tipo de eventos se repitan a lo largo del país.

2 comentarios

Hackers Wizards of the Electronic Age: antiguo documental sobre los verdaderos Hackers

No recuerdo como llegué a obtener el enlace a este documental de Hackers, pero cuando leí el título pensé que era un documental reciente porque no conocía el título. Para mi sorpresa al empezar verlo, es un documental de 1984 realizado en un encuentro de Hackers, pero incluye a leyendas como Richard Stallman y Steve Wozniak.

Les recomiendo ver este corto documental (dura menos de media hora) y es interesante como eran los primeros hackers, como ha cambiado la tecnología y la gran influencia de ellos en el movimiento actual.

Hackers - Wizards of the Electronic Age

Si te gustó, no dudes en compartirlo en redes sociales o dame tu opinión del vídeo.

Deja un comentario

QR-DA: San Cristóbal

El próximo sábado 28 de noviembre se realizará en la ciudad de San Cristóbal (bueno técnicamente es en Palo Gordo el sector al lado de la ciudad), el 2do QR-DA, una reunión de programadores con el fin de colaborar con fundaciones sin fines de lucro. En esta ocasión, se decidió colaborar con la herramienta de código abierto EventoL, la cual se espera utilizar en las distintas sedes del FLISOL 2016.

Así que si deseas reunirte con buenos programadores de todas partes del país, pasar un buen rato con comida y bebidas, compartir tus conocimientos informáticos para una buena causa, promover software y mas. ¡Entonces no dudes en asistir a este evento!

El documento oficial con información del evento, posadas, ubicación se encuentra disponible aquí. Y si desean mas información, pueden comunicarse con Richzendy o Tatica quienes son los organizadores del evento.

¡Happy Hacking!

1 comentario

Agregar rutas personalizadas en el API REST de WooCommerce

WooCommerce es una excelente plataforma para montar tu propia tienda en línea. Aunque mucha gente piensa que WordPress sigue siendo solo una plataforma para blogs, desde hace años se ha cambiado el funcionamiento interno para soportar todo tipo de contenido. WooCommerce es un ejemplo de ellos, pues este plugin permite soportar todo el contenido requerido en una tienda en línea como: productos, órdenes, pagos, descuentos, entre otros. Además de incluir una API REST para realizar acciones adicionales sobre él.

API REST

El plugin incluye una API REST para las operaciones mas básicas (se debe activar previamente), permitiendo comunicación hacia o desde aplicaciones externas, extendiendo aún mas las posibilidades de procesos que se pueden implementar en la tienda. Sin embargo, si manejas flujos de compras personalizados o deseas realizar acciones mas allá de las disponibles en el API por defecto, puedes agregar las tuyas tal como se explicará a continuación.

Desarrollo del plugin

El plugin se divide en 2 archivos, el principal para definir el plugin como tal y permitirle indicar a WordPress en que momento se va a cargar el segundo archivo, que contiene los métodos que responden a las rutas personalizadas del API.

Cargador de la clases

Para modificar WordPress, siempre es recomendable hacerlo a través de plugins, por eso el primer paso es definir un plugin como cualquier otro y dentro del constructor de la clase del plugin, indicar a WooCommerce que luego de cargar el código necesario para implementar el API (a través del hook woocommerce_api_loaded) se deben agregar la(s) clase(s) que implementan las rutas personalizadas (a través del hook woocommerce_api_classes), este código lo pueden ver a continuación:

/**
 * Custom API REST path  class
 *
 * @package MyPlugin
 * @author Skatox
 */
class WC_API_Custom extends WC_API_Resource
{

    const PATH = '/custom';

    /**
     * Function to define each of the custom path
     */
    public function register_routes($routes)
    {
        //GET Request
        $routes[self::PATH . '/orders'] = array(
            array(array($this, 'listShippingOrders'), WC_API_Server::READABLE),
        );

        //POST Request
        $routes[self::PATH . '/orders/(?P<order_id>\d+)/fulfillments.json'] = array(
            array(array($this, 'createItem'), WC_API_Server::CREATABLE | WC_API_Server::ACCEPT_DATA),
        );

        //PUT Request
        $routes[self::PATH . '/variants/(?P<id>\d+).json'] = array(
            array(array($this, 'updateItem'), WC_API_Server::EDITABLE | WC_API_Server::ACCEPT_DATA),
        );

        return $routes;
    }

    public function listShippingOrders($fields = null, $filter = array(), $status = null, $page = 1)
    {
        $wcApiOrders = new WC_API_Orders($this->server);
        $orders = $wcApiOrders->get_orders($fields, $filter, $status, $page);

        //Removes orders without shipping methods
        foreach ($orders['orders'] as $key => $order)
        {
            if (empty($order['shipping_methods'])) {
                unset($orders['orders'][$key]);
                continue;
            }
        }

        return $order;
    }

    public function createItem($order_id, $data)
    {
        //Do insert proccess and then return the response array
    }

    public function updateItem($id, $data)
    {
        //Do update proccess and then return the response array

    }
}

Leyendo observarán que es un plugin de WordPress donde la clase WD_API_LOADER registra los hooks mencionados anteriormente, para inyectar en el momento que Woocommerce carga sus clases del API, las clases que instancia los procesos personalizados a ser implementados en el API.

Al final es recomendable instanciar la clase en un objeto, de este modo es posible acceder a los métodos de forma global desde plugines externos, como por ejemplo para detener la carga de las clases o implementar modificaciones permitiendo dar mayor flexibilidad al plugin.

Clase con los métodos de la API REST

El siguiente paso corresponde a crear la clase que responde a las peticiones HTTP del API. En este ejemplo, se define una constante con el PATH personalizado y en el constructor se definen las rutas personalizadas y el método que se debe llamar que responderá a la petición realizada. Si observas, el parámetro recibido es un array donde la llave representa la ruta relativa del API y como valor, otro arreglo con el nombre de la función a procesar la petición y las banderas del tipo de petición. Estas últimas banderas permiten definir el tipo de petición a recibir, por ejemplo
WC_API_Server::READABLE indica que lee datos desde la petición tal como es una petición GET,
WC_API_Server::ACCEPT_DATA permite decir que lea el cuerpo de la petición y permite leer información para peticiones POST y PUT, entre otros.

/**
 * Custom API REST path  class
 *
 * @package MyPlugin
 * @author Skatox
 */
class WC_API_Custom extends WC_API_Resource
{

    const PATH = '/custom';

    /**
     * Function to define each of the custom path
     */
    public function register_routes($routes)
    {
        //GET Request
        $routes[self::PATH . '/orders'] = array(
            array(array($this, 'listShippingOrders'), WC_API_Server::READABLE),
        );

        //POST Request
        $routes[self::PATH . '/orders/(?P<order_id>\d+)/fulfillments.json'] = array(
            array(array($this, 'createItem'), WC_API_Server::CREATABLE | WC_API_Server::ACCEPT_DATA),
        );

        //PUT Request
        $routes[self::PATH . '/variants/(?P<id>\d+).json'] = array(
            array(array($this, 'updateItem'), WC_API_Server::EDITABLE | WC_API_Server::ACCEPT_DATA),
        );

        return $routes;
    }

    public function listShippingOrders($fields = null, $filter = array(), $status = null, $page = 1)
    {
        $wcApiOrders = new WC_API_Orders($this->server);
        $orders = $wcApiOrders->get_orders($fields, $filter, $status, $page);

        //Removes orders without shipping methods
        foreach ($orders['orders'] as $key => $oreder)
        {
            if (empty($oreder['shipping_methods'])) {
                unset($oreders['orders'][$key]);
                continue;
            }
        }

        return $order;
    }

    public function createItem($order_id, $data)
    {
        //Do insert proccess and then return the response array
    }

    public function updateItem($id, $data)
    {
        //Do update proccess and then return the response array

    }
}

Una vez que proceses la petición, si necesitas devolver un objeto JSON, simplemente debes retornar un array con la información deseada y automáticamente Woocommerce se encargará de transformarlo en un objeto JSON e imprimirlo en la salida.

Recomendaciones

Como podrás observar, no es difícil. En caso que no sepas como desarrollar debido a la poca documentación. Te recomiendo leer el código fuente de las clases del API de Woocommerce, son fáciles de entender, creadas por el mismo equipo del plugin y verás como están creados los métodos existentes. Una de las mejores clases para guiarte, es la de productos que se encuentra ubicada en la ruta wp-plugins/woocommerce/includes/api/class-wc-api-products.php, pues es muy completa y posee todas las operaciones REST soportadas.

Recuerda crear un plugin para esto, evita colocarlo en el functions.php pues será difícil de mantener y dificulta migrar de tema (porque el API dependerá de ésta). Finalmente, recuerda respetar el estándar REST, he visto gente que implementa todo en POST y agrega incompatibilidades a aplicaciones.

Ya depende de tu imaginación, descubrir como extender las funcionalidades de WooCommerce a través de un API REST personalizado.

2 comentarios