Diario de una aplicación móvil de horóscopo (Python + React + NoSQL)

isvidal

Astrale

Intro

Para dar visibilidad a mi trabajo, y sobretodo recibir feedback y opiniones sobre cómo, y mejor aún, con qué herramientas óptimas proceder, me dispongo a abrir y mantener este humilde hilo sobre un little-to-mid proyecto que tengo pensado tener terminado antes de junio.

Mitusa

Trabajo como full stack en una comercializadora eléctrica, tengo +4 años de experiencia en entorno web/móvil.

De qué va esto

Mi intención es realizar una aplicación móvil de horóscopo autosostenible que funcione con el mínimo mantenimiento posible, y que en un futuro pueda dar para pagarme el café de la mañana.

Por qué

Me gusta programar en mi tiempo libre y tengo una lista de cosas para aprender este año y con esta aplicación quiero tocar Python, NoSQL, JEST, Firebase... y ya que pago 100 eurazos al años para subir apps al market de iOS, al menos, aprovecharlos (Tengo una app subida de otra cosa que está abandonada).

Quiero probar como sienta compartir el desarrollo de un proyecto por aquí, si es positivo o no, y sobretodo opiniones en cuanto a herramientas y direcciones tomar, y alomejor descubro a alguien alguna herramienta/forma de trabajar nueva ;)

Con qué

Las tecnologías que utilizare:

La data

  • PYTHON para scraping.
  • NoSQL para guardar/consultar/actualizar => aún no he decidido donde ¿Realtime db en Firebase? ¿En un docker que tengo?

La APP

  • REACT NATIVE con EXPO, estoy ya bastante curtido en este STACK, agiliza mucho el desarrollo.

No he trabajado nunca con Python y mi experiencia con NoSQL se limita a Redis y algún pinito en Firebase.

Repositorios

Python scraper
Aplicación móvil

Herramientas

Flow de la APP

Mi intención es empezar con una aplicación simple de consulta de horóscopo y compatibilidades. Luego hacerla crecer a números de la suerte/lectura lineas de vida de la mano etc...

Al abrir una app pasar una serie de pantallas donde consulto nombre / fecha nacimiento / estado civil ... Y luego ya presentarle su pantalla con su horóscopo, pudiendo consultar otros, consultar su perfil y vincularlo a google / facebook / apple.

8
isvidal

Día 1

Python

Hoy he empezado mis primeros pinitos con Python, en 20 minutitos he tenido ya algo muy básico funcionado gracias al fantástico Beautiful soup.

Me gusta mucho la sintaxis, y sobretodo el tener todo lo necesario para hacerlo funcionar en la misma carpeta del proyecto haciendo independiente el programa de tu SO etc...

Primer commit.

Diseño

¿¿Podeis sugerirme nombres??

¿Y cual de estos logos usariais? Tened en cuenta que usares los colores del logo para la propia aplicación fondo/letras etc...

spoiler

Me gusta mucho el primero y el tercero, no se que opinais.

1 respuesta
HeXaN

Yo comentaré sobre Python. Primero de todo deberías de añadir un .gitignore apropiado: https://www.gitignore.io/api/python

Respecto a BS4 yo usaría select y select_one en vez de find_all y find.

3 2 respuestas
isvidal

#3 Lo pensé cuando lo hice ayer que lo de subir el venv a pelo no me parecía muy normal, pero como hice el proyecto desde cero, no puse ni .gitignore a la carpeta .idea jajajaja

Esta noche lo dejo niquelado ya en este tema e inicializo el repo de la aplicación móvil que aún lo tengo vacio.

1 respuesta
B

#4 el tercer icono sin duda.
Muy apropiado esta app...si la haces bien te sacas pasta fijo, que hay mucho incauto del horoscopo

1 respuesta
Unrack

#2 El tercero. Y el scrapping donde entra en la app?
Vale, el scraping es para usar el horoscopo que enlazas.

1 respuesta
Fliyin

Yo tengo una de horoscopo con 15 millones de descargas en android, si necesitas algo md =)

1 respuesta
isvidal

Día 2

Python SCRAPER

