Barceló

jueves, 13 de agosto de 2015

Python: Tutorial básico de la API de Marvel

Tras mucho tiempo parado he decidido volver a escribir en este blog, más que nada porque he estado trasteando con la API que da marvel y he encontrado la documentación un poco confusa, así que me he animado a escribir.

Para empezar, comentar que Marvel ha puesto hace tiempo una API con mucha información de sus cómics, personajes, etc. lo que la hace muy interesante para probar bases de datos y sacar estadísticas y demás.

En primer lugar nos registramos en https://developer.marvel.com y obtenemos una clave pública más otra privada para realizar las consultas a la API.

La petición debe llevar obligatoriamente 3 parámetros: apikey, ts, y hash:
  • apikey es la clave pública.
  • ts es un valor de timestamp, pero si queremos podemos usar un long (en Python todo entero corriente es un long).
  • hash, que se calcula MD5(ts + clave_pública + clave_privada).
Y ahora, esto es un rollo así que vamos a pasar al código que es mucho más bonito:

Para hacer las peticiones he empleado la librería requests (pip install requests), muy recomendable, aunque podríamos usar la librería urllib que viene por defecto en Python. Importamos también la librería hashlib para hacer el cálculo MD5. Primero, las claves públicas y demás:
import hashlib
import requests
public = 'claveprivada'
private = 'clavepublica'
ts = '1'
hash = hashlib.md5((ts + pr + pu).encode()).hexdigest()
Ahora ya podemos hacer las peticiones:
base = 'http://gateway.marvel.com/v1/public/'
comics = requests.get(base + 'comics',
                      params={'apikey': public,
                              'ts': ts,
                              'hash': h}).json()
characters = requests.get(base + 'characters',
                          params={'apikey': public,
                                  'ts': ts,
                                  'hash': h}).json()
wolverine = requests.get(base + 'characters',
                          params={'apikey': public,
                                  'ts': ts,
                                  'hash': h,
                                  'name': 'wolverine'}).json()
Con esto os queda una pequeña chuleta para trabajar con la API de Marvel, aunque si no queréis hacerlo directamente hay varias librerías por ahí, como PyMarvel.

Un saludo a todos!

domingo, 16 de noviembre de 2014

Actualizando Nexus 4 a Android 5 Lollipop, Opiniones



Ayer por fin han liberado la imagen de Android 5 para el Nexus 4. No he podido evitar la tentación de instalarlo sin esperar por la OTA, así que bajé la imagen directamente y la flasheé.

Ojo al dato, no uséis programas como Nexus Root Toolkit y demás, a mí me dieron problemas y me provocó el arranque en bucle del dispositivo (el llamado bootloop). Descargad la imagen, la descomprimís, y ejecutáis el script (.bat en windows, .sh en Linux). Y recordad que borra el teléfono entero, así que hay que hacer copia de los datos, yo recomiendo la herramienta Titanium Backup.

El primer inicio le llevará entre 5-10 minutos, así que paciencia. La verdad me esperaba algo como Kitkat, varios iconos nuevos, alguna chorradita, pero me he quedado gratamente sorprendido en lo poco que lo he usado con las nuevas cosillas que trae. También me parece mentira que para llegar a ellas hiciera falta que estemos casi en el año 2015.
  • Aplicaciones como Chrome o Gmail escritas en código nativo. Caía de cajón hacerlo así, sobre todo en el caso del explorador web, y es que se nota.
  • La máquina virtual ART, que sustituye a DALVIK y promete una mejora de hasta un 4x de velocidad de respuesta.
  • Notificaciones en la pantalla de bloqueo, pudiendo definir qué notificaciones aparecen y cuáles no (para evitar mostrar datos de carácter sensible). Es muy muy cómodo.
  • Mejora de la cámara, más opciones como control de lente, flash, imágenes en RAW...
  • Modo ahorro de batería (y yo diría que más batería, porque ayer me aguantó toda la noche con un 15%, y antes ni de coña).
  • Muchas más cosillas: http://www.android.com/versions/lollipop-5-0/
Yo sinceramente estoy encantado con la nueva versión, y es que el teléfono ya iba bien, pero ahora vuela.

