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

isvidal

Una pregunta para los pythoneros,

He reestructurado el proyecto de scraping y ahora es tal que asi:

El problema es que los paths no me funcionan:

Al ide le gusta, pero cuando tiro el script:

1 respuesta
isvidal

Día 31

BACKEND (PHP + Yii2)

He estado implementando las APIS tanto de token de usuario para notificaciones push, como la de los mensajes a los astrólogos:

Al final voy a guardar información introducida por el usuario más su token de la aplicación, aún con esto sigo sin poder saber quienes son ni identificarlos de ninguna forma, así que no necesito meterme en fangos de data personal.

Y un poco de control de rutas:

Ademas he implementado las grids para los datos que se han de poder visualizar en el backend, mensajes, usuarios y data diaria pillada por el horoscopo:

Todas estas opciones de menú ya son reales pero de momento solo hay data en mensajes.

Podéis probar vosotros mismos a marcar una mensaje como contestado pulsando el botón sí/no de más a la derecha:

Usuario : jvidalv
Password: 123456

https://test.vvadmin.dev/astrale/messages

Scraper

Tengo el problema de #181 a ver si @HeXaN @Unrack me dicen algo, me mire en su dia lo de los módulos por encima pero no saqué nada en claro.

Mañana

Espero implementar las apis en la app y modificar el scraper para que recoja la data que quiero milimétricamente.

Procrastinación

Es culpa del Terraria que hoy sólo haya programado 2 horas, y ayer 10 minutos. Fuck

1 respuesta
kikonazoo

#182 Según tengo entendido, por defecto Python solo te deja deja referenciar paths al directorio del entry-point, y lo considera el top-level, así que tampoco te sirve algo como from .. import.

Hay bastante doc en google sobre soluciones a este tema:

Aunque no sabría decir cual es la forma más limpia de hacerlo.

Edit: Tu caso es más fácil que todo eso, has probado simplemente 'from utils.Mongo import Mongo'?

1 1 respuesta
HeXaN

Puedes añadir al script de entrada la ruta base de tu proyecto y listo.

1 respuesta
isvidal

#183 No funciona ya lo probe.

#184 Como hago eso?

3 respuestas
HeXaN

#185 No estoy en el PC pero mira por aquí: https://stackoverflow.com/questions/16114391/adding-directory-to-sys-path-pythonpath

1
kikonazoo

#185 Viendo la estructura de directorios, creo que te has dejado los init.py (con doble underscore, que me lo coge como negrita)

https://docs.python.org/3/tutorial/modules.html#packages

Creo que metiendo el init.py e importando como src.utils.Mongo te debería funcionar

2 respuestas
Unrack

#185 #187 Si no me equivoco es así. Los init.py sirven para que Python busque en esos directorios a la hora de importar.

1 respuesta
HeXaN

#188 #187 Teóricamente desde Python 3 no son necesarios.

2 respuestas
Unrack

#189 Es cierto su problema es que el proyecto donde llama a ese módulo "no se leen". En ese caso tienes que añadir el path de ese modulo al sys.path de Python del entorno virtual.

isvidal

Día 32

Python

He corregido el tema de los paths, al final realmente solo era utilizar directamente "src", pero el ide no me lo pillaba bien y me marcaba como error, y eso resultó muy efectivo confundiendome.

He automatizado el jenkins para que lo tire cada dia a media noche.

BACKEND (PHP + Yii2)

He tenido algún problema con la vagrant + docker que ya he solucionado, aquí un vistazo al controlador que pinta una grid con la data diaria:

Y esto resulta en:

Yes it's fucking ugly, mañana seteare las columnas correctamente para que no pinte esta shit con la id y sin el contenido.

Mañana

Implementare las apis en la aplicación y añadire loaders en la publicidad, intentare tener tambien las notificaciones push implementadas.

eondev

#189 Solo si van vacíos.

Yo no recomiendo tocar el Pythonpath

#181 Y usas las rutas de los importes mal, empezaría en utils.Mongo no en scrapper.src blabla

Las rutas relativas son siempre desde el fichero del que se llama hacia adelante usando un punto marcando que se empieza desde ese nivel de jerarquía o dos puntos si se quiere ir atrás.
Las absolutas siempre son desde el fichero de entrada del programa. Desde el main tuyo hacia dentro.

1 respuesta
desu

Yo suelo usar la estructura:

main.py
/lib
/lib/__init__.py

No entiendo porque creais carpetas/packages para un proyecto tan peque;o.

1 respuesta
isvidal

Día 33

SCRAPER (Python)

