Tag: Web

Linkero – Creación de APIs RESTful en Python (parte 1)

Según vas cogiendo experiencia como desarrollador de software te vas dando cuenta del verdadero significado de "No reinventar la rueda". Debido muchas veces a la falta de tiempo, es casi obligatorio buscar soluciones desde las que partir, o buscar integraciones de software que permitan alcanzar el objetivo marcado.

No obstante la mayoría se suele quedarse ahí y se contentan con reutilizar "piezas". El siguiente paso lógico y racional para ahorrar trabajo, pasa por diseñar. Por pensar y configurar un diseño que sea lo más generalista posible para que abarque el mayor número de casos de uso. Esta parte de diseño (y preferiblemente buen diseño) no suele ser frecuente entre desarrolladores, ya que suele implicar el gasto de más tiempo para ahorrarlo en un futuro. Debido a eso suele ser complicado trasladar a la dirección o al jefe inmediatamente superior y responsable del desarrollo, la necesidad de invertir más tiempo en un desarrollo para ahorrarlo en un futuro.

Hoy os traigo un caso de esos, en los que se juntan "piezas" y se refuerzan con un diseño para conformar una librería que ayude a un desarrollo más ágil, sujeto a un diseño flexible. Su nombre es Linkero:

https://github.com/RDCH106/linkero

link_slash

Linkero es un framework que permite la creación de manera sencilla de APIs RESTful para peticiones externas. Esta desarollado en Python y su diseño hace hincapié en los siguientes puntos:

  • Propósito general --> Se puede usar para cualquier tipo de API RESTful
  • Modular --> Se pueden agregar las API como si de módulos se tratasen quedando separadas del core de Linkero
  • Escalable --> Se pueden añadir nuevas APIs
  • Seguro --> Permite autenticar las peticiones por usuario y contraseña o mediante token de seguridad
  • Sencillo --> La codificación de las APIS y su securización es fácil de implementar.

La verdad es que originalmente el nombre de Linkero venía de link (unión en inglés) y el sufijo ero (que viene a significar "el  que"), es decir, el que une. Con el tiempo le vi una segunda connotación que tenía relación con el personaje Link de "The Lengedn of Zelda" y el juego de palabras link + hero (unión + héroe).

Como desde hace un tiempo, pienso que el Open Source es una vertiente totalmente Win&Win, decidí liberar el código fuente cuando consideré que el código estaba lo suficientemente maduro para empezar a recoger aportes. Uno de los mejores puntos que tiene el Open Source es su escrutinio público que ayuda a revelar fallos y la aportación de mejoras por otros usuario o empresas que usen dicho código y hayan implementado mejoras. Por contra, existe muchos usuario y sobre todo empresas que usan Open Source, pero no devuelven absolutamente NADA, si la licencia que acompaña el software lo permite. Es lícito hacerlo, no obstante la contrapartida real, es que tras cada mejora en el proyecto principal que se quiera integrar, resulta exponencialmente más difícil, ya que la mejoras introducidas no liberadas, pueden provocar divergencias con las actualizaciones y el diseño oficial.

Desde hace tiempo tengo la convicción de que en software, no se debería vender software tal cual, sino servicio, vender soluciones en vez de productos. Un mismo software o producto puede aplicarse para proveer diversidad de soluciones a problemas distintos e integrarse con otras tantas soluciones diferentes para solventar retos mayores. Esto es una visión totalmente personal ya que como Ingeniero Informático, lo he podido comprobar. El software es una herramienta. Yo proporciono soluciones a través de mi herramienta principal que es la creación de software y a su vez también uso software de terceros para proveer soluciones. Aclarada la visión personal y profesional de mi campo, volvamos al tema principal de la entrada 😉 .

Linkero cuenta con el siguiente diseño general:

linkero_general-scheme_800x600

Y hace uso de las siguientes librerías:

El esquema conceptual de dependencias refleja como únicas dependencias para crear una aplicación, el uso de Linkero y el uso de todas las APIs desarrolladas para Linkero que se quieran incluir. Linkero a su vez hace uso de las anteriormente citadas librerías. A su vez hace falta un "MAIN" que cargue las APIs y las ponga en funcionamiento con Linkero