Un saludo a todos!

jueves, 17 de abril de 2014

Recuperar USB dañado

En ocasiones, un USB acaba dando problemas llegado al punto de que no podemos añadir archivos o incluso no podemos ni formatearlo, antes de recurrir a la garantía podemos probar lo siguiente (atención, con este proceso perderemos todos los datos almacenados):
  1. Entramos al cmd con permisos de administrador
  2. Escribimos diskpart
  3. Hacemos LIST DISK y elegimos el disco referente al pendrive con SELECT DISK 3 (siendo 3 el número del pendrive)
  4. CLEAN
  5. CREATE PARTITION PRIMARY
  6. ACTIVE
  7. FORMAT fs=fat32 quick
  8. ASSIGN
  9. EXIT

sábado, 9 de noviembre de 2013

Reviviendo Szenio PC Tablet 2000

Hoy llegó a mis manos esta tablet con un problema bastante desesperante. O se quedaba bloqueada al intentar arrancar el sistema operativo o simplemente se producía un bucle de apagado encendido donde al final daba error de poca batería. Nunca en todos los intentos dio llegado a arrancar en Android.

Después de navegar por foros vi que era un problema muy común y le había pasado a más gente, y la compañía distribuidora puso al parecer instrucciones y archivos para solucionar el tema. Digo "al parecer", ya que ahora todos esos enlaces están caídos y no hay forma de encontrar nada de la tablet en la web oficial.

En ciertas instrucciones hablaba de un modo recovery al que se accede aguantando Vol+ + Power, pero vamos, en la mía ni de casualidad di entrado al recovery. Al final la solución que a mi me sirvió y por eso la quiero compartir, la encontré en HTCManía (dónde si no!), y resulta que consiste en que la Woxter 101 CXi y la Szenio son iguales, con lo que por suerte se puede usar el software de recuperación de la primera e incluso la misma versión de android.

Me fui a la web oficial de la Woxter 101, y seguí las instrucciones de instalación de la versión 4.1.1 de Android. Lo más complicado a mi punto de vista es entrar en el "modo upgrade", ya que a diferencia de otros dispositivos, la pantalla seguirá en negro mientras se encuentra en ese modo.

A partir de aquí, pues a probar custom roms a ver cuál va ligerita y bien, aunque la del Woxter va bastante fina.

Espero que os sea útil, a mí esto hace varias horas me hubiera venido muy bien.

Un saludo ;)

martes, 15 de octubre de 2013

¿Por qué lenguaje de programación empiezo?

Estoy seguro que si os dedicáis al mundo de la informática desde hace tiempo sabéis que cuando alguien quiere aprender a programar es lo primero que pregunta, como no podía ser de otro modo. Y cada uno aquí da sus opiniones lo mejor que puede y basado en su propia experiencia. Yo voy a dar la mía, que para eso es mi blog.

Para empezar yo diferencio dos clases de usuarios, los que quieren realmente meterse al mundillo y dedicarse a la informática, o los "casual", gente que no se va a dedicar a la informática pero tienen la curiosidad de querer aprender para programarse algo sencillito y no complicarse mucho la vida. También hay los que se quieren meter "porque la informática tiene futuro", aunque sin más pasión y/o interés que ése no les auguro mucho futuro en estos lares.

Para los usuarios puntuales que sólo quieren algo rápido para sacar algún proyecto pequeño adelante, recomiendo Python. Fácil de aprender, de usar, bonito, te obliga a indentar, módulos para todo (soy de los que creen y esperan que iPython + Numpy se coma a matlab) no tienes que saber ni papa de punteros o de lo que hay por debajo. Te miras algún manual facilito como el de Python para Todos y muy pronto puedes empezar a hacer tus cosillas.

Para los que quieran entrar en el mundillo de la informática de cabeza, aprender a manejar algoritmos, tipos abstractos de datos y demás mariconadas y palabras chungas que usamos los informáticos para parecer más listos mi opinión es:

Para empezar, un lenguaje fuertemente tipado. Pascal puede ser el elegido. Sintaxis sencilla, no tan complicado como C o C++, y te hace coger buenos hábitos de programación. Para usarlo para proyectos grandes no me gusta en absoluto, pero en mi ciudad al menos he visto varias ofertas de trabajo para programadores en Delphi (una evolución de Pascal), así que quizás pueda ser una opción...

Una vez aprendido Pascal, nos vamos a C. Aprendemos lo divertido que puede ser concatenar dos cadenas, lo graciosos que pueden ser los punteros, y por supuesto el poder que tienes sobre la máquina. No voy a negar que me encanta C y lo optimizado que está.

Por supuesto, todo buen programador tiene que saber de Programación Orientada a Objetos. Hay algunos puristas que hablan de empezar por SmallTalk o cosas así, yo recomiendo Java. Tipado, multiplataforma, herencia simple, probablemente el lenguaje más extendido del mundo y el que más se pide para conseguir un trabajo. Esencial. C++ es otra muy buena opción.

Por último un lenguaje funcional es importante, no tanto bajo mi punto de vista para usar de forma cotidiana pero sí para aprender a pensar de otra manera (tail recursión, todo es una función, etc.) En mi caso aprendí Ocaml en la facultad y me gustaría tener algo de tiempo para mirar Haskell, que le tengo ganas.

En este punto puedes aprender los lenguajes que te apetezcan, sin demasiada complicación una vez ya "hablas" los anteriores. C++, PHP, Javascrip, Python, Ruby, C#...

Si alguien quiere saber mi "trayectoria" personal (probablemente no), yo empecé por BASIC hace muchos años, salté a QBASIC y la evolución lógica me llevó a Visual BASIC. Aprendí también algo de C, y al entrar en la facultad desaprendí todo lo aprendido de Basic y aprendí Pascal -> C -> Java -> Ocaml -> Matlab -> Python -> Javascript y el último lenguaje que he aprendido allí ha sido C#.
Luego decidí especializarme en Python, es el lenguaje que más me gusta, con un buen equilibro entre optimización y velocidad de desarrollo (a veces mientras programo en Python pienso en tener que hacer lo mismo en C y me entra un escalofrío de imaginar todas las líneas de código...) y de hecho es el lenguaje que me ha dado trabajo ahora mismo, junto con el querido Framework Django, conjunto de librerías que permiten a Python desarrollar fácilmente aplicaciones web.

Cada uno tiene que probar de todo y ver lo que le va gustando. Cualquier duda ya sabéis dónde estoy!

lunes, 19 de agosto de 2013

Nostalgia: Manual del Amstrad CPC 6128

A pesar de que soy joven y no coincidí temporalmente con los amstrad CPC, por casualidades de la vida he acabado teniendo por casa un CPC 6128 a mis 11 - 12 años, y si bien había cosas que me molestaban mucho como por ejemplo que la disquetera del mío estaba estropeada (me lo habían regalado de segunda mano), guardo un grandísimo recuerdo de él y de su pantalla de fósforo verde. Lástima que mis padres lo hayan tirado un día que yo no estaba "porque ya no servía para nada". Sin embargo, cuando me lo dieron recuerdo que me dijeron "Oye, ¿el manual lo quieres?". Y yo estuve a punto de cagarla y decir que no, sin embargo dije "Pues vale", y me lo empecé a leer.

Me encantó, aprendí muchísimo y bajo mi punto de vista el manual estaba escrito de perlas, para la época quizás mucho mejor que algunos libros técnicos actualmente.

De hecho, tengo que reconocer que por curioso que sea aprendí a programar más o menos en el año 2000 con libros de ordenadores antiguos. Antes el manual del PC no era sólo 3 chorradas, si no que te enseñaban a programar en el lenguaje BASIC, que era el intérprete por defecto del sistema.

Además, cada ordenador de la época tenía distintas instrucciones. El más placentero para programar de los que he probado físicamente ha sido el MSX, ya que además era el que más instrucciones y funciones tenía. Recuerdo por ejemplo la declaración de Sprites y la detección de colisiones para programar videojuegos.

