API's fluidos (Ejemplo en Java-Android context)

API's fluidos (Ejemplo en Java-Android context)

Motivación

Somos nuevos desarrollando para Android y los mas normal es que tarde o temprano tengamos que interactuar con un servidor vía http, buscamos en google[1] y veremos algo como esto :

                public static void connect(String url)
                {
                
                    HttpClient httpclient = new DefaultHttpClient();
                
                    // Prepare a request object
                    HttpGet httpget = new HttpGet(url); 
                
                    // Execute the request
                    HttpResponse response;
                    try {
                        response = httpclient.execute(httpget);
                        // Examine the response status
                        Log.i("Praeda",response.getStatusLine().toString());
                
                        // Get hold of the response entity
                        HttpEntity entity = response.getEntity();
                        // If the response does not enclose an entity, there is no need
                        // to worry about connection release
                
                        if (entity != null) {
                
                            // A Simple JSON Response Read
                            InputStream instream = entity.getContent();
                            String result= convertStreamToString(instream);
                            // now you have the string representation of the HTML request
                            instream.close();
                        }
                
                
                    } catch (Exception e) {}
                }
                
                    private static String convertStreamToString(InputStream is) {
                    /*
                     * To convert the InputStream to String we use the BufferedReader.readLine()
                     * method. We iterate until the BufferedReader return null which means
                     * there's no more data to read. Each line will appended to a StringBuilder
                     * and returned as String.
                     */
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    StringBuilder sb = new StringBuilder();
                
                    String line = null;
                    try {
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    return sb.toString();
                

Al ver eso pensamos bueno es Java es de esperarse porque google no uso *inserte lenguaje nuevo aquí* para el desarrollo de aplicaciones, bla , bla. Al final tenemos que ponernos a la tarea de lidiar con eso, decidimos hacer un pequeño api http para integrarlo a nuestra aplicación.

Solución Procedimental

Podemos hacer un método por cada método http que necesitemos y enviarle una lista de parámetros y headers, quedando algo así :

                public class Rest{
                
                        public static get(String url,List<NamePair> params,List<NamePair> headers){
                                // hacer la llamada get
                        }
                
                        public static post(String url,List<NamePair> params,List<NamePair> headers){
                                // hacer la llamada post
                        }
                
                }
                

Bueno no luce tan mal(right), veamos como seria un cliente de eso

                List<NamePair> params = new ArrayList<NamePair>();
                params.add(new BasicNamePair("key1","value1"));
                params.add(new BasicNamePair("key2","value2"));
                
                List<NamePair> headers = new ArrayList<NamePair>();
                headers.add(new BasicNamePair("key1","value1"));
                headers.add(new BasicNamePair("key2","value2"));
                
                String response = Rest.get(URL_BASE,params,headers);
                
                

Bueno peor de lo que se esperaba, que tal si no confundo el orden de los parámetros o si quiero agregar otro parámetro. En definitiva este código es propenso a errores y difícil de extender.

Solución Orientada a Objectos

Pensamos bueno Java es OO que tal si abstraemos la combinación de url, parámetros y headers en un objecto llamado "Request"

                public class Request{
                        private String url;
                        private List<NamePair> params;
                        private List<NamePair> headers;
                
                        public Resquest(String url){
                                this.url = url;
                        }
                
                        public void addParam(String key,String value){
                                params.add(new BasicNamePair(key,value)); 
                        }
                
                        public void addHeader(String key,String value){
                                headers.add(new BasicNamePair(key,value)); 
                        }
                        
                        //otras cosas
                
                }
                
                
                public class Rest{
                        
                        public static String get(Resquest request){
                                // la llamada al get
                        }
                } 
                
                //cliente
                
                Request request = new Request(URL);
                request.addParam("key1","value1");
                request.addParam("key2","value2");
                request.addHeader("key1","value1");
                request.addHeader("key2","value2");
                
                String response = Rest.get(resquest);
                
                
                

Un poco mejor, podemos extenderlo simplemente agregándole mas atributos al objecto request pero todavía no se ve una solución del todo elegante(dentro de lo que Java nos deja).

Solución API Fluido(Fluent Interface)[2]

Un API fluido(o Interfaz Fluida) es un patrón de diseño que consiste en encadenar llamadas a métodos, donde un objecto se modifica y retorna así mismo con un fin definido. En este caso el fin es enviar parámetros opcionales y finalmente enviar el request.
                public class Rest{
                        private String url;
                        private List<NamePair> params;
                        private List<NamePair> headers;
                
                        private Rest(String url){
                        }
                
                        public static Rest client(String url){
                                new Rest(url);
                        }
                
                        public Rest param(String key,String value){
                                this.params.add(new BasicNameValue(key,value));
                                return this;
                        }
                
                        public Rest header(String key,String value){
                                this.headers.add(new BasicNameValue(key,value));
                                return this;
                        }
                
                        public String get(){
                                //hacer la llamada get
                        }
                
                }
                 
                //Cliente
                
                String response = Rest.client(URL)
                                      .param("key1","value1")
                                      .param("key2","value2")
                                      .header("key1","value1")
                                      .header("key2","value2")
                                      .get();
                
                

Mucho mejor, si quisieras extenderlo como por ejemplo depurar(debug) las llamadas o integrarlo a un json parser(eg gson) después de modificar la clase Rest tu cliente podría quedar algo así.

                User user = Rest.client(URL)
                                .param("id","V-111111")
                                .header("Autorization","1234")
                                .debug()
                                .from(Json.class)
                                .to(User.class)
                                .get();
                
                

Fluent Interface se puede aplicar en cualquier lenguaje, de hecho JQuery sigue fuertemente este patrón de diseño. Usado apropiadamente puede simplificar considerablemente la forma de interactuar con tu código.

RubyTips para Principiantes

  • Cuando corres una aplicacion ruby, un objeto llamado main es creado automaticamente y este objeto provee acceso a metodos del Kernel como puts y gets.

  • La diferencia entre puts y print es que puts añade un salto de linea al final mientras que print no.

  • Si creas un objeto de una clase vacía, este objeto heredara algunos metodos de la clase Object. Puedes ver los metodos disponibles haciendo miObjeto.methods.

                    class NuevaClase
                    end
                    
                    miObjeto = NuevaClase.new
                    miObjeto.methods
                    
                    => ["inspect", "tap", "taguri=", "emacs", "clone", "public_methods", "__send__",
                    "object_id", "instance_variable_defined?", "equal?", "freeze", "to_yaml_style", 
                    "extend", "send", "methods", "to_yaml_properties", "hash", "nano", "dup", "to_enum",
                     "instance_variables", "eql?", "instance_eval", "id", "singleton_methods", "mate",
                     "taint", "enum_for", "frozen?", "instance_variable_get", "to_yaml", "instance_of?",
                     "display", "to_a", "method", "vi", "type", "instance_exec", "protected_methods", 
                    "==", "===", "mvim", "instance_variable_set", "kind_of?", "respond_to?", "to_s", 
                    "class", "vim", "private_methods", "=~", "tainted?", "__id__", "untaint", "nil?", 
                    "ed", "taguri", "is_a?"]
                    
  • Cuando llamamos con la palabra super a un método de una clase padre sin pasarle ningún argumento, todos los argumentos recibidos en la clase hijo son enviados al padre

  • La clase Dir de ruby, que es usada para realizar operaciones en directorios, tiene un método que devuelve un arreglo con los nombres de los archivos de un directorio

                    Dir.entries '/'
                    
                    => ["sbin", "selinux", "mnt", "boot", "proc", "vmlinuz.old", "home", "vmlinuz", "media", ".", "usr", "var", "lost+found", "opt", "dev", "etc", "srv", "sys", "..", "bin", "data", "initrd.img.old", "initrd.img", "tmp", "lib", "cdrom", "root"]
                    
  • Si quieres comentar varias lineas de código ruby puedes colocar =begin al principio del texto y =end al final (ambos begin y end deben estar alineados a la izquierda)

                    =begin
                    Esto es
                    un comentario
                    multilinea
                    =end
                    
  • Las variables en ruby NO son objetos. En vez de eso, las variables son referencias a objetos que están en el heap pool

  • Al interpolar variables de instancia no necesitas escribir los corchetes

                    @myVar = "Oscar"
                    puts "Hello @myVar" 
                    # Hello Oscar
                    

Tags: ruby

ChucK, un lenguaje de programación para músicos

Para quien no lo conoce, ChucK es un lenguaje de programación, multiparadigma, concurrente, “on the fly” orientado a la ejecución, sintetización y manipulación de audio, mediante diferentes ondas y osciladores predefinidas para ello.

Fue desarrollado por Ge Wang, y es ampliamente usado en diferentes dispositivos y aplicaciones enfocadas en sonido. La sintaxis es bastante simple, con una similitud bastante considerable (cómo no) a la de C, y con la inclusión de un operador de asignación conocido como Chuck (=>). En su sitio oficial, pueden encontrar diferentes paquetes para la instalación/compilación del lenguaje y un pequeño IDE llamado MiniAudicle para diferente plataformas. En Mac y en Windows la cosa es bastante sencilla de instalar, pero en Linux, hay que realizar la compilación desde el código fuente mismo.

La documentación es bastante amplia y actualmente, el sitio web de coursera ofrece un curso online (Aquí)., teniendo como tutor al mismo Ge Wang y a Ajay Kapour, un programador bastante experimentado en la música y en la sintetización de sonido, e inclusive ha trabajado en orquestas integradas con robots programados para producir sonido.

Es bastante interesante, y no tan complicado. Para quien le guste la música y sea programador es un proyecto interesante para revisar. Les dejo un video con un review del lenguaje por el mismo Ge Wang:


Demostración Ajay Kapour

Tags:

Hackaton Ciudades Digitales - 30 de octubre, Caracas

El miércoles 30 de octubre de 2013 reuniremos a un montón de desarrolladores talentosos para hacer lo que mejor saben: crear soluciones.

Los developers se reunen durante 12 horas en equipos de 3 o 4 personas para trabajar en una aplicación que cambie el día a día de los que compartimos esta ciudad. Este evento es organizado por 4Geeks junto a la Fundación Ciudades Digitales y otras empresas de tecnología como Escuela Web, Grupo Intech Solutions, Nimbox y Massiva Movil.

Los desarrolladores tendrán el reto de desarrollar en sólo 12 horas el MVP de una aplicación web o móvil usando las tecnologías, frameworks y librerías que prefieran para resolver algún problema de la ciudad.

El 30 de octubre estarán los developers con proyectos y otros desarrolladores que serán mentores de los equipos para apoyarlos. Además tendremos:

Intraffic: API pública de tráfico en tiempo real reconocida como Caso de Éxito por Google BigQuery.

Massiva Movil: API de envío y recepción de SMS

Twitter: API como fuente de información para calidad de servicios públicos, noticias en tiempo real y millones de informaciones de distintas fuentes.

El Hackatón tendrá lugar en el marco del 3er Encuentro Nacional de Ciudades Digitales e Inteligentes que tiene como tema principal el emprendimiento tecnológico y se llevará a cabo en el Centro Cultural Chacao el 30 y 31 de octubre de 2013.

¿Crees que puedes lograrlo? Nosotros creemos que los desarrolladores podemos cambiar el mundo con una línea de código a la vez.

Inscríbete en http://ciudadesdigitales.org.ve

Tags: eventos

Detras del control - Un podcast sobre video juegos

Detrás del Control es un podcast sobre video juegos hecho por David Morón @davidmoron lleva 3 episodios, dos en audio y uno en video pues fue un hangout, recomiendo lo escuchen y lo sigan, hay muchos tips para desarrolladores

Detras del Control Podcast - E01 - Playstation 4 vs Xbox One

Detras del Control Podcast - E02 - Por dónde empezar si quiero hacer un juego?

Detrás del Control Podcast E03 - Universidades de Video Juegos

Tags: general

Conociendo Developers - Juan Andres Lagrange @jalagrange de Akdemia @akdemiaVE

¿Quién es Juan Andres Lagrange?

Nací en el año 1986 en Caracas, Venezuela. Estudié 3 años de Ing. Electrónica en la Universidad Simón Bolívar y luego me cambié a Ing. de Computación de la Universidad Metropolitana. Comencé a desarrollar cuando tenía 16 años y trabajaba con mi tío, principalmente aprendí HTML, CSS, algo de Perl y ActionScript (Flash). Con el pasar del tiempo migré a PHP y a los 19 monté una pequeña compañía de Desarrollo Web junto con mi actual socio llamada Orbits Creations. Luego de trabajar por 2 años en Orbits, cerramos la empresa y nos dedicamos a terminar los estudios (aunque nunca dejamos de matar tigres). Antes de graduarme hice mi pasantía en el PIC (Port de Informció Científica) en Barcelona, España e hice el programa de Lidera creado por la fundación Futuro Presente (Muy recomendado). Mi tesis la desarrollé en Ruby on Rails y lo utilice para familiarizarme un poco más con el framework y apenas me gradué empecé a trabajar en Akdemia que en aquel momento empezó llamándose "TuColegiOnline". Desde hace 2 años he estado dedicado full time a Akdemia y en un punto me involucré con un proyecto llamado Educredit que estaba desarrollando mi hermano. (www.educred.it).


¿Cmo aprendiste a programar?

Aprendí a programar gracias a mi tío Gustavo Delfino. Comencé ayudándolo a mejorar la imagen de algunas páginas en que estaba trabajando (el diseño nunca ha sido su fuerte). El me dio un libro de HTML y otro de CSS y me puse a practicar y a aprender. Era el año 2002 y realmente no se contaban con tantos recursos como hoy en día. (Coursera, CodeAcademy, CodeSchool, etc). Las páginas que el desarrollaba usaban Perl de backend así que de HTML y CSS no me quedó otra que aprender algo de Perl. De ahí en adelante empecé a explorar con ActionScript para aprovechar las bondades e interacciones que tenia flash en el momento y de ahí pasé a PHP para finalmente enamorarme de Ruby y de RoR.


¿Cuál es la historia detrás de Akdemia?

Akdemia nace en el año 2011 luego de que mi actual socio Carlos Inguanzo se me acerca y me pide que revise las soluciones y plataformas existentes para los colegios. Luego de investigar un poco, concluimos que podíamos ofrecer una solución superior a lo que se encontraba en el mercado y así decidimos comenzar Akdemia.

Akdemia es una servicio de gestión escolar que integra a la comunidad educativa y agiliza su comunicación.


¿En cuestiones técnicas cuáles son las tecnologías usadas en Akdemia?

Akdemia utiliza tecnología de última generación para el despliegue de su plataforma. Ha sido totalmente desarrollado por ingenieros venezolanos sobre Ruby on Rails (http://rubyonrails.org) un framework moderno de desarrollo open source. Para conocer un poco más de su arquitectura, debemos mencionar que su base de datos se encuentra en PostgreSQL, una solución que es considerada como estándar en las aplicaciones modernas más robustas del día de hoy. Su despliegue se hace mediante una plataforma como servicio (PaaS) llamada Heroku que a su vez utiliza los servicios y servidores de Amazon como infraestructura.

En Akdemia debemos garantizar el funcionamiento de la plataforma las 24 horas al día, los 365 días del año y es por eso que contamos con distintos servicios externos que no sólo nos alertan cuando ocurre un error en el servidor como Airbrake (www.airbrake.io), sino que también monitoreamos constantemente los tiempos de respuesta de nuestros usuarios para garantizar una respuesta rápida a través de New Relic (www.newrelic.com). Por otro lado nos gusta mantener nuestros logs del servidor durante meses, garantizando que si lo necesitamos, podemos revisar luego de semanas de ocurrido, un incidente especifico del servidor y es por ello que nos apoyamos con Logentries (www.logentries.com).

La seguridad es uno de nuestros pilares fundamentales y es por ello que nos adherimos a los más estrictos lineamientos de seguridad informática. Entre las medidas que tomamos se encuentra el respaldo diario de nuestra base de datos así como la encriptación de la conexión mediante certificados SSL.

Adicionalmente revisamos constantemente las buenas prácticas que pueden prevenir ataques como SQL injection, XSS (Cross Site Scripting), Cross Site Request Forgery y otros tipos de ataque, y revisamos constantemente el código utilizando Code Climate (https://codeclimate.com).

Para trabajar de manera organizada, nuestro equipo de desarrollo utiliza Pivotal Tracker (www.pivotaltracker.com), que nos mantiene a todos informados de sus tareas, iteraciones y prioridades. Por supuesto que todo utilizando Git (http://git-scm.com) como sistema de control de versiones y Github (www.github.com) para almacenar y centralizar el repositorio.

Estas son sólo algunas de las herramientas que usamos en Akdemia para garantizar un servicio que siempre se encuentre en la vanguardia tecnológica.


¿En tu opinión porque es tan difícil conseguir datos estadísticos sobre información de cualquier sistema en Venezuela, y que se podría hacer para facilitar esto?

Realmente no me considero un experto en la materia y ni siquiera sabía que era difícil conseguir datos sobre cualquier sistema en Venezuela. Para generar transparencia en general hace falta que más personas sepan de una materia en específica y exijan la información correcta bajo argumentos bien fundamentados, no se si es extrapolable a la pregunta.


¿Tienes algún proyecto que realices fuera de tu trabajo como hobby relacionado a la tecnología?

Actualmente estoy 100% dedicado a Akdemia y tengo muy poco tiempo para otras cosas. Sin embargo siempre aconsejo a las personas que se me acercan con un proyecto de tecnología y trato de encaminarlos en la dirección correcta.


¿Qué hardware usas?

Mi computadora en la oficina es una iMac 27' del 2011. Pero igual cuento con una portátil y un iPad. (Desde los años 90 soy mac fan)


¿Qué software usas?

Para programar uso Textmate, SequelPro para MySQL, Navicat si es PostgresSQL. Firefox y Firebug para frontend. Omnigraffle para diagramar... Seguro se me esta escapando algo pero esos son los que más utilizo.


¿Tienes perfil de github o librerías de código liberados que quieras compartir?

Mi perfil de github es jalagrange y hay algunos proyectos sencillos que he compartido principalmente para aprender alguna funcionalidad o el correcto uso de una gema como por ejemplo para exportar archivos en excel. No son librerías como tal, proyectos didácticos que los hice para aprender yo y luego los compartí.


¿Qué tip o consejo le darías a una persona que se esté iniciando en la programación?

Le recomendaría que practique y juegue bastante con las herramientas. Existen muchísimas fuentes de información super didácticas como CodeSchool, CodeAcademy, Coursera, Railscasts, Rails Tutorials, etc. Que se ponga a aprender y a jugar con ellas y luego que empiece practicando con cosas que le llamen la atención. Si realmente le gusta y quiere subir de nivel, me parece importante que se busque alguien que tenga más experiencia y le sirva de mentor. En la programación nunca se termina de aprender y hay que estar todos los días viendo cual es la nueva gema, versión, tendencia, etc. Así que me parece importante tener a alguien que te pueda ir guiando y recomendando blogs y artículos. Y en su próxima etapa ingresar a un equipo de desarrollo. Las dinámicas de desarrollo en equipo cambian totalmente cuando se trabaja en equipo; las convenciones y el orden cobran mucha más importancia y es algo que solo se aprende haciéndolo.


¿Qué crees que hay q hacer / hace falta hacer como comunidad para animar a los programadores?

Eventos como el CCS Tech Meetup y el Startup Weekend con seguridad ayudan. Sin embargo el problema en mi opinión es mucho más profundo. Creo que hay un problema de infraestructura y de cultura que está causando que los desarrolladores no quieran vivir en Venezuela. Desafortunadamente un desarrollador venezolano gana sólo una fracción de lo que gana en el exterior y dado que es un lenguaje universal, el mejor talento tiende a irse. Por otro lado las universidades son muy recelosas a trabajar con la empresa privada lo cual creo que es un enorme error. Si bien es cierto que están activamente ayudando a sus estudiantes a conseguir pasantías en el sector privado, al momento de colaborar para generar laboratorios, cursos y proyectos en conjunto, se complica. Creo que el mejor ejemplo de colaboración entre el sector universitario y privado son los MIT Labs, en el cual las empresas buscan a la universidad para que les ejecute proyectos reales y les paga por ello. De esta manera se establece un ganar ganar, tienes profesores universitarios que no se desactualizan ni pierden el sentido de lo que hay en la calle, tienes estudiantes que también tienen un contacto con la realidad y tienes a la empresa privada que puede ejecutar proyectos ligeramente más barato que lo que le saldría fuera de la universidad.


¿En qué comunidades online y offline participas activamente?

Stackoverflow es sin duda en la que más participo, pero también suelo reportar bugs a Github. Offline pertenezco a Wayra y suelo ir a las charlas que invitan de vez en cuando así como me gustaría apoyar y pertenecer de manera más activa al CCS tech Meetup.

Tags: general

Chrome Dev Tools el editor para programar

Despues de ver estos dos videos de los nuevos features de Chrome Dev Tools no me queda duda que Chrome esta llevando a los desarrolladores mas y mas a usar solo su ChromeBook, muchas facilidades para nosotros.

Tags: general

Aplicación Java - Para el registro y control de becas

Hola a todos hoy quiero mostrarle otra aplicación de escritorio desarrollada en java, con una Gui hecha con Qt-jambi, no voy alarga mucho sobre el tema de qt ya que antes ya publique otra aplicación usando estas, bueno dejare un vídeo en el cual plasmo todas las características del sistema. Para que me den sus opiniones y sugerencias. d

Seguir leyendo...

Tags: java

Aprendiendo Python: Ejecuta tus aplicaciones web en el escritorio (Python + WebKit + GTK)

La idea es simple, el script es simplemente un mini navegador, con la URL de la aplicación asignada como parametro al instanciar la clase principal. Todo esto ejecutado en un webview del motor de renderizado WebKit(Usado por Chrome, Safari y más recientemente Opera) sobre un ScrolledWindow en un frame sencillo programado con GTK. Debo decir que si bien empiezo el estudio de este lenguaje de programación, no es para nadie un secreto de la potencia increíble que ofrece, además de todas las implementaciones sencillas que definen claramente este lenguaje de alto nivel. En la página oficial de pywebkitgtk,  se deja un ejemplo del desarrollo de un navegador completo, haciendo uso de estas mismas herramientas (Descárguenlo antes de que google code cierre las descargas). Habría que estudiar la documentación a fondo o descargar aplicaciones con estas implementaciones para realmente sacarle el jugo a WebKit. Sin más, les dejo el código:
 
                #!usr/bin/env python
                
                import gtk
                import webkit
                
                class AppWeb2Desktop():
                
                        def __init__(self, initURL, titulo):
                            self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
                            self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
                            self.window.set_default_size(1024, 768)
                            self.window.set_title(titulo)
                            self.window.connect('delete_event', self.cerrar)
                            vbox = gtk.VBox(spacing=5)
                            vbox.set_border_width(5)
                            self.webpanel = webkit.WebView()
                            self.Panel = gtk.ScrolledWindow()
                            self.Panel.add(self.webpanel)
                            vbox.pack_start(self.Panel, fill=True, expand=True)
                            self.window.add(vbox)
                            self.url = initURL
                
                        def mostrar(self):
                            self.window.show_all()
                
                        def abrirURL(self):
                            self.webpanel.open(self.url)
                
                        def cerrar(self, widget, event, data=None):
                            gtk.main_quit()
                
                gtk.gdk.threads_init()
                obj = AppWeb2Desktop('http://127.0.0.1/SCE/',
                    'Sistema de Inscripcion Estudiantil')
                obj.mostrar()
                obj.abrirURL()
                gtk.main()
                
                 
Como ven, es una clase simple,los dos parámetros para la creación del objeto son la URL de la aplicación y el título de la ventana GTK. Para los imports descarguen las librerías correspondientes, aunque no debería existir ningún problema en cualquier distribución linux. ¿Cuál es la utilidad de esto?, pues, a mi parecer, es una buena idea para presentar la aplicación al usuario final, aparte de ser excelente si la aplicación corre de manera local. Además es posible aprovechar para inicializar otro proceso antes de ejecutar la aplicación web. Capturas de una aplicación sencilla corriendo usando el script: Captura de pantalla - 260513 - 17:06:22
Captura de pantalla - 260513 - 17:06:42 Acá el código para descargar Acá un ejemplo más completo