Hoy no he avanzado mucho por este frente, simplemente he dejado el directorio preparado para trabajar con el .gitignore y el requirements.txt con las dependencias.

Segundo commit.

React Native APP

Por aquí se ha producido el avance hoy.

  • Me he decidido por el tercer logo, y ya tengo splash screen y icona *0.
  • Repositorio inicializado con la base para empezar a programar, estructura de carpetas *1 y packages que usare.
  • He transformado el logo de svg a componente de React con esta página tan fantastica: https://react-svgr.com/playground/?native=true *2.
  • En dependencias de la aplicación para maquetar utilizare React Native Paper que es fantástica 100% recomendada y para la navegación React Navigation.
  • La aplicación ya arranca en mi emulador de android. *3

Segundo commit.

Media:

spoiler

Mañana

Mañana espero ya tener implementado el flujo hasta el lector de palmas, (Nombre, fecha nacimiento, sexo, estado civil, num. suerte y palma de la mano) serán todas las pantallas para la primera vez que abras la app.

Aparte del flujo implementare los contextos, con React.createContext (API nativa alternativa a Redux para almacenar estado y poder acceder/modificar desde cualquier componente descendiente) será el contexto local donde guardare información básica del usuario, luego el contexto del tema proporcionado por React Paper y para finalizar el contexto del Navegador de pantallas (React Navigation), en total tres contextos diferentes, espero no necesitar ninguno más.

Tengo que mirar cómo implemento lo de la palma de la mano, a nivel de al menos saber que tengo la mano delante de la camera, luego el resto le pongo un buen rand() jajajaja

También actualizare el trello ya con todas las cosas que se me pasen por la cabeza.

Comentarios

#3 Me he mirado ese .gitignore, pero de momento lo he hecho más fácil y solo he ignorado venv y .idea, cuando esto crezca, y tal iré añadiendo, me parece overkill añadir cosas que no se ni que son ni para qué sirven.

Sobre bs, puedes explicar por qué razón? Hablo desde el total desconocimiento, uso esa porque fue la primera que vi, pero por si puedes explicar i asi entiendo mejor.

#5 Mi intención es solo pasar el rato, aprender y que alguien aprenda de lo que yo haga, pero oye, si funciona y consigo descargas pues bienvenido sea, yo creo tener suficientes skills para hacer algo atractivo y al nivel de una app de 2020.

#6 Efectivamente, el scraping es para llenar la app con data viva diaria, sacada de otras páginas web.

#7 Hombre, pues te preguntaría si eligirias el logo 3, qué nombre le pondrías a la APP y que consejos básicos y errores típicos que podría cometer.

1 respuesta
22sortt

3er icono

HeXaN

#8 Básicamente porque con esos dos que digo puedes usar selectores CSS directamente. El inspector de elementos de cualquier navegador te genera estos selectores para el elemento que quieras así que es copiar, pegar y echar a andar.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors


Por cierto, te falta borrar las carpetas del IDE y el entorno virtual del repo. Lo digo para dejarlo ya 100% niquelado.

22sortt

Como nombre te podria venir bien:

astrall

Zoko

Has puesto "requeriments"

1 respuesta
isvidal

Día 3

Python

Dos tonterías hoy, corregido lo de #12 y probado el select a recomendación de @HeXaN, efectivamente la sintaxis es mucho más cómoda y css-like.

Tercer commit.

React Native

Hoy he implementado el contexto global, donde por ahora solo guardo el tema seleccionado, el ThemeProvider de React Paper i el NavigationContainer de React Navigation para gestionar el movimiento entre pantallas. Y el multi idioma con i18n.

Con el NavigationContainer he implementado una función fantástica sacada de su documentación que permite persistir el estado de la aplicación aún entre crasheos/reinicios, imagina que estás programando una pantalla que para llegar a ella tienes que pasar por muchas pantallas/pasos previos pues con esta función al recargar vuelves a estar al mismo punto que estabas sin tener que repetir otra vez todos los pasos, esto AGILIZA muchísimo el desarrollo,
el código lo podéis ver aquí:

Además he creado la primera pantalla del flujo inicial y decidido los colores del tema oscuro, a ver qué os parecen los colores y el diseño:

Tengo que implementar el reconocimiento palmar, osea true si la palma de la mano está delante de la cámara, sino false. La verdad no se por donde tirar, alguien tiene alguna recomendación? (¿ https://github.com/Clarifai/clarifai-javascript ?)

He programado algunos componentes genéricos que engloban todas mis pantallas:

Decir que cree el proyecto con TypeScript integrado por si acaso, lo tengo en modo no stricto, cada vez me gusta menos para React, y con React.defaultProps y React.propTypes ya tira sobrado, demasiado boilerplate TS para lo que, a mi, para este tipo de proyectos, me acaba ofreciendo.

Tercer commit.

Mañana

Espero ya tener el post introducción de datas básicas, la página de perfil del usuario donde desconectar/cambiar tema/vincular google/facebook/apple

Vuestra opinión

¿Que pensais de los colores que he elegido para la app a nivel de fondos/letra en ambos temas?

Pensamientos

No se muy bien si estoy haciendo bien esto, en el sentido para mostrarlo interesante/didactico para la gente. ¿Quizas deberia ser un poco mas tecnico y entrar mas en detalle con algunas de las magias de React (Hooks, api de animaciones etc...)?

2
codek0rZ

Para temas de scrapear y crawler te recomiendo que le hechas un vistazo a https://scrapy.org/ desde que lo descubrí no uso otra cosa para esta tarea.

Saludos

Zoko

Me gusta mucho este diario, sigue con él. Da gusto ver a alguien que usa Javascript aquí y no lo hace como meme. Yo solía ser así pero con el tiempo aprendí a hacer las cosas bien y la verdad que ahora estoy encantado, trabajo en mi día a día con React (no Native, pero vamos, hermanos), así que te sigo la pista de cerca.

He visto que lo del NavigationContainer realmente es implementar un store sencillito sin tener que meterte con algo más complejo como Redux. Está bastante bien tirado, la verdad que yo siempre meto Redux en mis proyectos (a menos que sean extremadamente sencillos) por la razón que tu dices, poder hacer time-travelling y replicar el estado de la app en un momento dado sin tener que hacer todo es una maravilla.

Dale duro

1 respuesta
isvidal

#15 Yo hace mucho que no uso ya Redux, la API nativa de React me sobra para el 99% de los casos y es más ligera.

https://es.reactjs.org/docs/context.html

Tengo mucha más experiencia con React que con RN, tengo un blog a punta de React: https://vvlog.dev/en del cual estoy bastante orgulloso multi-tema / multi-idioma, el problema es que es CSR y la indexación en google es un problema, si saco ganas lo migrare entero a NextJs que es pura crema para SSR mixto.

1 1 respuesta
Zoko

#16

Bueno, tampoco es que Redux sea una bomba que no te puedas permitir por no ser tan ligera como obviamente una API nativa, no? Nunca habia escuchado el argumento de escoger Context por ser más ligera.

Redux es bastante suyo a la hora de hacer las cosas, en mi caso creo que ayuda a entender el código bastante rápido sólo usando la app y viendo las acciones que se lanzan. Por no hablar de que te ayuda a pensar en "eventos", que además podrías directamente enchufar a las analíticas por ejemplo usando un middleware, teniendo trackeo de los usuarios sin tener que preocuparte de nada más, que quizá podría venirte bien en un proyecto como este, para ver que áreas se usan más y su comportamiento.

Me recuerda un poco la situación actual a la anterior que ya se ha vivido, que con la aparición de los hooks todo el mundo decía que Redux estaba muerto y no veo por qué no pueden convivir ambas cosas. El contexto está muy bien, y se agradece, pero en mi opinión no sustituye completamente a Redux, creo que simplemente si quieres disfrutar de algunas cosas de Redux sin tener que implementar todo lo puedes hacer de manera sencilla!

Es que me ha hecho gracia lo del 99% de los casos JAJ

Le echaré un ojo al blog, no suelo ser fan de los blogs en React precisamente por lo que has dicho del SEO, pero a día de hoy hay pila de herramientas para que esto deje de ser un problema, pero claro, si no lo hiciste al principio pues da un poco de pereza.

Saludosss

1 respuesta
isvidal

#17 Es que lo del 99% de los casos es cierto, la única diferencia entre ambas es que en aplicaciones donde el estado puede mutar muchísimo dicen que Redux está más optimizado y por tanto da mejor rendimiento.

Pero fuera de estos casos borde no hay diferencia alguna, el funcionamiento es cuasi idéntico, con la facilidad de, primero, al ser nativa de React, menos lineas de codigo para implementar que con Redux, y segundo y no menos importante, te ahorras una librería en el package.json.

Miratela porque te darás cuenta de que a nivel de funcionalidad no vas a echar en falta nada, tiene exactamente lo mismo, dispatcher etc... Todo lo que dices que hace Redux lo tienes con Context con menos líneas.

Mira si es fácil, mirate este código, en este fichero declaró el reducer y el contexto, y creó el componente de React que lo engloba, así como el hook que permite acceder a tanto el tema como el dispatcher, en 4 líneas contadas.

Reducer + dispatcher + componente + hook

Luego te vas al punto de entrada de tu App o donde sea que quieras usar ese contexto y:

function App() {
return (
<StateProvider initialState={initialState} reducer={reducer}>
<Main/>
</StateProvider>
);
}

Y luego para consultar ese estado o acceder al dispatch en cualquiera de sus hijos <Main> includio, simplemente usas el hook y ya:

const [{theme, user, ...blablabla}, dispatch] = useGlobal()

Thats it.

1 respuesta
Zoko

#18

Yo creo que afirmar que el 99% de los casos es cierto es un poco exagerado. Pero bueno, cada uno piensa lo que quiere.
Decir que la única diferencia entre ambas es que en teoría Redux está mas optimizado si hay muchas mutaciones es donde realmente me demuestras que no sabes de lo que estás hablando. Te dejas fuera toda la parte de lo que se suele hacer cuando trabajas en un proyecto grande y no un sideproject, que es el debugging. Hasta que no se llegue al nivel de debugging que puedes obtener con Redux y su tooling, no creo que lo meta en proyectos que están en producción y en los que curran varios developers, como es en mi trabajo.

No existe una cosa mejor o peor, son dos alternativas. Pero pareces empeñado en demostrar que Redux está obsoleto y que no tiene sentido usarlo.

La alternativa que propones es muy buena, y da gusto ver como con React tal cual puedes conseguir hacer muchas cosas para manejar un estado global, pero todavía no se ha llegado a sustituir, como dices tú.

El ejemplo que das es muy bueno, y sé perfectamente como se usa la Context API, pero de momento no están a la par.

1 respuesta
isvidal

#19 Pero te das cuenta de que tu caso es el 1% ?

La mayoría de veces lo que quieres es un contexto común, simple, entre distintos componentes de más o menos profundidad y no tener que estar pasando props entre ellos ni hacer malabares raras, en esos casos con Context te basta, y creo que estos son la mayoría de los casos.

Está claro que cuando hablamos del nivel industrial que te mueves tú, con mucha complejidad de por medio, Redux es más maduro y su ecosistema te permite ir mucho más al detalle. No te lo discutiré, no he llegado a trabajar a ese nivel.

Soraghatsu

si admites sugerencias del nombre te doy una:

True horóscopo 100% real no fake 1 link download mega

Ontopic: me meto el link a favs, para seguir esto, que me interesa

1 respuesta
Zoko

Trabajar en una codebase grande con varios developers es el 1%?

Y querer hacer debugging de manera sencilla también?

Yo he dicho desde el principio, lo puedes ver en #15 que me parece una gran alternativa para no meter Redux, pero te has empeñado en decir que Redux no hace falta en 99 de cada 100 casos, y yo sólo he intentando dar mi opinión de por qué eso es una exageración. Si para este proyecto me parece estupendo que no te lies a meter Redux, pero tampoco me parece que en el 99% de proyectos puedas tirar sólo con esto.

Parece que te lo tomes como un ataque JAJ

1 respuesta
isvidal

#21 Creo que le voy a poner Astral Daily Horoscope 2020

Cumplo todos los checks de CEO jajajajaja

He pensado Deus Daily Horoscope, pero no se yo si meter a dios en esto es buena idea.

#22 Ni mucho menos, tiendo a ser muy exagerado muchas veces, y cuando he dicho 99% pues me flipo, siempre es interesante leer opiniones distintas.

2 1 respuesta
Soraghatsu

#23 como veo que tienes todo con aspas rojas te digo como empezaria a organizarme:

Empieza llenando el Trello y dale vueltas tio, piensa bien como quieres montarlo todo, si hace falta hazte esquemas o flujos, pero para mi, al menos la organizacion al principio es fundamental, y hago hincapié en esto, en el proyecto en el que estaba trabajando (llevo 2 años en el proyecto y por el corona ha sufrido un parón temporal) al principio era todo un caos, estabamos desarrolando mientras el analista analizaba la aplicacion, y tuve que retrabajar un montón, por eso te recomiendo que pongas lo primer el trello en orden

1 1 respuesta
isvidal

Día 4

React Native

A ver qué os parece de momento el flujo inicial, una vez completado ya verias el menú principal, hoy me he quedado en el reconocimiento palmar:

Es la versión de iOS con tema oscuro grabada con mi super Iphone 11 pro. Feedback por favor, aún negativo es apreciado, pues en las fases iniciales es cuando es más fácil modificar cosas.

En otro orden de cosas he creado un par de Utils para fechas y para sistema operativo ( Me ponía de los nervios tener que hacer todo el rato Platform.OS === 'ios' ):

Carpeta utils

Un buen commit, el grueso son SVG que uso para todo lo que son imágenes:

Cuarto commit.

Mañana

Mañana me pongo con una cosa muy guay que no he hecho nunca que es el reconocimiento de "cosas" con la cámara, mi intención es ser capaz de saber si tienen la palma de la mano en frente de la cámara o no.

Una vez tenga hecho esto refactorizare todas las pantallas iniciales y me pondre ya con el main menu y le core por donde el usuario navegará.

Comentarios

#24 De hecho en el blog que hice, con su backend y todo si me monte el trello y lo lleve y llevo de puta madre, porque ese al ser un proyecto que involucraba varias cosas (Docker, Nginx, PHP Backend, React frontend, diseño...) sin el trello me hubiera vuelto loco, en este proyecto como es mas mini de momento tiro sin el sin ningún problema. A ver si saco un rato y lo monto.

Vuestra opinión

¿Que pensais de los colores, iconos, fondos que he elegido para la app?

r2d2rigo

Estas metiendo las imagenes como SVGs wrappeados en JS? Esa app ira muy bien en tu iPhone 11 pero en cualquier otro movil se va a arrastrar.

1 respuesta
isvidal

#26 Tú crees? En el emulador de android en PC va bien, y suele ir muy pegado.

Ten en cuenta que no están "wrapeados" en plan cutre, están instanciados como componentes de React (JSX), y que además no tienen animaciones:

Por si las moscas esta tarde compilare y lo instalare en un samsung de hace +5 años y un Xiaomi de hace 3.

Por cierto, alguno que sepa mas que yo ( @Zoko ), en PropTypes si quieres declarar como que tiene que ser una propiedad del objeto de StyleSheet.create, es posible? O tienes que tirar con PropTypes.object ?

2 respuestas
HeXaN

Si subes una versión preliminar yo también puedo probar el rendimiento.

1 respuesta
Zoko

#27

Pues la verdad es que es una buena pregunta, yo habría tirado por donde has tirado tú ya que que yo sepa no existe una prop-type especifica para las stylesheets de RN.

Mi otra apuesta, sólo por si acaso, sería poner la que has puesto tú, probar en consola y ver si el Object se lo come bien, porque he leído que a veces es un numero de referencia lo que recibe.

Tira con object, aunque algunos linters (el de Airbnb de React por ejemplo) te dicen que no es buena idea, ya que no tienes control sobre lo que se le pasa. Pero bueno, al fin y al cabo los linters son sólo sugerencias, así que no problem.


Yo ando liado también con un proyectillo, voy a comprar hoy el dominio y a ver si este finde lo termino. Algo muy tonto pero que da gusto verlo.

1 respuesta
B

No lo habia visto, pillo sitio para leerlo todo. Sobre el logo, el 3º.

2 respuestas