Mi franela del HacktoberFest ya llegó!

Cada octubre, Digital Ocean y GitHub envían camisetas gratuitas del Hacktoberfest a miles de personas en el mundo.

El diseño de este año.

El año pasado me quedo corto por un PR (Pull-Request), pero este año califique, y debo decir que la camiseta se ve GENIAL! Obtener una es sencillo: Debes realizar 4 solicitudes de extracción (PR, Pull-Requests) a proyectos Open Source en GitHub. Aquí lo resumo en 3 pasos:

  1. Registrarse en el Hacktoberfest:
    Necesitas una cuenta de GitHub. Si todavía no tienes uno, puedes crear uno gratis en solo unos minutos. Luego hay que ir a la página de registro del Hacktoberfest y seguir las instrucciones. Sólo toma un minuto.
  2. Realizar 4 PR’s:
    Se deben realizar cuatro Pull Requests a proyectos de Software libre. Pueden ser cosas tan sencillas como el archivo Readme.md de un repositorio publico cualquiera. Si no conoces ninguno, dejo a la orden mis repositorios. Aquí hay una guía más detallada para contribuir al código abierto, si te sientes aventurero.
  3. Verificar si has calificado:
    Una vez que se haya registrado, puede verificar su progreso en el sitio web de Hacktoberfest.

Python, primero en el ranking de la IEEE

Fuente: IEEE

Python ha continuado su trayectoria ascendente desde el año pasado y saltó dos lugares a la ranura N º 1, aunque los cuatro primeros (Python, C, Java y C++) – siguen estando muy cerca de popularidad.

Sin embargo, por segundo año consecutivo, no se han introducido nuevos idiomas en el ranking:

Parece que hemos entrado en un período de consolidación en la codificación como programadores digerir las herramientas creadas para atender a la explosión de la nube, móviles y grandes aplicaciones de datos.

Fuente: https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2017

Referencia Rápida: Scikit-learn de Python

Scikit-learn es una librería de código abierto para Python, que implementa un rango de algoritmos de Machine Learning, pre-procesamiento, referencias cruzadas y visualización usando una interfaz unificada.

Un Ejemplo Básico

from sklearn import neighbors, datasets, preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
X, y = iris.data[:, :2], iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33)
scaler = preprocessing.StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
knn = neighbors.KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy_score(y_test, y_pred)

Cargar la data

Nuestra data debe ser numérica y estar almacenada como arreglos de NumPy o matrices de SciPy. Otro tipo de data que pueda convertirse en arreglos numericos tambien se aceptan, como los DataFrames de Panda.

import numpy as np
X = np.random.random((10,5))
y = np.array(['M','M','F','F','M','F','M','M','F','F','F'])
X[X < 0.7] = 0 Preprocessing The Data Standardization
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(X_train)
standardized_X = scaler.transform(X_train)
standardized_X_test = scaler.transform(X_test)
NORMALIZACIÓN
from sklearn.preprocessing import Normalizer
scaler = Normalizer().fit(X_train)
normalized_X = scaler.transform(X_train)
normalized_X_test = scaler.transform(X_test)
BINARIZACIÓN
from sklearn.preprocessing import Binarizer
binarizer = Binarizer(threshold=0.0).fit(X)
binary_X = binarizer.transform(X)
CODIFICAR ATRIBUTOS CATEGÓRICOS
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
y = enc.fit_transform(y)
IMPUTAR VALORES FALTANTES
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit_transform(X_train)
GENeraR atributos polinomiales
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(5)
oly.fit_transform(X)
entrenaR y probaR la data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)

Crear el Modelo

Estimadores Supervisados

REGRESIÓN lineal
from sklearn.linear_model import LinearRegression
lr = LinearRegression(normalize=True)
Support Vector Machines (SVM)
from sklearn.svm import SVC
svc = SVC(kernel='linear')
Naive Bayes
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
KNN
from sklearn import neighbors
knn = neighbors.KNeighborsClassifier(n_neighbors=5)

Estimadores No Supervisados

ANÁLISIS de Componente principal (PCA)
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)
K Means
from sklearn.cluster import KMeans
k_means = KMeans(n_clusters=3, random_state=0)

