viernes, 22 de diciembre de 2023

Configurando Elasticsearch para que no distinga tildes o eñes

Típico problema, indexamos un documento con el texto "Menganita conduce un camión", buscamos "camion", sin la tilde, y no aparece el documento.

Basado en este artículo: https://sacavix.com/2020/10/elasticsearch-para-espanol-acentos-y-raiz-de-palabras/


Receta rápida

1. Reconfiguramos el índice que nos interese:

curl -XPUT http://localhost:9200/_template/miindicetemplate -H "Content-Type: application/json" -d '
{
  "index_patterns": "miindice",
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1,
    "analysis": {
      "analyzer":{
      "mianalizador": {
          "tokenizer": "standard",
          "filter":  [ "lowercase", "asciifolding", "default_spanish_stopwords", "default_spanish_stemmer" ]
      }
    },
    "filter" : {
        "default_spanish_stemmer" : {
            "type" : "stemmer",
            "name" : "spanish"
        },
        "default_spanish_stopwords": {
            "type":        "stop",
            "stopwords": [ "_spanish_" ]
        }
    }
   }
  },
  "mappings": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "mianalizador",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "leadIn": {
          "type": "text",
          "analyzer": "mianalizador",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "author": {
          "type": "text",
          "analyzer": "mianalizador",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "pretitle": {
          "type": "text",
          "analyzer": "mianalizador",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
}'

2. Borramos el índice

curl -X DELETE http://localhost:9200/miindice



3. Indexamos de nuevo el contenido. Si es un proyecto Symfony con FOSElastica:

symfony console fos:elastica:reset
symfony console fos:elastica:populate

domingo, 1 de octubre de 2023

No pasan más cosas no sé porqué...

 Supermercado en Madrid, en el vestíbulo tienen una pantalla con autopromos, etc... y una ventana de TeamViewer en la que se ve el ID del equipo.


¿A quién no se le ocurrirían varias maldades, llamando a la tienda e identificándote como del "departamento de informática"?



martes, 23 de mayo de 2023

No, no le voy a decir a ChatGTP que escriba el blog

Si ya la web estaba llena de basura pensada para el bot de Google, ahora se le va a unir la basura generada por ChatGPT 🤦🤦🤦




lunes, 26 de diciembre de 2022

Django desempolvado, reloaded (parte I)

Aunque Django no es mi herramienta ni entorno de trabajo habitual, me gusta mantenerme actualizado y guardo un especial recuerdo de este framework. Durante un tiempo fue mi medio de trabajo y fue una de las razones que afianzaron mi preferencia por Python como uno de mis lenguajes preferidos.



Como siempre, para conocer algo lo mejor es ponerse manos a la obra y hacer un mini-proyecto lo más realista posible. El tutorial de Django es una maravilla, con el paso de los años lo han ido ampliando y es una fuente de información muy valiosa cuando uno quiere recordar las bases de Django.

Nuestro mini-proyecto: un micro-cms

Desarrollemos un CMS parecido a Wordpress o la plataforma Blogger. No vamos a hacer nada especial:
  • Para clasificar los artículos tendremos secciones (estructura jerárquica) y tags (estructura horizontal)
  • En este CMS pueden escribir diferentes autores
  • Cada artículo puede tener una imagen ilustrativa. También vamos a permitir diferentes plantillas (por ejemplo, post en columnas, post con foto grande,...)
  • Dispondremos de una herramienta de administración o backend para editar artículos, categorías,..
  • La navegación podrá ser por autores, categorías y tags. La página de inicio será un listado con los últimos artículos
Estos son los requisitos de un proyecto que se hubiese planteado hace 15 años, pero no pretendemos hacer nada que no sea refrescar Django, es el objetivo.

  • Primer sprint: configurar el entorno y definir el modelo de datos
  • Segundo sprint: habilitar el backoffice de Django y ver si nos sirve como entorno de edición
  • Tercer sprint: habilitar la página final de un post
  • Cuarto sprint: habilitar las páginas de inicio, navegación por autores, secciones, tags,...
  • ... y lo que se nos vaya ocurriendo...

Primer sprint: configurar el entorno y definir el modelo de datos

En el momento de escribir esto (dic/2022), la versión de Django estable es 4.1.4 
Instalarla es trivial. Aunque se recomienda usar un "virtual env", dado que en el equipo que se va a desarrollar este mini-proyecto no hay conflictos de versiones, instalaremos Django directamente a nivel global.

$ sudo pip install Django==4.1.4

Una vez instalado, creamos el proyecto y entramos en el directorio

$ django-admin startproject microcms
$ cd microcms
$ ls microcms

Se nos lista un fichero manage.py y un directorio que se llama igual que el proyecto, microcms. Según la documentación, el nombre del directorio más externo, es indiferente. No así el interno, que contiene código y el típico __init__.py que lo identifica como un módulo.

Dentro del proyecto vivirán las apps que vayamos desarrollando, para proyectos pequeños o de ejemplo como este podría ser razonable hacerlo todo dentro de una misma app. Por ahora crearemos una app, cms, que es donde definiremos nuestro modelo de datos.
Si más adelante se nos ocurre alguna funcionalidad extra, tendría sentido desarrollarla en una app diferente.

$ ./manage.py startapp cms
$ ls 
total 12K
drwxrwxr-x 3 david david 4,0K dic 26 17:59 cms
-rwxr-xr-x 1 david david  664 dic 26 17:49 manage.py
drwxrwxr-x 3 david david 4,0K dic 26 17:59 microcms

Tenemos un nuevo directorio en el proyecto, es también un módulo en el que se definen modelos, vistas, etc.

$ ls cms/
total 24K
-rw-r--r-- 1 david david   63 dic 26 17:59 admin.py
-rw-r--r-- 1 david david  138 dic 26 17:59 apps.py
-rw-r--r-- 1 david david    0 dic 26 17:59 __init__.py
drwxrwxr-x 2 david david 4,0K dic 26 17:59 migrations
-rw-r--r-- 1 david david   57 dic 26 17:59 models.py
-rw-r--r-- 1 david david   60 dic 26 17:59 tests.py
-rw-r--r-- 1 david david   63 dic 26 17:59 views.py

En este primer sprint trabajaremos con cms/models.py

Definimos las entidades Section, Tag y Article. Por ahora utilizaremos como autores el propio objeto User que incorpora Django. Veremos si más adelante tenemos que personalizar esto.



A reseñar la autorreferencia en la entidad Section, para poder construir un árbol de secciones.

Debemos añadir esta app, cms, en el settings.py del proyecto:


Una vez hecho, esto, podemos hacer las migraciones para crear las tablas. Estamos usando una base de datos local sqlite, podemos examinarla al terminar el proceso y veremos todas las tablas de las diferentes INSTALLED_APPS:



Si ahora intentamos crear una sección, tenemos la primera en la frente: da error porque no le hemos dicho en el modelo que la sección "parent" podría ser vacía.


Si cambiamos la definición, y corremos las migraciones, ya podemos crear Sections sin un antecesor.

parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True)

jueves, 29 de septiembre de 2022

¿Hasta cuando se van a permitir estas estafas?

 Está claro que los grandes (Facebook, Twitter, Google,...) viven de la publicidad. Está claro que su único interés es generar impresiones y cobrarlas, pero cuando los anuncios que publican son estafas, tienen una responsabilidad.

Algunas plataformas empiezan a cuidar este tema y retiran anuncios de estafas, pero otras no son tan escrupulosas.

¿Hasta cuando se va a permitir esto? Muestrario de anuncios de Facebook:




















Famosos participando en productos financieros de alto riesgo...

https://cincodias.elpais.com/cincodias/2021/11/28/mercados/1638112255_177308.html




Lo más triste del asunto es que si estos anuncios se publican es porque hay un "target" potencial, gente hastiada de trabajar, criptolais, tontokens, ninis variados... la pena es cuando engañan a gente que simplemente quería rentabilizar sus ahorrillos.