Cuando usemos la función is_a en PHP debemos usar el identificador completo de la clase:
use App\Models\ItemActiveErrorMessage;
// Esto no funcionará
is_a('ItemActiveErrorMessage');
// En cambio esto sí
is_a('App\Models\ItemActiveErrorMessage');
Cosas de programación para recordar y de todo un poco
Cuando usemos la función is_a en PHP debemos usar el identificador completo de la clase:
use App\Models\ItemActiveErrorMessage;
// Esto no funcionará
is_a('ItemActiveErrorMessage');
// En cambio esto sí
is_a('App\Models\ItemActiveErrorMessage');
Si en el dominio en el que queremos integrar Redsys usamos Cloudfare las notificaciones (webhooks) que nos quiera enviar Redsys no nos llegarán porque Cloudfare las bloquea al considerar que no las está realizando un navegador al uso. Bien por Cloudfare, que para mucha morralla antes de que llegue a nuestro servidor, pero mal por el Koas que se tira un día y pico sin comprender por qué el webhook funciona si se llama a mano y no cuando lo hace Redsys.
La solución es incluir una regla en el cortafuegos de Cloudfare para que las peticiones que lleguen desde Redsys a la dirección del webhook no realicen esa comprobación. La forma de hacerlo está perfectamente explicada en esta entrada del blog de Marc Pàmpols.
La integración de la pasarela de pago de Redsys en modo insite es bastante simple pero tiene algunos momentos wtf. Dejo aquí algunos apuntes para no volver a tropezar con ellos en el futuro:
Actualización: los dos últimos puntos no vienen indicados en la documentación de integración del Santander, pero sí vienen en la oficial de Redsys, así que lo mejor es usar esa.
Hay veces que en una aplicación de Vue tenemos una pantalla donde puede haber un número variable de componentes que el usuario puede configurar, por ejemplo en un dashboard o en una pantalla de definición de filtros.
En estos casos usar la sintaxis habitual para importar componentes se hace tedioso y es más sencillo utilizar el componente de Vue component y un sistema de carga dinámica. En esta página lo explican perfectamente.
TL,DR: en la parte de template definimos el componente:
component(:is="currentComponent")
Y definimos la propiedad computada así:
currentComponent() {let name = "Aquí establecemos el nombre del componente a cargar";
return () => import(`@/components/Ruta1/Ruta2/${name}`);
}
Después de releer el libro de Phil Sturgeon Build APIs you won’t hate dejo aquí estas notas a tener en cuenta para el diseño de APIs:
{ "data": […], "pagination" : { "total": 1000, "count": 12, "per_page": 12, "current_page": 1, "total_pages": 84, "next_url": "/places?page=2&number=12", } }
Es habitual tener un ordenador pequeño tipo Raspberry Pi o similar encendido continuamente como servidor de archivos, y seguramente tengamos corriendo en él mldonkey, que es un cliente tipo eMule de línea de comandos.
Si queremos que los enlaces ed2k de las páginas que visitemos se añadan como descargas podemos usar una extensión como esta, que envía los enlaces a nuestro servidor mldonkey.
Pero claro, lo más normal hoy día es que la página que visitemos esté bajo https, y nuestro servidor mldonkey esté bajo http, lo que hace que el navegador rechace abrir una URL no segura desde un sitio seguro.
Para solucionar este problema vamos a hacer otra cosa. Nos olvidaremos de la extensión del navegador y registraremos un manejador para el protocolo ed2k://. Este manejador abrirá los enlaces en una aplicación que vamos a crear que hará la conexión con el servidor mldonkey.
Dicho así parece mucho más complicado de lo que es, ya verás. Lo primero que haremos será crear un fichero ~/.local/share/applications/ed2k.desktop
con este contenido:
[Desktop Entry] Version=1.0 Type=Application Terminal=true Name=ED2K Link Handler Comment=Sends ed2k links to remote mldonkey server Exec=ed2kHandler %u MimeType=x-scheme-handler/ed2k
Las dos líneas más importantes son las dos últimas, donde indicamos el programa al que se enviarán los enlaces y el tipo mime que queremos registrar. ed2kHandler
es el nombre de nuestra pequeña aplicación y en el tipo mime la parte ed2k
del final es lo que indica que queremos asociarla a las URLs que usen el protocolo ed2k.
Una vez hecho esto ejecutamos estas dos líneas:
sudo update-desktop-database xdg-mime default ed2k.desktop x-scheme-handler/ed2k
y ya tendremos hecha la asociación del protocolo con nuestra aplicación. Ya solo nos faltaría crear la aplicación.
La aplicación la haremos con PHP, y para ello crearemos el fichero /usr/bin/ed2kHandler con este contenido (una vez creado hay que darle permisos de ejecución):
!/usr/bin/php <?php if (!isset($argv[1])) die("Usage: ed2kHandler elink\n"); $url = 'http://USER:PASS@192.168.0.4:4080/submit?q='; $url .= $argv[1]; $url = str_replace('ed2k://', 'ed2k%3A%2F%2F', $url); file_get_contents($url);
Hay ya miles de entradas sobre cómo cambiar la carpeta de datos de MySQL de /var/lib/mysql a cualquier otra, pero me costó encontrar la solución al problema “Error 13 – Permission denied” que me daba al intentar arrancar MySQL después de cambiarle la carpeta de datos.
El problema es que la nueva ruta estaba en /media/koas/Ext4Bucket, un segundo disco duro que tengo instalado. Para que funcione hay que darle a /media/koas permisos 777.
En este blog escribo básicamente para mí mismo, pero hay algunos temas sobre los que creo que puedo escribir artículos que realmente sean útiles para más personas. Esos artículos los escribiré (en inglés) en dev.to, que es un portal de contenido para desarrolladores.
Y aquí tenemos el primero, habla sobre cómo usar cabeceras HTTP para ayudarnos a depurar sitios web que están en producción.
Hace unos años en un viaje a Cangas de Onís para actuar con la Orquesta Vaya Panorama mi amigo Juan Prada me descubrió el género Italo Disco, que es básicamente música disco italiana de los ochenta que está muy bien para programar.
Fue una recomendación doble, porque Juan además de programador también es DJ, así que sabe mucho de los dos mundos. Podéis descargar las sesiones que hace para Frisky Radio (que también son ideales para programar) en su página web.
A veces GitHub no detecta correctamente el lenguaje principal de un repositorio. Por ejemplo, para Mi Segundo PC como tiene más ficheros con extensión php que js decía que el lenguaje era PHP en vez de JS.
Para solucionarlo creamos un fichero .gitattributes en el directorio raíz del repositorio con este contenido:
* linguist-vendored
*.js linguist-vendored=false
Esto le indica a GitHub que desactive la detección de lenguaje para todos los ficheros y la active para los .js, haciendo así que el lenguaje detectado sea JavaScript.