Ajustar el Modelo

Aprendizaje supervisado
lr.fit(X, y)
knn.fit(X_train, y_train)
svc.fit(X_train, y_train)
aprendizaje no supervisado
k_means.fit(X_train)
pca_model = pca.fit_transform(X_train)

Predecir

 

estimadores supervisados
y_pred = svc.predict(np.random.random((2,5)))
y_pred = lr.predict(X_test)
y_pred = knn.predict_proba(X_test))
estimadores no supervisados
y_pred = k_means.predict(X_test)

Evaluar el Desempeño del Modelo

Métricas de Clasificación

puntaje de exactitud
knn.score(X_test, y_test)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
reporte de CLASIFICACIÓN
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred)))
matriz de CONFUSIÓN
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred)))

Métricas de Regresión

error absoluto promedio
from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2])
mean_absolute_error(y_true, y_pred))
error medio cuadrado
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred))
puntaje R2
from sklearn.metrics import r2_score
r2_score(y_true, y_pred))

Metricas de Agrupacion

ÍNDICE Ajustado en Radianes
from sklearn.metrics import adjusted_rand_score
adjusted_rand_score(y_true, y_pred))
Homogeneidad
from sklearn.metrics import homogeneity_score
homogeneity_score(y_true, y_pred))
V-measure
from sklearn.metrics import v_measure_score
metrics.v_measure_score(y_true, y_pred))
VALIDACIÓN cruzada
print(cross_val_score(knn, X_train, y_train, cv=4))
print(cross_val_score(lr, X, y, cv=2))

Ajustar el Modelo

BÚSQUEDA de Cuadrillas
from sklearn.grid_search import GridSearchCV
params = {"n_neighbors": np.arange(1,3), "metric": ["euclidean", "cityblock"]}
grid = GridSearchCV(estimator=knn,param_grid=params)
grid.fit(X_train, y_train)
print(grid.best_score_)
print(grid.best_estimator_.n_neighbors)
OPTIMIZACIÓN DE PARÁMETROS ALEATORIZADOS
from sklearn.grid_search import RandomizedSearchCV
params = {"n_neighbors": range(1,5), "weights": ["uniform", "distance"]}
rsearch = RandomizedSearchCV(estimator=knn,
param_distributions=params,
cv=4,
n_iter=8,
random_state=5)
rsearch.fit(X_train, y_train)
print(rsearch.best_score_)

Tomado DataCamp, donde hay una version descargable muy practica para imprimir y tener a la mano!.

Machine Learning es una realidad, y una muy rentable.

Una nueva investigación sugiere que el Machine Learning es más frecuente de lo que uno pensaría.

La era del Machine Learning ya está en pleno apogeo, revela una reciente encuesta realizada por MIT Technology Review en colaboración con Google Cloud.

Los investigadores pidieron a 375 líderes de negocios y de TI de una variedad de organizaciones de todo el mundo sobre su uso del aprendizaje automático. Los resultados incluyen:

  • El 50% de quienes implementan Machine Learning pueden cuantificar el Retorno Sobre la  Inversión (ROI).
  • 60% de los encuestados tienen estrategias de Machine Learning en desarrollo, y casi un tercio caracteriza sus iniciativas como «maduras».
  • La ventaja competitiva se ubicó entre los objetivos principales de los proyectos de Machine Learning para el 46% de los usuarios actuales. El 26% de los usuarios actuales dijeron que ya han ganado una ventaja competitiva del aprendizaje automático.
  • La inversión en Machine Learning está creciendo, con un 26% de los encuestados comprometiendo más del 15% de sus presupuestos de TI a proyectos de ML.

Estos resultados sugieren que el ML se está volviendo más común, impulsando desde la detección de fraude y los motores de recomendación hasta la clasificación de imágenes médicas y la programación de aeronaves. En todos estos casos de uso, la premisa es la misma: a medida que los modelos de aprendizaje a máquina ingieren y procesan grandes cantidades de datos, cada vez son mejores viendo patrones, tal como el ojo humano, pero a una escala mucho mayor.