Teniendo en mente el esquema puedes instalarte Linkero siguiendo las indicaciones de la Wiki:

https://github.com/RDCH106/linkero/wiki/instalacion

Si has seguido todos los pasos de la sección de instalación deberías poder probar Linkero usando el ejemplo testBasicAPI ejecutando el "testBasicAPI_main.py" desde Python.  Este ejemplo es una versión simplificada que a efectos ilustrativos no incluye temas de autenticación. Si analizamos el ejemplo, obtendremos la estructura mínima para desarrollar una API con Linkero que no requiera de autenticación.

Primero se importa el core de Linkero:

import core.linkero as linkero

A efectos demostrativos se crea una estructura de tareas pendientes:

# TODOS Data
TODOS = {
    'todo1': {'task': 'build an API'},
    'todo2': {'task': '?????'},
    'todo3': {'task': 'profit!'},
}

Se define una función que maneje las peticiones sobre objetos no existentes y se genera un objeto "parser" para las peticiones, al que se le añade el argumento "task":

def abort_if_todo_doesnt_exist(todo_id):
    if todo_id not in TODOS:
        linkero.abort(404, message="Todo {} doesn't exist".format(todo_id))

parser = linkero.reqparse.RequestParser()
parser.add_argument('task')

Posteriormente definimos los métodos que nos permitan manejar los items de las tareas por separado (métodos GET, DELETE, PUT). Los métodos GET y DELETE hacen  uso del método "abort_if_todo_doesnt_exist" para comprobar que se puede realizar la acción sobre el item específico y PUT hace uso del objeto "parser" para obtener el valor a introducir de la petición:

# Todo
# shows a single todo item and lets you delete a todo item
class Todo(linkero.Resource):
    def get(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        return TODOS[todo_id]

    def delete(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        del TODOS[todo_id]
        return '', 204

    def put(self, todo_id):
        args = parser.parse_args()
        task = {'task': args['task']}
        TODOS[todo_id] = task
        return task, 201

Es habitual ofrecer métodos que nos permitan manejar conjuntos de items. Por ello se definen métodos como pueden ser GET (obtener todas las tareas) o POST (incluir un grupo de tareas):

# TodoList
# shows a list of all todos, and lets you POST to add new tasks
class TodoList(linkero.Resource):
    def get(self):
        return TODOS

    def post(self):
        args = parser.parse_args()
        todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
        todo_id = 'todo%i' % todo_id
        TODOS[todo_id] = {'task': args['task']}
        return TODOS[todo_id], 201

Una vez definida los métodos que permiten operar con la API, se define un método "loadTestBasicAPI" que asocia un patrón de URL a los métodos definidos:

##
## Actually setup the Api resource routing here
##
def loadTestBasicAPI():
    linkero.api.add_resource(TodoList, '/todos')
    linkero.api.add_resource(Todo, '/todos/<todo_id>')

Con la API completamente definida sólo queda cargarla y ejecutarla con Linkero mediante un "main.py" (para nuestro ejemplo es el "testBasicAPI_main.py"). Para ello se importa el core de Linkero y nuestra API (paso 1 y 2), se carga la API con el método "loadTestBasicAPI" (paso 3) y se invoca el método "run" de Linkero (paso 4):

# 1) Linkero Core
import core.linkero as linkero

# 2) APIs developed to use with Linkero
import examples.testBasicAPI

# 3) Load desired APIs
examples.testBasicAPI.loadTestBasicAPI()

# 4) Run Linkero
linkero.run()

Con estos simples pasos es posible realizar una API RESTful, definiendo la interfaz de la misma y su lógica en cómodos ficheros que pueden ser cargados y lanzados por Linkero. En la segunda parte de esta entrada se ahondará en la securización de la API, así como los aspectos que no se han podido tratar en esta primera parte.

Diaspora* – Una Red Social de Todos y para Todos

Está claro que actualmente la información es poder y dinero, pero mientras el poder está limitado por leyes que marcan las reglas de nuestra sociedad, el dinero y la capacidad de enriquecerse en los modelos económicos capitalistas no está tan limitada, ni legislada.

Modelo actual de las Redes Sociales

Actualmente el modelo de explotación más rentable para el modelo hegemónico basado en la información, es la red social. Existen infinidad de ellas, mayoritariamente de carácter gratuito para la totalidad de su uso, como pueden ser Facebook, Twitter, Google+... Y son precisamente gratuitas, por la contraprestación que reciben ellos por el uso de esas redes sociales, son nuestra información, datos de actividad dentro de la red, preferencias... En este tipo de modelos que aparentemente son gratuitos, debéis recordar que no hay nada gratuito y que si lo es, el producto sois vosotros. En cualquier caso debéis ser consciente de lo qué dais a cambio del uso de este tipo de servicios.

Jail-facebook-twitter

Debéis recordar también que la protección de datos y la transferencia de datos e información en servicios web, como son las redes sociales, varía de acuerda a la legislación a la que se acoja la empresa desde donde opera. Por ejemplo Facebook se atiene a esta máxima y durante la apertura de una cuenta en su acuerdo de confiencialidad aclara que "el contenido que subas y compartas  son de Facebook". Obviamente puedes pedir la retirada de fotos o darte de baja de la red, pero Facebook sólo se limita a dejar de hacer público el contenido, guardánsose los datos, información y perfil obtenido durante el uso de la cuenta (que en muchos casos es suficiente para describir a una persona de manera unívoca).

Recientemente Facebook ejecutaba su giro maestro que le permitirá seguir creciendo, refinanciarse y por consiguiente tener más valor. Esto ha sido gracias a los nuevos términos de la política de privacidad de Whatsapp que permiten compartir tu número de teléfono y conexiones con Facebook. Está claro! Facebook no compró Whatsapp por ser la mejor aplicación que había, sino por sus usuarios, Ahora quiere engrosar sus filas en Facebook que es la empresa matriz que cotiza en bolsa.

Es evidente  que estos modelos de negocio convierten una necesidad de socializar de las personas, en una forma muy rentable de hacer dinero. Se basa en tenernos el mayor tiempo posible dentro de la red para generar más dinero, a costa de la información que desprendemos y así llenarnos de publicidad, colocarnos productos e invadir nuestra privacidad de manera no deseada, o por lo menos no explícitamente consentida. Pero, y si ¿habría otra forma?

social-media-rubik-cube

Diaspora* como Alternativa

Desde hace unos años se ha venido trabajando en lo que se denomina red social distribuida, un modelo que tiene bastante en común con las redes P2P que ofrecen una descentralización del servicio, otorgando poder al usuario y a la comunidad de desarrolladores. La red social más representativa de este paradigma es Diaspora*.

Los pilares de Diaspora* son seis:

  1. Descentralización: En lugar de tener la información de todo mundo contenida en enormes servidores centrales propiedad de un gran corporación, servidores locales("pods") pueden instalarse en cualquier parte del mundo. Tú eliges en qué "pod" registrarte - quizás en un pod local - y conectarte de manera fluida con la comunidad de Diaspora* alrededor del mundo.
  2. Libertad: Puedes ser quien tú quieras en Diaspora*. A diferencia de otras redes, no tienes que usar tu identidad real. Puedes interactuar con quien quieras de la manera que quieras. El único límite es tu imaginación. Diaspora* también es Software Libre, dándote la libertad de usarlo como desees.
  3. Privacidad: En Diaspora* tú eres dueño de tu información. No tienes que renunciar ningún derecho a una corporación o interesés que pudieran utilizarla. ¡Con diaspora*, tus amigos, tus hábitos y lo que compartes es tuyo... no nuestro! Además, tu eliges quién puede ver lo que compartes, por medio de Aspectos.
  4. Aspectos: Diaspora* es pionera en el concepto de aspectos, lo que quiere decir que puedes organizar tus contactos de acuerdo al papel que juegan en tu vida. Esto significa que tú eliges compartir algo sólo con familiares o colegas de trabajo, sabiendo que nadie que no quieras podrá ver lo que publicas.
  5. Características heredadas: Los Hashtags te dan la libertad de etiquetar y seguir tus intereses con facilidad. Puedes llamar la atención de la gente @mencionándola. Volver a compartir las publicaciones que te gustan para que otros puedan disfrutar y comentarlas también. Y mostrar tu aprecio por el trabajo de otras personas con un ♥.
  6. Colaborativo y Open Source: Diaspora* necesita personas que escriban y prueben el código, den la bienvenida y ayuden a los nuevos miembros, instalen y mantengan pods comunitarias, y corran la voz sobre los beneficios de Diaspora* a otros que quieran formar parte. ¿Te gustaría contribuir al proyecto?

Para más información accede a la Fundación de Diaspora*:

https://diasporafoundation.org/about

Adentrarse en Diaspora*

Sabiendo las características y si estás decidido a ser parte de Diaspora*, lo primero que tienes que hacer es elegir tu pod.  Para ello puedes hacerlo de la siguiente lista de pods federados en la red:

https://podupti.me

Como recomendación personal y si no tienes predilección sobre ninguno en especial, te recomiendo:

https://joindiaspora.com

Si quieres sopesar tu elección de acuerdo a datos sobre los distintos pods, puedes obtenerlos en:

https://the-federation.info

Si necesitas más información sobre la elección de tu pod puedes acceder a:

https://wiki.diasporafoundation.org/Choosing_a_pod

En cualquier caso el pod (vaina) donde abraramos nuestra cuenta (semilla), no impide que podamos acceder al contenido generado en otros pods, ni que en un futuro puedas migrar a otro pod si así lo deseas. Con esta metáfora de la diáspora (dispersión), la vaina (núcleos comunitarios) y la semilla (semillas), el proyecto de Diaspora* deja definido metafóricamente su ADN.

Impresiones

Tras unos días de uso de la red social lo primero que llama la atención es que Diaspora* aglutina lo mejor de Facebook y Twitter, pero con el gran detalle de que NO hay publicidad de ningún tipo, ni explícita ni escondida en contenido seleccionado mostrado para tu perfil.

Diaspora_latest

Claramente se apuesta por un empoderamiento de los usuarios y desarrolladores.  Por un lado, en el caso de los usuarios porque pueden elegir cómo y de qué manera quieren mostrar su información , evitando a su vez que la información del perfil del usuario sea substraido por terceras empresas que hagan explotación de los mismos. Por otro lado, los desarrolladores pueden elegir el camino junto a los usuario de manera colaborativa usando plataformas como Loomio, y a su vez cualquier desarrollador puede acceder al código para ejercer todas las libertades del software libre en Github.

Cabe destacar la capacidad de adaptación de la interfaz de Diaspora* a los distintos dispositivos. Particularmente en el caso de la versión móvil,  no hay necesidad de la instalación de una aplicación nativa, aunque también existen aplicaciones nativas para el móvil para quienes lo deseen. En cualquier caso, es la primera red social en la que veo totalmente innecesario el uso de la aplicación nativa. ¡Buen trabajo!

Por último destacar la sección principal de la red social, cuyo contenido va guiado por las etiquetas de nuestro interés que hayamos incluido. Mención especial de la etiqueta #NSFW (Not Safe For Work), que oculta el contenido publicado, hasta que el usuario decida mostrarlo. Una forma de respetar sensibilidades de los potenciales lectores del contenido.

Integram – Integra Telegram en tu flujo de trabajo

En mi día a día tengo que ocuparme de la gestión de varios proyectos software. Para ello me apoyo en las sinergias producidas por el uso de herramientas como Git junto con gestores Web de repositorios Git como GitLab, GitHub o BitBucket. Son herramientas básicas para la gestión de un proyecto software, y más aún si es uno de envergadura con unos cuantos desarrolladores trabajando en él.

El problema de las plataformas como GitLab, GitHub o Bitbucket, es que son herramientas excelentes si estás en frente de un equipo de sobremesa o portátil. Cuando ya entras en flujos de trabajo que puedan conllevar itineraria o simplemente si quieres tener un seguimiento relajado de la evolución del proyecto, hay que acudir a sistema móviles basados en notificaciones.

Alguno ya estará diciendo: para eso ya existe el email. ¡Y le doy toda la razón! Pero quiero ir un paso más allá y manejarme en un sistema más instantáneo como puede ser la mensajería instantánea, como es el caso de Telegram. Esta plataforma ofrece comunicación escrita instantánea y favorece canales de comunicación entre dos o más personas. A esto hay que sumar que actualmente Telegram dispone de versiones que pueden ser consumidas desde un equipo de sobremesa o portátil, y no sólo desde el móvil.

Una de las muchas bondades que tiene  Telegram (te recomiendo que te des una vuelta por https://telegram.org), es que es Open Source y posee una API que permite interactuar con Telegram mediante un sistema de Bots.

La entrada de hoy viene a presentar Integram, un bot que posibilita la interlocución de las plataformas Trello, BitBucket, GitHub, GitLab con Telegram. Si deseas alguna otra integración de otra plataforma, puedes votar para que lo añadan al proyecto, o añadirlo tú mismo contribuyendo al proyecto.

Todos los bots en general funcionan de manera similar:

  • Entras en Telegram y añades Integram como nuevo miembro de un grupo.
  • Una vez añadido el bot, te mostrará las plataformas que pueden ser integradas con un  mensaje de bienvenida.

Integram_info_message

  • Seleccionas la plataforma que quieras integrar dando en el enlace y te pedirá que le indiques un grupo. Selecciona el grupo al que añadiste Integram.
  • El nuevo bot de la plataforma que hayas seleccionado, te mostrará un mensaje de bienvenida con unas instrucciones de configuración. En mi caso he integrado GitLab.

Integram_Gitlab_URL

  • La dirección URL que os muestra, es lo que debéis añadir a vuestro proyecto en la sección de "Web Hooks". Tanto en GitLab como en GitHub se encuentra en "Project Settings" --> "Web Hooks".

integram-screencast3

 

Dependiendo cómo configuremos el Web Hook en la plataforma, nos permitirá lanzar un mensaje al grupo cada vez que haya un "push" al repositorio, se abra un "issue", cuando se añada un nuevo desarrollador... Puede ser tan flexible como uno quiera. ¡Una gozada la verdad!

La integración de este tipo flujos de trabajo, nos permitirá estar al tanto de los cambios del repositorio de nuestro proyecto y comentar, si se desea, con el resto de desarrolladores del proyecto, cualquier cambio del mismo.  Además en mi caso particular, uso Telegram como sustituto natural de Whatsapp, lo que hace que cualquier integración con la plataforma, haga que consuma de manera más fácil y natural dicho contenido.

Consejos para no infectarte con Malware

Es una realidad, a día de hoy Internet está lleno de malware y cuando navegamos es posible que acabemos descargando y ejecutando este tipo de software.

El malware se define como software que tiene como objetivo infiltrase o dañar un sistema de información sin el consentimiento de su propietario. El término se refiere genéricamente a una variedad de software hostil, intrusivo o molesto.

A pesar de tener nuestro sistema actualizado, nuestro navegador actualizado y tener un antivirus protegiendo la última línea de batalla de los dos anteriores, habitualmente puedes llegar a tener infecciones por malware o simplemente tener un falso positivo, que se define como una detección erróneamente clasificada como malware.

Ante el primer caso, mi consejo es el siguiente: evitad la descarga de contenido procedente de enlaces que referencien a un javascript y no muestren la url final del archivo a descargar. Desconfiad de ellos, porque el script os devolverá el archivo a descargar, pero no sabréis de antemano nada sobre el archivo. Esta técnica se suele usar para proporcionar descargas de malware y variar el fichero (normalmente un archivo.zip) que pase desapercibido por el navegador y el antivirus. Esto no quiere decir que haya sistemas que usen un javascript para servir contenidos de manera legítima y benévola, pero por norma general desconfiad.

Para saber que hay un javascript tras un enlace, es tan fácil como hacer click derecho sobre el enlace y selecciona "Copiar dirección de enlace". Si lo copias en un editor de texto os aparecerá algo parecido a esto:

javascript:void(0);

En vez de algo como esto:

https://mascandobits.es/blog/wp-content/uploads/2015/10/mi_descarga.zip

Una forma mucho más preventiva de bloquear estos elementos, es usar programas como NoScript, que nos permite desactivar el código javascript de las webs que visitemos. En el blog de Víctor Goñi tenéis una somera introducción al uso de NoScript.

En el segundo caso de tener un posible falso positivo, yo recomiendo usar el sentido común (que a veces es el menos común de los sentidos 😉 ). Tu antivirus o navegador pueden detectarlo como potencial malware, pero está en nuestra mano descargarlo. En el caso del antivirus podemos desconectar momentáneamente el antivirus para poder descargarlo y en el caso del navegador siempre podremos forzar la descargar o recuperar el archivo. Alguno me dirá: ¡Estás loco hermano! Pues NO. Mientras no ejecutes el archivo o lo descomprimas, estaremos a salvo.

Malware-PC

Alguno a estas alturas estará pensando, cuál el motivo por el que a pesar de un posible falso positivo decido descargar el archivo. Una de las formas de percibir ingresos extra por las compañías que desarrollan los navegadores y los antivirus, es la de provocar falsos positivos en ciertos archivos para que funcione como medida disuasoria para su descarga. Terceras empresas suelen pagar a navegadores y antivirus para mostrar estos avisos, ya que la descarga de dichos archivos son contrarias a su negocio o le provocan directamente pérdidas económicas. Cracks, Keygens, Scene, Descifrado (Desencriptación) de Sistemas de Información, Herramientas de Ingeniería Inversa... son algunos de los muchos ejemplos en los que se puede dar falsos positivos pagados por empresas. Esto no quiere decir que dentro de estos grupos, haya software con malware, que los hay.

Especulaciones a un lado, tenemos nuestro archivo descargado. Para comprobar que no es malware, hay una prueba sencillísima, abre una nueva pestaña y vuelve a descargar el mismo ficheros sin ejecutarlo. Si el fichero se descargar con el mismo nombre (el segundo fichero tendrá el mismo nombre más "(1)"), es probable que no sea malware. No por ello bajaremos la guardia.

Una forma de clarificar la cosa es pedir una o varias opiniones más sobre el posible archivo cargado con malware. Para ello podemos acceder a Virus Total, dónde podremos pedir que varios motores de antivirus analicen el fichero y nos devuelvan el resultado.

Virus-Total-ESP

 

Caso práctico

Personalmente todo esto que os cuento lo puse en práctica al ir a descargar DVDshrink, un software que permite romper el cifrado de los DVDs comerciales para generar copias de seguridad. Al descargar la última versión del programa, tanto el navegador como el antivirus saltaron.

Inmediatamente comprobé que la descarga del archivo usaba un enlace con javascript. Tras descargarlo una segunda vez, el nombre del archivo cambiaba. Con lo que acudí a Virus Total en busca de respuestas.

malware-malicious-virus

El primer archivo arrojó el siguiente análisis:

Primer análsis (2016-05-08 09:10:57 UTC)

El segundo archivo lo analicé en otro día distinto y no me lo relacionó con el primero que subí:

Segundo análisis (2016-05-11 11:03:18 UTC)

Virus Total genera un SHA256 que identifica unívocamente al archivo, y en este caso no había relación con el primero que subí. Además de todo ello, los resultados variaban y para colmo había alrededor de un 50% de resultados que decían que no era malicioso y el otro 50% decían que sí lo era.

*Nota: Virus Total actualiza los resultados si se vuelve a subir por otros usuarios el mismo archivo

Esto me hizo desconfiar automáticamente. En mi caso basta que 10 de los 56 motores de los antivirus, me devuelvan infección para destruir el fichero sin pensármelo demasiado, si no sé exactamente lo que estoy manejando. El que haya entre 1 y 4 resultados de infección también puede ser que se trate de una infección nueva. En este caso el software ya lo conocía anteriormente y su última versión pone que es del 2014, sería algo raro que tras ese tiempo se tratase de una infección nueva, si hubiese entre 1 y 4 resultados de infección.

Recuerda también que entre los resultados ofrecidos por los distintos motores de los antivirus, puede haber falsos positivos o reportes de infecciones hechos desde la parte heurística de cada motor, que se encarga de detectar posibles amenazas que no estén catalogadas dentro de las bases de datos de cada antivirus.

Al final cada uno tomamos la decisión de ejecutar el archivo y como todo en la vida podemos equivocarnos, a pesar de haber contrastado las fuentes de información para generar una decisión en consecuencia informada y de calidad.