Salvo el libro del CPC que era mío (y aún conservo, cuando vuelva a España tengo que encontrarlo), el resto de los libros los fui cogiendo en préstamo de la biblioteca municipal.

Me dió mucha pena que hace poco después de varios años sin ir volví y habían reformado la biblioteca entera, y de esos libros no quedaba nada. En el estante sólo había cosas como Excel 2010, Access 2007, Dreamweaver, algo de Visual Basic 6 y alguna otra cosilla. Ninguno de los libros que me habían enseñado tanto y que serían tan válidos hoy en día como lo fueron para mí hace 10 años sobrevivieron.

Por eso hoy me sentí tremendamente nostálgico y alegre cuando encontré un sitio web de fanáticos del Amstrad CPC, y entre ellos estaba el manual de mi querido Amstrad CPC 6128. Recomiendo al menos echar un ojo al último capítulo de la historia de la informática y de cómo el tío predice que cuando baje el precio de la memoria se podrán ver películas en un PC...

Por último, si me lee alguno de los hachas que se ha matado a escanear el manual entero, muchas gracias!

lunes, 12 de agosto de 2013

Ataque BREACH, un toque de atención a SSL/TLS/Cualquier tipo de cifrado realmente

Estando desconectado temporalmente del tema de la seguridad, un Security Advisory de Django me volvió a traer al mundo de los vivos. El tema viene siendo éste:

https://www.djangoproject.com/weblog/2013/aug/06/breach-and-django/

Donde avisan del ataque BREACH. Por supuesto, me puse a indagar sobre el tema y echar un ojo al PAPER que presentan, ya que me sorprendió ver que TLS/SSL (y realmente cualquier tipo de cifrado!) eran vulnerables al ataque.

El ataque se basa en uno anterior, CRIME, basado en la comprensión TLS, que no es demasiado común. Ésto va más allá usando la comprensión básica que va sobre HTTP, es decir, antes de realizar ningún tipo de cifrado del tráfico. Es muy común en cualquier tipo de web, tanto usando HTTP como HTTPS, usar algún tipo de compresión para ahorrar ancho de banda, eligiendo muchas veces la compresión gzip.

El ataque tiene varios requisitos:
  • Un servidor que use compresión a nivel HTTP (cae de cajón)
  • Que aparezca algún parámetro introducido por el usuario en el body de la respuesta HTTP
  • Que haya algo "interesante" en el body de la respuesta (un token CSRF, por ejemplo). Algo secreto que queremos robar.
Y ahora empieza la gracia. Si tenemos una petición tal que:

GET /owa/?ae=Item&t=IPM.Note&a=New&id=canary=<guess> 

Y nos devuelve algo como (esto lo hace Outlook Web Access):

<span id=requestUrl>https://malbot.net:443/owa/forms/
basic/BasicEditMessage.aspx?ae=Item&amp;t=IPM.Note&
amp;a=New&amp;id=canary=<guess></span>
...
<td nowrap id="tdErrLgf"><a href="logoff.owa?
canary=d634cda866f14c73ac135ae858c0d894">Log
Off</a></td>


Guess sería lo que nosotros inyectamos. Gzip intenta buscar coincidencias de palabras para comprimir la respuesta. Por lo tanto comprimirá canary= al tenerlo en dos partes (en el ejemplo) de la respuesta. Pero qué pasa si intentamos inyectar cosas? El tamaño de la compresión será el mismo si no acertamos pero si acertamos y metemos canary=d... al encontrar canary=d634... en otra parte del texto la compresión será mejor, y la respuesta por parte del servidor más pequeña. Esto permite que repitiendo el ataque podamos ir sacando, byte a byte, el token.

Y ya el tema de cómo explotarlo, pues a partir de ahí a echarle imaginación. Lo difícil es llegar hasta estas conclusiones. Me he saltado varios detalles que son relevantes, para más información echad un ojo al PDF.

Por último comentar que me gustó ver que uno de los investigadores involucrados es el lugués Ángel Prado, habitual speaker en las Jornadas de Seguridad de A Coruña, y al que espero poder ver este año a finales de octubre en GSICKMINDS (nuevo nombre de dichas jornadas).

Un saludo a todos!