Esta capacidad puede ayudar a muchas empresas a desplegar capacidades automatizadas de análisis predictivo, lo que conduce a decisiones más inteligentes, nuevas eficiencias operativas y una mejor experiencia para los clientes. Y es por eso que la máquina de aprendizaje proporciona retorno un sobre la inversión, que más del 50% de los encuestados dijo que ya pueden detectar un ROI en sus proyectos.

Usos del Machine Learning en la industria.

Sigue leyendo Machine Learning es una realidad, y una muy rentable.

Por qué Amazon obliga a sus desarrolladores a escribir comunicados de prensa.

Amazon Web Services – el negocio masivo de computación en la nube – lanzó más de 500 nuevos productos el año pasado.

Andy Jassy, SVP de AWS

Para cada uno de ellos, Amazon siguió un proceso de desarrollo poco convencional, informó el vicepresidente de AWS, Andy Jassy, ​​en una reciente cumbre Macquarie.

Antes que los desarrolladores de Amazon escriban una sola línea de código, tienen que escribir el comunicado de prensa y el anuncio de FAQ del producto hipotético.

Amazon utiliza este enfoque de «trabajo hacia atrás» porque obliga al equipo a sacar las discusiones más difíciles del camino temprano, dice Jassy. «Necesitan entender completamente cuál será la propuesta de valor del producto y cómo se lanzará a los clientes». Si el equipo no puede obtener a un comunicado de prensa convincente, el producto probablemente no vale la pena.

También ayuda con una iteración más rápida y mantiene al equipo en el buen camino, explicó Jassy.

Contenedor Docker: Herramientas de Big Data

Para todos los que trabajamos con Big Data, es evidente que uno de los mayores retos es la configuración y puesta a punto de un ambiente funcional. Por mucho tiempo, la solución rápida para esto han sido las imágenes de sistemas para su virtualización. Sin embargo, existe una mejor solución: Los contenedores de Docker.

Les comparto un contenedor Docker que tiene el ambiente  Big Data mas usado en la actualidad:

  • Apache Hadoop (HDFS & YARN).
  • Apache Spark.
  • Apache Hive (on Spark).
  • Python 3 y herramientas para HDFS.
Descargar haciendo click en la imagen!

 

Para instalar directamente desde los repositorios de Docker:

docker build  -t sequenceiq/hadoop-docker:2.7.1 .
docker pull sequenceiq/spark:1.6.0

Criptomonedas: Qué son y cómo obtenerlas.

El mundo esta viviendo una gran revolución. El fin de las mafias financieras -en el que los gobiernos y bancos tienen el control de las monedas- esta cerca, y todos debemos prepararnos para ello. Es por esto que es importante entender varios conceptos asociados con la cripto-economia y sobre todo, ir creando nuestras propias cuentas que acepten monedas digitales.

«It is important that everybody gets on board and prepares themselves for the revolution set to take place in the business world through blockchains, smart contracts and digital currencies.»                     –  Mark Stalder, CEO – Ernst and Young
  • Criptomoneda (Cryptocurrency):   Es un medio digital de intercambio. La primera criptomoneda que empezó a operar fue Bitcoin en 2009 y desde entonces han aparecido muchas otras, con diferentes características y protocolos. Al comparar una criptomoneda con el dinero fiduciario la diferencia más notable es la forma en que ningún grupo o particular puede acelerar la producción de dinero y usar éste ilegal o abusivamente, ya que sólo se genera una cierta cantidad de unidades colectivamente, a una velocidad que está limitada por un valor definido con anterioridad y conocido públicamente. Funciona mediante transacciones persona a persona, sin intermediarios. Las transacciones se almacenan en bases de datos de tipo Blockchain alrededor del mundo.
  • Cadena de Bloques (Blockchain): Es una base de datos distribuida formada por cadenas de bloques diseñadas para evitar su modificación una vez que un dato ha sido publicado. Por esta razón es especialmente adecuada para almacenar de forma creciente datos ordenados en el tiempo y sin posibilidad de modificación ni revisión. En el campo de las criptomonedas, la cadena de bloques se usa como notario público no modificable de todo el sistema de transacciones a fin de evitar que una moneda se pueda gastar dos veces.

