Cuando creamos un mosaico de imágenes con variables altura-temporales, podemos a posteriori programáticamente añadir nuevos rásters. Esto nos da una gran flexibilidad a la hora de, a medida que procesamos, poder actualizar un conjunto de datos a lo largo de los meses o años.
Para crear de forma manual subimos los archivos a la carpeta donde queramos ubicarlos, y creamos los archivos /
Como concurrencia entendemos la posiblidad de ejectuar dos procesos a la vez, pero no necesariamente de forma paralela, mediante mecanismos para ir intercambio el proceso que en cada momento está en ejecución. La programación asíncrona suele hacer referencia a concurrencia relacionada con procesos limitados por operaciones de I/O: cuando el sistema operativo coge el control para realizar alguna operación de lectura o escritura, ya sea archivo, red, etc, el programa pasa a ejectuar otras líneas de código de forma que conseguimos trabajar de forma concurrente (aunque dos líneas de código nunca lleguen a ejecutarse a la vez).
Para crealas, async def
. Para esperarlas, await
. Cuando se crea, cuando se llama a una función definida con async def
, obtenemos la corrutina, que no es más que un objeto con la definición del cómputo que queremos realizar, pero éste no se realiza. Para ejecutarlas, tenemos que llamarlas dentro del bucle de eventos de asyncio. El bucle se crea con asyncio.run(coroutine())
, y para ejecutarlas dentro simplemente las llamamos con await
. Tenemos tres formas de ejecutar corrutinas:
No recuerdo cómo se llama exactamente. Es muy simple, pero tiene nombre.
Para definir cómo se comunican los contenedores.
Caddy es un proxy que puede sustituir a nginx. Ofrece mejor rendimiento 1 y una configuración, en mi opinión, mucho más sencilla.
Un ejemplo del mundo real para entender este patrón sería el siguiente:
Hace unas semanas (posiblemente ya meses) publicaba Antonio Leiva en su blog un artículo sobre cómo él implementa en los ítems de los RecyclerView los manejadores de eventos, en concreto el más típico y útil, el OnItemClickListener. Es algo que casi cualquier aplicación de Android requiere al no ser una funcionalidad que venga de fábrica. Como en su momento tuve que lidiar con ello, y como además encontré y/o reinventé la rueda un par de veces, voy a hablar un poquito sobre las cinco formas (en realidad cuatro más una) que he probado, sus pros y contras.
Necesitaba hacer un menú contextual para Android, pero no quería que fuese un AlertDialog. Con éste, al hacerse un difuminado (blurring) del fondo, se le otorga una importancia excesiva al menú. Por eso, como todos hacemos, me puse a buscar.
La programación orientada a objetos se basa en asociar en un mismo elemento (un objeto) tanto un estado como las operaciones asociadas a dicho estado. Como dice Martin Fowler:
Cuando trabajamos con datos, en muchas ocasiones tenemos que localizar rangos de valores que cumplan ciertas condiciones, normalmente sobrepasar un cierto umbral.
Sobre Android y su emuldaroe, cómo poder hacer alguna petición desde el emulador a algún emulador que estamos desarrollando en local.
Resumen del artículo sobre como configurar y trabajar con telegraf e inyectar valores en timetabledb.
En Clojure, core.async facilita la programación asíncrona mediante canales. Los canales son intermediarios que se usan para conectar dos procesos1, uno haciendo las veces de emisor y otro de receptor. Pero pueden usarse para conectar múltiples procesos: sirven para relaciones many-to-many.
Usando conjuntamente tipos y pocos y refined para validar datos en Scala 3.
Wagtail nos ofrece fundamentalmente dos tipos de modelos: Page para modelos que puedan tener vistas, y Model1 para el resto de modelos más sencillos.
Del capítulo 1 al 4 es la base que hay que leer. El resto son aplicaciones específicas, algunas muy interesantes, pero que si no se usan de vez en cuando pueden olvidarse. Pero puede venir bien aunque sea solo leerlas, porque se definen muchas tecnologías bastante modernas a bajo nivel.
Google nos permite, a partir de una serie de puntos, obtener las distancias y tiempos de viaje previstos para llegar hasta ellos desde una ubicación fija o desde la ubicación obtenida a partir de la posición del dispositivo móvil mediante la API para cálculo de distancias.
Framework basado en React que facilita programar con Server Side Rendering.
Hay distintas formas de prerenderizar en el servidor componentes de React:
En docker-compose podemos usar environment in envfile. El primero sirve para definir variables que serán usadas por el contenedor, pero no sirven para sustituir en otros puntos del propio archivo de configuración (o en configuraciones que extendamos). El segundo en cambio nos define un archivo cuyos valores serán también exportados al ambiente del entorno de ejecución.
El artículo How I Take Notes… me parece un excelente punto de partida una vez se tiene algo de base. También tenemos otras referencias sobre org-roam y sobre la base teórica:
Puedo usar org-roam tanto para conocimiento como para tareas, pero para este último fin no es lo más recomendado. No es que lo piense (es la opinión del autor desarrollada en How I Take Notes), pero sí es cierto que para tareas lo único que nos aporta (la sensación que me da al menos) es la automatización de los links entre los TODO.org que compongan un proyecto entero, en el caso de que en efecto lo dividamos. Así que no voy a usarlo para eso.
La utilidad de estas metodologías no es generar listas de tareas, aunque puede usar como ese fin Conocimiento y Tareas. Se le da bastante énfasis a las referencias, de hecho voy a usarlo con un slip-box para referencias. He visto en bastantes sitios usar el software Zotero para gestionar las referencias. Lo probaré a ver si me aporta realmente utilidad.
Leptos es un framework para desarrollo de páginas web SPA, SSR, etc.
Ambos conceptos están relacionados pero no son lo mismo.
Las plantillas pueden heredar de otras plantillas.
Si uso Vitest, es en perjuicio de Jest. Tal y como comenta la documentación de Vitest, hay mucha duplicidad entre Vite (que no Vitest) y Jest, con lo que hay que configurar dos pipelines distintos. La existencia de Vitest nos simplifica esta configuración.
Voy a probar una forma de crear monorrepos distinta a como lo hacía en el ITI. Me voy a basar en los artículos al respecto de Tweag.
Valores adimensionales calculados mediante relación entre DN de distintas bandas, cada uno destacas ciertos aspectos.
Esta es una cabecera típica de un GET a Supabase.
Comandos comunes para Redis. Tengo que usar redis-cli pocas veces y se me acaban olvidando.
Geoserver permite crear mosaicos a partir de un conjunto de raster georreferenciados. Pueden ser tanto espaciales como temporales. Este último caso es el que nos interesa.
Distintos atajos de teclado, algunos bastante comunes, pero que no se me quedan de ninguna forma y necesito consultar cada dos por tres.
Un álgebra nos describe las operaciones permitidas mediante un DSL1, el cual se define dentro de otro lenguaje de programación huésped (en nuestro caso Scala).
Publicar en Kafka es sencillo. Es importante saber que el orden se garantiza dentro de una partición pero no entre particiones.
Para que desde el exterior de una red puedan conectarse a dicha red hay que definir advertised.listeners
. Si usamos docker, KAFKA_ADVERTISED_LISTENERS
.
La librería más usada en el ecosistema de Typelevel es fs2-kafka. Aquí dejo algunos apuntes extraídos de la documentación y de algún que otro artículo revisado que dejo enlazado.
La instalación de la JVM lleva asociada varias herramientas. Una de ellas, JMH, sirve para analizar el rendimiento de la trozos de código.
Para serializar/deserializar a Json instancias en Scala, más si usamos Cats, una opción bastante mayoritaria es usar la librería Circe.
Después de haber levantado un clúster con Kafka en Docker, hay que configurar el cliente. La configuración en Kafka es bastante compleja.
El uso de Kafka en Rust es muy distinto (obviamente) a su uso en Kafka en Scala, al menos si usamos fs2-kafka. Bastante bajo nivel, hay dos librerías con tirón pero usaré rust-rdkafka.
El uso de tiles, si el archivo de origen a partir del que se generan no es muy grande, me parece más apropiado que usar directamente un COG o soluciones más pesadas como geoserver.
Para la creación de tiles podemos usar gdal.
Para instalar podemos seguir la guía en la página oficial. A continuación un resumen.
Aunque MariaDB intenta ser compatible con MySql, esta compatibilidad no siempre se consigue al 100%, muchas veces de forma deliberada por diversas razones.
Algunas características peculiares de los tipos de datos en MySql/MariaDB y su uso en Rust usando la librearía Sqlx.
Las funciones de p5.js se llaman con el prefijo de javascript. Esto es, aunque al declarar el ns hagamos el require
Las conexiones a Mongo pueden definirse con srv o sin él.
El lifetime en rust es básico para la gestión de las variables por parte del compilador: toda referencia tiene un tiempo de vida, que es el ámbito en que dicha referencia es válida. Si tratamos de usar una referencia cuando ya se acabó su lifetime, el compilador dará un error porque no podrá asegurar que son válidas cuando vayan a usarse.
Cuando queremos trabajar en 3D con p5js, necesitamos usar Webgl. Para ello, hemos de definirlo al crear el canvas.
Muy útiles pero más farragosas de usar que en Clojure.
Cuando tenemos un enum con dos variantes, una de las cuales no tiene valor y la otra sí, el compilador hace que la memoria consumida por dicho enum sea igual a la que ocuparía el tipo envuelto en la variante que sí mantiene un valor.
Cuando un consumidor de Kafka muere, las particiones han de ser reasignadas para que los mensajes no consumidos en las particiones que estaban asignadas a aquél puedan ser consumidos.
Hay una gran diferencia entre usar genéricos y recibir un trait sin especificar implementación. En el primer caso el compilador monomorfiza, en el segundo se produce dispatch dinámico en tiempo de ejecución.
Un Bounded Context es un contexto acotado, un parte de nuestro dominio dentro del cual podemos definir nuestros modelos de forma particular para satisfacer las necesidades específicas que tengamos en esta parte de dicho dominio.
En Geoserver existen varios conceptos que es importante conocer para tener los mapas bien ubicacdos.
OpenDroneMap despliega una api para poder hacer modificaciones, consultar, etc.
OpenDroneMap despliega una api para poder hacer modificaciones, consultar, etc.
Cuando calculamos un índice vegetal, obtenemos una imagen con una sola banda. La representación con matplotlib es muy sencilla, está perfectamente preparado para mostrar ese tipo de matrices. Pero Leaflet no sabe representarlas, así que hemos de obtener el RGB para enviárselo con la representación que queremos usar.
Sentinel2 ofrece dos productos, uno imágenes cuasi en bruto en la parte superior de la atmósfera (TOA) y el otro con imágenes en la parte inferior (BOA) con mayores correcciones.
Los COG son archivos Geotiff optimizados para su uso en aplicaciones web.
Notas tomadas a partir de la fantástica ponencia de Gabriel Lebec sobre cálculo lambda.
Se necesita PP cuando:
Código en JavaScript del libro An Introduction to Functional Programming Through Lambda Calculus. Posiblemente (casi seguro al 100%) solamente los ejemplos pero no los ejercicios.