He mejorado la data del scraping y ahora la castellana tiene algo más de calidad, aún así me parece que la volveré a cambiar pues la que sacó en inglés es muy muy superior, tanto para la daily data como para la stale.

Aqui una fotico de como saco la data diaria del Hola:

APLICACIÓN (REACT NATIVE)

He implementado ya toda la data real en todas las vistas, tanto la diaria como la de compatibility.

He creado un hook común para hacer ambos fetch's:

Si alguien tiene curiosidad para que vaya más a detalle con el hook y con fetch, pues encantado de explicar si preguntáis.

Además he implementado una transición mientras carga el contenido de la publicidad que mostrará al usuario cuando haga ciertas acciones:

El component Portal te permite posicionar su contenido por encima de sus ancestros, es un componente fantástico para hacer cosas como alertas, avisos, o loaders.

Os dejo una demo donde podéis ver este loader en acción cuando consulto compatibilidades o cargo una lección:

Repositorios

En lugar de poner commits os pongo los repos de todo:

Mañana

En Python seguramente buscaré una pagina mejor de donde robar la data para el Castellano, y en la app espero implementar ya las caras de los astrólogos finales así como pulir cosas como rate/share y notificaciones push.

Comentarios

#193 Porque reutilizar el repo y el proyecto para mis futuras apps, digamos que será mi scraper padre, y esta app es solo uno de sus brazos.
#192 Al final se quedo asi y funciona perfectamente:

2 3 respuestas
eondev

#194 Desde donde inicias el programa? Cómo lo llamas? En principio el src sobra, debería vamos xD

1 respuesta
nobody1

Acojonado me hallo con el diseño y con la arquitectura, vaya crack! Eres diseñador aparte de desarrollador?
Por mi parte el tema del scraper lo hubiese hecho en scrapy, tardarías mucho menos yo creo, pero ya que has empezado con otra cosa sigue con ello.

1 respuesta
QuitCat

#194 Tengo una par de dudas con el hook:

  • ¿Se puede "refrescar" la info de una pantalla?¿El hook esta praparado para ello? Me refiero al comportamiento típico de scroll hacía abajo
  • Creo que es mejor usar useReducer en lugar de tres useState. No por ser 3, sino por el hecho de que dos de ellos los modificas a la vez y no te aseguras que esos dos cambios de estado consecutivos no desencadenen mas de un render
  • Sería mejor si la promise begin la hicieras "cancelable", y cancelarla en el return del useEffect. Esto evitaria que un componente que esta cargando información pero el usuario vuelve a la pantalla anterior intente hacer setState's de un componente ya desmontando
2 1 respuesta
isvidal

Día 34

SCRAPER (Python)

He mejorado un poquito la data en español y ahora ya no tengo doble espacios en blanco, thanks re:

APLICACIÓN (REACT NATIVE)

He implementado todo lo comentado por #197 (Reducer y control para cuando se desmonta el componente).

Repositorios

Mañana

Estoy con el fetch POST de las preguntas a los astrólogos que no se porque me ha dado por culo ahora, mañana debugo a fondo a ver que mierda esta pasando. Y y ya si espero ponerme con compartir/valorar y tocar algo de notificaciones push.

Comentarios

#195 No, main.py esta al mismo nivel que src/.
#196 Soy full programer, en mi dia a dia curro de backend, lógica de negocio a punta de SQLServer y CRUDS jajaja Pero siempre se me dio bien dibujar, diseñar... aunque no estudie nada de esto (Y arrastraré toda la vida esta decisión, no hay nada que me absorba más que dibujar, me pasaba el dia dibujando mierdas random antes...) así que tiro de ojo con todo sin ninguna referencia teórica.
#197 Con la propiedad loading controlo el fetch. El hook devuelve una referencia a setLoading (Que ahora es un dispatch al reducer) y si loading es true se vuelve a lanzar el fetch.

covaga

#194 creo que desde euro residentes podrás pillar buena información del horoscopo, compatibilidad... etc

1 respuesta
isvidal

Día 35

Se me hizo tarde ayer y me dio pereza.

APLICACIÓN (REACT NATIVE)

He implementado la api de contactar con un astrólogo, cuando le dan al botón de enviar muestra la publicidad, carga la data y envia:

Voy a cambiar el nombre del type del reducer y voy a llamarlo toggleLoader.

BACKEND (PHP)

El controlador que recibe la petición POST.

Repositorios

Más tarde

Voy a implementar un componente para mostrar notificaciones y que reaccione a acciones del usuario, ej "Mensaje enviado!".

Comentarios