Ventajas de las Cryptomonedas.

  • Pagos móviles fáciles: Bitcoin le permite pagar con un dispositivo móvil en dos sencillos pasos: escanear y pagar. No hay necesidad de pasar la tarjeta, teclear un PIN o firmar nada. Todo lo que necesita para recibir pagos con Bitcoin es mostrar el código QR ​​en su aplicación de monedero y dejar que su amigo escanee su móvil o juntar los dos teléfonos (usando la tecnología NFC).
  • Seguridad y control sobre el dinero: Las transacciones de Bitcoin están aseguradas mediante criptografía militar. Nadie puede cobrarle dinero o hacer un pago en su nombre. Tan pronto como tome los pasos requeridos para proteger su monedero, Bitcoin podrá darle control sobre su dinero y un fuerte nivel de protección contra muchos tipos de fraude.
  • Funciona en todas partes y en cualquier momento: Al igual que con el correo electrónico, no es necesario pedir a su familia que utilice el mismo software o los mismos proveedores de servicio. Deje que usen sus favoritos. No hay problema; todos ellos son compatibles, ya que utilizan la misma tecnología. La red Bitcoin nunca duerme ni tiene vacaciones!
  • Pagos rápidos internacionales: Bitcoins puede ser transferido de África a Canadá en 10 minutos. No existe un banco que retrase el proceso, honorarios escandalosos o congelar la transferencia. Usted puede pagarle a sus vecinos de la misma manera que usted puede pagarle un miembro de su familia en otro país.
  • Sin comisiones: Bitcoin permite enviar y recibir pagos a casi coste cero. Salvo en casos especiales, como en pagos diminutos, no existen tasas. Sin embargo, puede optar pagar una pequeña tasa voluntaria para aumentar la prioridad de su transacción y remunerar a las personas que hacen funcionar la red Bitcoin.
  • Proteccion de identidad: Con Bitcoin, no existe un número de tarjeta de crédito que alguien pueda usar para hacerse pasar por ti. De hecho, es posible hacer un pago sin revelar tu identidad, casi como el dinero físico. Aún así deberías tomar nota sobre qué se necesita para proteger tu privacidad.

Las principales criptomonedas.

Como mencioné anteriormente, existen múltiples criptomonedas. Se diferencian principalmente en el código usado para su implementación, la adopción del publico y su valor.

Las 5 principales criptomonedas. Tomado de http://coinmarketcap.com/ el 24/01/2017

Como usar Bitcoins.

  1. El primer paso para quienes desean entrar en el mundo de los pagos con criptomonedas, es crear una cartera (Wallet). Existen muchos clientes y sitios web que nos facilitan este proceso. Se debe elegir consiensudamente el cliente a elegir. Para facilitar la decision, recomiendo el siguiente vínculo: https://bitcoin.org/es/elige-tu-monedero.
  2. El siguiente paso es quiza el mas importante: Asegurar nuestra cartera. Las criptomonedas son seguras en su funcionamiento, pero si alguien mas llegara a acceder a nuestra cartera, podra hacer transacciones por nosotros. Para ello, los protocolos de Bitcoin tienen caracteristicas se seguridad, como la creacion de frases de acceso, autenticacion multiple, cifrado de clientes, etc. El mejor recurso para conocer mas al respecto es: https://bitcoin.org/es/asegure-su-monedero.
  3. Comprar monedas puede hacerse desde casas de cambio oficiales, o a traves de servicios online, que compraran dinero tradicional a cambio de la cantidad de bitcoins correspondiente al cambio oficial. Un listado de servicios puede encontrarse en: https://bitcoin.org/en/exchanges. Personalmente hago mis compras desde https://changelly.com/.

 

La importancia de las salidas de equipo.

Después de pasar 40 horas a la semana con la misma gente, su primer pensamiento podría no ser tener que pasar aún más tiempo con ellos. Pero las tendencias actuales indican que vale la pena hacerlo. Esto se debe a que los miembros de equipos felices y eficaces comparten tres rasgos: familiaridad, comunicación y confianza. Desafortunadamente, las oficinas no siempre fomentan el desarrollo de esos rasgos: la diversidad en las asignaciones y el trabajo a distancia pueden dificultar el establecimiento de equipos que trabajan al máximo de su capacidad. Salidas de Equipo al rescate!.

A menudo pensado como un descanso para los empleados, estas salidas en realidad pueden contener la clave para crear mejores equipos! Así es como las salidas de equipo pueden fortalecer y profundizar los vínculos de equipo:

1) Re-imagine su ambiente.
Con el fin de nuevos temas de conversación y un ambiente divertido, el entorno de oficina tiene que dar paso a una nueva ubicación, menos familiar. Considere la posibilidad de organizar su próxima excursión en el parque, una ciudad cercana, o incluso un lugar completamente nuevo como una pista de patinaje sobre hielo! De esta manera habrá mucho de qué hablar fuera del trabajo, y los equipos se conocerán en un contexto muy diferente.

2) Incluir un «desafío» para que todos participen.
Al llegar con una meta para el evento y tejer un desafío entretenido alrededor de él, la gente se sentirá obligado a unirse a la diversión y sacar el máximo provecho de su evento. Se recomienda crear pistas y tareas que requieren que todo el equipo las resuelva. Desde el desbloqueo de un cryptex hasta el baile con artistas callejeros, los mejores retos son los que conducen a muchas estrategias, risas y recuerdos.

3) ¡No olvide el recuerdo!
Al final del día, asegúrese de que los participantes tengan algo para recordar el día. Se puede regalar premios a los mejores participantes, pero hay muchas maneras de hacerlo. Una cabina de la foto o las camisetas del equipo. Con la combinación correcta de imaginación, intriga y memorabilidad, un evento puede llevar a su equipo al siguiente nivel.

Salida con el equipo de Big Data @ Georgia Aquarium.

APK: Alola Pokedex (QR-Codes)

English

Update: After a name change, the app is once again on the Play Store!

So, today after trying to publish an update to "Alolan Pokedex", i suddenly got a notice from Google Play, stating that my app is suspended for copyright infringement. Really sad for that, sice there are lots of other apps making far worse usage of the Pokemon brand!. Anyway, i decided to make the APK file available here, in case any of you guys want to keep using it, and so my hard work does not get to waste. There are also some nice updates thrown in there that i think you will appreciate.

Français

Mise à jour: après un changement de nom, l’application est de nouveau sur Play Store!

Ainsi, aujourd'hui après avoir essayé de publier une mise à jour de "Alolan Pokedex", j'ai soudain reçu un avis de Google Play, affirmant que mon application était suspendue pour violation de copyright. Vraiment triste pour elle !. Quoi qu'il en soit, j'ai décidé de faire le fichier APK disponible ici, au cas où l'un d'entre vous les gars veulent continuer à l'utiliser, et donc mon travail acharné ne devient pas à perdre. Il ya quelques mises à jour intéressantes là-bas, je pense que vous apprécierez. En outre, vous trouverez tous les noms Pokemon en français!!

Deutsche

Update: Nach einer Namensänderung ist die App wieder im Play Store!

So heute, nach dem Versuch, ein Update von "Alolan Pokedex" zu veröffentlichen, bekam ich plötzlich eine Benachrichtigung von Google Play, behauptet, dass meine App für Urheberrechtsverletzungen gesperrt wurde. Wirklich traurig für sie! Jedenfalls habe ich beschlossen, die APK-Datei hier zugänglich zu machen, falls einer von euch es weiterhin benutzen will und so meine harte Arbeit nicht verlieren wird. Es gibt einige interessante Updates da draußen, ich denke, Sie werden es genießen. Zusätzlich finden Sie alle Pokemon-Namen auf Deutsch!!

Español

Actualización: después de un cambio de nombre, la aplicación vuelve a estar en el Play Store!

Así que hoy, después de intentar publicar una actualización de "Alolan Pokedex", de repente recibí un aviso de Google Play, alegando que mi aplicación se suspendió por infracción de derechos de autor. Estoy realmente triste por eso, pues hay muchas otras apps que hacen peor uso del contenido de Pokemon en la tienda! De todos modos, decidí hacer que el archivo APK este disponible aquí, en caso de que uno de ustedes quiera continuar usandolo, y para que mi trabajo no se pierda. Hay algunas actualizaciones interesantes por ahí, que creo que disfrutarán.
Download APK