#199 Las compatibilidades en castellano ya las saco de alli.

2 respuestas
JuAn4k4

#200 ¿ Realmente necesitas que esos 3 awaits vayan uno detrás de otro ?

1 respuesta
r2d2rigo

#200

  • El set ad unit ID se hace una sola vez, al arrancar la app.
  • El request ad se hace tambien al principio o en cuanto puedas, para tener un anuncio ya listo para mostrar cuando te toque.
  • Cuando hayas mostrado el anuncio, haces otra vez el request ad para tener el siguiente ya caliente.
1 respuesta
isvidal

#202 Pero si quiero segmentar anuncios por pantallas para saber que % de interacción tiene cada anuncio eso que dices tu de

El set ad unit ID se hace una sola vez, al arrancar la app.

No me sirve, pues cada bloque de anuncios que generas en Admob tiene su propia ID.

De hecho creo que te estas confundiendo y hablas de versiones antiguas de AdMob, ahora ya no se setea una id global al arrancar la app, va por bloque de anuncio.

Lo único que hay que implementar global ahora es esto:

Y solo si es DEV para que te chute anuncios de test.

Con lo otro si tienes razón que pueda generar uno con la primera carga para que la interacción sea instantánea.

1 respuesta
r2d2rigo

#203 es que lo estas haciendo mal, esos eventos de engagement/conversion/etc deberias trackearlos tu a mano con un servicio de analytics paralelo. Aparte asi puedes medir el fill ratio de ads y ver cuando el servicio te los esta poniendo bien, etc.

Por lo general solo tienes una ad unit por formato y app, hasta la propia documentacion te dice que lo hagas en el onCreate https://developers.google.com/admob/android/interstitial

isvidal

Hoy estoy liado con los assets (Logo versión 3 jajaja) y las imagenes para los markets, no se que os parecen la versión alpha de estas:

Ayer hice cambios pero me dio pereza hacer el diario, ahora mas tarde lo subo.

Este fin de semana espero tener ya publicadas y disponibles para betatesters en ios & android.

#201 Podria hacerlo como dice #201 e instanciar uno solo y re utilizarlo en todas las partes, pero ya que no quiero liarme con un tracking externo (de momento) tengo 4 distintos por los 4 casos de uso, entonces tengo que cargar cada uno por separado cuando se muestran.

isvidal

Día 36

APLICACIÓN (REACT NATIVE)

Implementado un componente cuando se te abre una pestaña "modal" que es distinto según si estas en Android o iOS:

Añadidas las caras definitivas de los astrólogos:

Repositorios

Mañana

Día de notificaciones push y rate/share espero que esta vez SÍ.

isvidal

Día 37

MARKETS

Hoy ya me he empezado a pelear con las fichas de Android e iOS. Android ya la tengo casi al 100%, iOS la tengo generada pero tengo que llenarla de data, lo bueno es que ya tengo casi todas las imágenes preparadas que es lo que más cuesta.

Os presento la versión definitiva del icono:

La destacada de android:

BACKEND (PHP)

He añadido una api que devuelve la política de privacidad en formato HTML, necesario para subir la APP al menos a iOS.

Repositorios

Mañana

Ya tendré una versión beta de la aplicación para ambas plataformas y por fin podré probar de forma nativa como luce, si alguien se anima a probarla mirare si puedo hacerla pública mediante link, o si necesito correo electrónico de la persona ya lo dire.

isvidal

Día 38

BACKEND

En el backend he creado un frontend (jejejejeje) cutre en media hora que es la "página" de la aplicación:

https://test.vvadmin.dev/site/astrale

Además de un formulario de contacto:

https://test.vvadmin.dev/site/contact

Y unas muy trabajadas políticas de privacidad:

https://test.vvadmin.dev/site/privacy-policy

He refactorizado código por detrás, corregidas apis para almacenar el token de las notificaciones push etc...

APP

He añadido la funcionalidad de poder compartir un enlace sobre la aplicación, y he añadido el post a la api que almacena el token para notificaciones push.

VIRTUALBOX

Me he tenido que crear un macOS virtualizado versión Catalina para poder subir la app con XCode, thanks Apple.

MARKETS

Ya tengo todas las fichas generadas, pendiente de revisión en Android y pendiente de subir la app y enviar para revisión en iOS.

Cuando me den el OK y compartiré el enlace a la beta abierta si alguien quiere hacerme algún testeo.

Repositorios

Usuarios habituales

  • isvidal
  • JuAn4k4
  • Unrack
  • HeXaN
  • Kaledros
  • Zoko
  • Soraghatsu