Mi App Android en el Play Store: Alolan Pokédex

Recientemente he desarrollado y publicado una app muy sencilla, pero práctica para los jugadores de la más reciente entrega de Pokémon:  Sun y Moon. Se trata de una aplicación de referencia, que lista los diferentes Pokemon capturables en ambos juegos, junto con su respectivo Código QR.

Funcionalidad QR en Sun/Moon

El escanear un Código QR con la Cámara del Nintendo 3DS, permite obtener el registro del Pokemon respectivo, sin necesidad de capturarlo. Esto, entre otras cosas permite que se vea la ubicación exacta donde podemos encontrar a esa determinada especie en su forma salvaje, para poder capturar uno propio.

La idea de la aplicación surgió mientras hacia uso de esta misma característica, pero consultando desde el álbum del sitio web ImGur, donde se publicaron originalmente estos códigos. El proceso de buscar el QR deseado usando este sitio, se me apetecía tediosa y complicada: No existe manera de cargar todas las imágenes a la vez en la ventana del navegador, por lo que una búsqueda con CTRL+F no siempre arrojaba el resultado esperado.

El álbum en Imgur

Fué entonces cuando se me ocurrió descargarlas todas. Pero había un problema: Son mas de 400 imágenes y el nombre del archivo es un texto aleatorio que no sirve para identificar al Pokemon. Y el proceso de guardar manualmente 400 imágenes de internet una a una simplemente no era una opción.

Guardar uno por uno? No gracias!

Como todo buen programador, sabía que debía haber una mejor manera de hacer esta tarea, sólo hacía falta encontrar la herramienta. Fue entonces cuando pude darme cuenta de algo muy importante: El atributo ALT (descripción alternativa) de cada una de las imágenes contiene el número, seguido del nombre de cada Pokemon.  Fue entonces que lo tuve claro. Solo necesitaba una herramienta que permitiese descargar todas las imágenes de un sitio web, usando su atributo ALT como nombre de imagen.

Como se puede ver, el SRC de la imagen es un texto al azar. Pero el ALT es justo lo que necesito!

Luego de buscar en la web, me di cuenta que muchas otras personas han tenido esta necesidad en el pasado, pero sin embargo no existe en el mercado una herramienta que lo haga. Debía hacer mi propia herramienta…

Fué en este momento que encontré una extensión del navegador Google Chrome que permite descargar todas las imágenes de una página web. Y lo mejor: Es de código abierto!. Mi misión era sencilla: Modificar la extensión para que al descargar, en vez del nombre original del archivo, use el nombre del atributo ALT de la imagen en cuestión.

«Image Downloader» en la Chrome Web Store

Asi que aquí estaba, con el código fuente del proyecto original , ahora bifurcado a mi repositorio local. Tuve que aprender cómo se desarrolla una extensión para navegador: El acceso al DOM, el uso de la configuración, el manejo de las acciones, la interacción entre módulos y la instalación local en modo desarrollador, entre otros aspectos muy técnicos.

Al final, solo necesité crear un arreglo con el texto ALT de cada imagen al cual el API tiene acceso, para luego pasarlo a la función que genera las descargas automáticas, como parámetro ‘filename'.

La función que captura el atributo ALT en todas las imágenes.

Para quienes están interesados en ver todos los cambios requeridos, o descargar mi versión de esta extensión. (Que he llamado ALT Image Downloader), el código esta en mi GitHub, desde donde también se pueden ver las diferencias con la rama original.

Una vez que tuve las imágenes descargadas justo como las necesitaba, solo bastó editarlas, generar un listado, crear una base de datos, construir un API, subir todos los recursos al hosting y por supuesto: Desarrollar y publicar el App Android!. Sin embargo, esos detalles los comentaré en la entrega número dos de ésta entrada.

Captura del App: Alolan Pokedex

«Gotta catchem alljust not by hand».