Tips para programadores

No todo es programación. Un programador sin conocimientos de sistemas, sin conocimientos globales, queda relegado muchas veces. Es duro y difícil ser un Full Stack Developer.

PHP

PHP

Composer Fatal error: Allowed memory size of XXXXX

En servidores cPanel con CloudLinux puede haber problemas para usar uno de los sistemas recomendados por Composer puede no funcionarnos y comeinza la frustación.

Ejecución normal

$  composer update
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 528384 bytes) in phar:///usr/local/bin/composer1/src/Composer/DependencyResolver/Pool.php on line 230

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.Fri May  7 12:24:49 CEST 2021

Ejecución con variable de entorno

$ COMPOSER_MEMORY_LIMIT=-1 composer <arguments>

Ejecución con argumentos

En algunos escenarios puede fallarnos, por ejemplo cuando tenemos dos instancias de composer (composer v1 y composer v2) y además el sistema tiene Cloudlinux. Podemos usar la siguiente alternativa

$ php -d memory_limit=-1 composer <arguments>

Información original

Como en todo la documentación original es importante conocerla.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como esta, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

PHP

Cambiar la versión PHP para el shell (composer)

Introducción

Cuando un sistema linux tiene múltiples versiones de PHP (cPanel, Directadmin, sistema sin panel de control, etc) uno de los problemas habituales es como usar una versión php en la shell diferente de la que está por defecto en el sistema. Bien, puedes especificar una versión por usuario e incluso puedes hacer que el usuario use distintas versiones PHP en el mismo usuario para distintos proyectos y sin Docker, como al trabvajar con Laravel, Symfony y otros.

Archivo de configuración de mi shell

El ejemplo en este caso es para bash, pero poco difiere de otros shell (yo en lo particular uso zsh) ya que todos tienen en común un fichero de configuración que se carga cuando iniciamos sesión o cuando tras modificarlo, ejecutamos un comando para que vuelva a leer ese fichero.

Cambiar la versión PHP de tu usuario de shell en bash

Iniciar sesión con tu usuario. Asegurarnos de que estamos en el inicio de sesión

$ cd ~

Obtener el path de las versiones instaladas

# ls -lisah /usr/local/bin/php
19270949 0 lrwxrwxrwx 1 root root 26 Jun  8 08:39 /usr/local/bin/php -> /usr/local/php56/bin/php56
# ls -lisah /usr/local
ls /usr/local/
...  php71  php73  php80 ... php56   php72  php74

Agregar la línea para usar la versión requerida

# .bashrc o .bash_profile Véase su distribución
# .zshrc
export PATH=/usr/local/php80/bin:$PATH

Cpanel (v98+)

En cpanel las instalaciones de php estan en el directorio /opt/cpanel/ con la nomemclatura ea-phpXX para indicar la version por lo que el path a añadir sería export PATH=/opt/cpanel/ea-php80/root/bin/:$PATH por ejemplo

Salvar y hacer un reload de tu perfil

# bash
$ . ~/.bash_profile
# zsh
$ source ~/.zshrc

Comprobar la versión PHP de nuestro shell

php -v
PHP 8.0.5 (cli) (built: May  3 2021 11:30:57) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.5, Copyright (c) Zend Technologies
 with Zend OPcache v8.0.5, Copyright (c), by Zend Technologies

Usar alias para distintos proyectos con el mismo usuarios

En mi caso como dije uso zsh y tengo múltiples proyectos. No me gusta marearme con docker salvo para cosas específicas asi que prefiero tener unos alias en mi fichero ~/.zshrc

alias p74='/usr/bin/php7.4 '
alias a74='/usr/bin/php7.4 artisan '
alias c74='/usr/bin/php7.4 /usr/local/bin/composer '

Ejemplo usar versión especifica de PHP en el shell de una cuenta cpanel

Editar el fochero .bashrc del usuario

...
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
...
alias php=/opt/cpanel/ea-php80/root/usr/bin/php
alias composer='/opt/cpanel/ea-php80/root/usr/bin/php /opt/cpanel/composer/bin/composer'
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

PHP

Testing con operaciones de número flotante: eventos astronómicos

Introducción

En computación, los cálculos numéricos, especialmente los que implican flotantes, pueden ser propensos a pequeñas imprecisiones. Esto se debe a la forma en que las computadoras manejan la aritmética de punto flotante. Las imprecisiones pueden acumularse en cálculos complejos, lo que puede llevar a resultados ligeramente fuera de lo esperado.

En el caso de una aplicación que estaba haciendo de repente unos test me comenzaron a fallar justo cuando habia realizado unos cambios. Pero menos mal que me fije en los datos del fallo del test.

Era un simple segundo en la aserción de un datao astronomico calculado con el método de PHP date_sun_info

   FAILED  Tests\Unit\Observers\CommandCenterObserverTest > create command center fire observer and save astro sun info                                      
  Failed asserting that a row in the table [command_centers] matches the attributes {
    "sunrise": "2022-11-30 07:14:32",
    "sunset": "2022-11-30 16:46:11"
}.

Found similar results: [
    {
        "sunrise": "2022-11-30 07:14:32",
        "sunset": "2022-11-30 16:46:10"  << Fallo de un segundo
    }
].

Solución

En este tipo de casos en el que trabajamos con cuestiones que no requieren una exactitud matemática al más puro estilo de C++, podemos modificar nuestro test.

Parte del test original

$this->assertDatabaseHas('command_centers', [
    'sunrise' => '2022-11-30 07:14:32',
    'sunset' => '2022-11-30 16:46:11',
]);

Parte modificada del test

$expectedSunrise = Carbon::createFromFormat('Y-m-d H:i:s', '2022-11-30 07:14:32');
$actualSunrise = Carbon::createFromFormat('Y-m-d H:i:s', $commandCenter->sunrise->format('Y-m-d H:i:s'));

$this->assertLessThanOrEqual(
    1, // seconds of allowable difference
    $expectedSunrise->diffInSeconds($actualSunrise),
    'Sunrise time difference is more than 1 second'
);

$expectedSunset = Carbon::createFromFormat('Y-m-d H:i:s', '2022-11-30 16:46:11');
$actualSunset = Carbon::createFromFormat('Y-m-d H:i:s', $commandCenter->sunset->format('Y-m-d H:i:s'));

$this->assertLessThanOrEqual(
    1, // seconds of allowable difference
    $expectedSunset->diffInSeconds($actualSunset),
    'Sunset time difference is more than 1 second'
);
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Laravel, ese framework que nos tiene enamorado.

Laravel

Specified key was too long

Escenario

Despliegue de una app de laravel en un servidor. Ejecutamos el primer migrate y zas.

php artisan migrate
...
 Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
...

No nos asustemos; el tema está en una diferencia de versión MySQL

ATENCIÓN a programadores cada vez las diferencias entre versiones de un mismo motor son fuertes (MySQL 5.X vs MySQL 8, por ejemplo), MySQL vs MariaDB vs Percona. Algunas pueden producir serios problemas en caso de tener que recuperar un backup de otro motor o versión, o una configuración.

Posibles soluciones

Actualización del motor de Base de Datos

Si es posible lo adecuado, es que uses el mismo motor tanto en desarrollo, testing y producción. Y la misma configuración.

Tener apps profesionales, en un entorno compartido, es como ser un feriante (con respeto a su profesión). Sufriras, tu tienda o negocio no tendrá el aspecto que tendrías en un servidor dedicado o VPS, optimizado para tu negocio

Modificación del engine en tu app

Si te es imposible o no quieres actualizar tu monotr de bases de datos, intenta modificar el engine de mysql en el archivo config/database.php

'mysql' => [
   'driver' => 'mysql',
   ...
   'engine' => 'InnoDB,
   ...
],

Modificación del AppServiceProvider

Si no te funciona la anterior, puede agregar una linea en tu fichero app/Providers/AppServiceProvider.php

...
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
...

   public function boot()
   {
      Schema::defaultStringLength(191);
   }

Explicación

La naturaleza del problema es debido a que por defecto Laravel usa como codificación utf8mb4, con soporte para los emojis.

Enlaces y cosas sobre el tema

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Consejos y trucos de Laravel. Sólo enlaces

Laravel

Muchas partes del ecosistema Laravel no se ven a simple vista en su documentación, y otras tantas sus avances son tan rápidos que uno no tiene tiempo de asimilar todo o conocer todo.

Asi que dejo aqui enlaces que me parecen muy interesantes

Enlace Keys
30 Laravel Eloquent Tips & Tricks eloquent, attributes, push()
Laravel Lang Publisher laravel, lang, publisher
Laravel

Cómo recuperar registros entre dos marcas de tiempo en Laravel con Eloquent

Tip

Use whereBetweeen con una fecha desde y hasta. Si necesita proporcionar un respaldo, puede hacerlo con el operador coalescente nulo ??

$invoice = Invoice::whereBetween(‘inoviced_at’, [
   $request->since ?? ‘2020-01-01’,
   $request->until ?? today()->toDateTimestring()	
]
Agradecimientos

Gracias a LaravelEloquent

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Crear nuevo índice compuesto único, en una tabla con duplicados MySQL y Laravel Eloquent

Introducción

Una de las cosas que mas enamorado me tiene, son las migraciones de Laravel ya que te permite trabajar con software en producción, siendo un poco cuidadoso, por supuesto.

En el caso de este artículo, se trataba de añadir un índice compuesto, sobre una o varias tablas, que contenían cientos de miles de filas, y que por necesidad y eficacia, deberían haber tenido este índice compuesto único.

Que decir tiene, que la razón del mismo era, que al no tenerlo se habían producido duplicados no deseados, que fueron detectados en un bug abierto.

Procedimiento

Migración fallida

En el escenario normal escribimos una migración para añadir un índice compuesto en nuestra app Laravel

$ php artisan make:migration add_index_modem_plus_job_modems_table --table="logger_modems"

Donde escribiremos el índice compuesto que queremos añadir.

Schema::table('logger_modems', function (Blueprint $table) {
   $table->unique(['command_center_id', 'job']);
});

Pero al ejecutarlo ya sabemos lo que ocurrirá.

Migrating: 2022_04_23_124738_add_index_modem_plus_job_modems_table

   Illuminate\Database\QueryException 

  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '8-2022-04-21 02:00:01' for key 'logger_modems.logger_modems_command_center_id_job_unique' (SQL: alter table `logger_modems` add unique `logger_modems_command_center_id_job_unique`(`command_center_id`, `job`))

Comprobación del problema

En Mysql (shell) o en nuestra app preferida (MySQLWorkbench, TablePlus,...) compobamos el problema

SELECT command_center_id, COUNT(command_center_id) job, COUNT(job) 
FROM sitelight.logger_analyzers
GROUP BY command_center_id, job HAVING COUNT(*) > 1;

MysqlWorkbench - Duplicados

Modificación de la migración

La secuencia en formato SQL sería la de abajo, pero hemos dicho que queremos trabajar con eloquent, por muchos motivos.

CREATE TABLE tmp_data SELECT * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECT * from tmp_data;
DROP TABLE tmp_data;

Así que aquí abajo lo adaptamos

public function up()
{
  DB::statement('CREATE TABLE sitelight.tmp_data SELECT * FROM sitelight.logger_modems');
  LoggerModem::query()->delete(); // TRUNCATE via eloquent
  Schema::table('logger_modems', function (Blueprint $table) {
      $table->unique(['command_center_id', 'job']);
  });
  DB::statement('INSERT IGNORE INTO sitelight.logger_modems SELECT * FROM sitelight.tmp_data');
  DB::statement('DROP TABLE sitelight.tmp_data');
}

Agradecimientos

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Comprobar la configuración de correo en Laravel

Configuración del correo en Laravel

A veces, algo falla, y es necesario probar que el problema no esta en la configuración del correo en nuestra aplicación Laravel.

Un metodo sencillo y eficaz es probarlo en el tinker

❯ php artisan tinker
Psy Shell v0.12.3 (PHP 8.3.6 — cli) by Justin Hileman
> Mail::raw('Hello World!', function($msg) {$msg->to('emails@mail.com')->subject('Test Email'); });
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Test de excepciones en Laravel con PestPHP

Introducción

El cambio de PHPUnit a PestPHP es algo progresivo.

Muchas veces se nos pasa que hay otros caminos de hacer las cosas. Este es uno de ellos, los test de excepciones

Test de Excepción :: PHPUnit vs PestPHP

Con Pest es mas limpio hacer:

expect(fn () => CommandCenterProblem::factory()->create([
        'command_center_id' => $commandCenter->id,
        'trigger_id' => $trigger->id,
        'created_at' => $now,
    ]))->toThrow(UniqueConstraintViolationException::class);

aunque también podemos hacerlo a la vieja usanza.

$this->expectException(UniqueConstraintViolationException::class);
    
    CommandCenterProblem::factory()->create([
        'command_center_id' => $commandCenter->id,
        'trigger_id' => $trigger->id,
        'created_at' => $now,
    ]);  

Como siempre, en programación hay más de un camino, perfectamente validos. Son gustos o preferencias personales.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

MySQL

Mysql ese motor tan amplio

MySQL

Obtener el MAX y el MIN en un objeto json dentro de una columna json

Información previa

A veces tenemos que obtener información contenida en columnas tipo json, existentes en nuestra base de datos.

Aquí vamos a ver cómo podemos hacerlo.

En el momento de escribir este artículo no encontré forma de hacerlo en Laravel 9. Si te animas hay un post en Laracast - Is there a way to get the max of a JSON array in MYSQL (no hace falta ser usuario de pago)

Escenario

Tabla con una columna tipo json llamada data. Su contenido tipo es el de abajo, y buscamos el MIN y el MAX del valor response_time

En este escenario el valor está normalizado number

{
	"data": {
		"csq": -62,
		"icc": "8944501801213377498",
		"imei": "869640059692007",
		"device": "modem",
		"sunset": 1652071940,
		"sunrise": 1652124780,
		"datetime": 1652082623,
		"response_time": 11.29
	},
	"message": "successful",
	"success": true
}

Sql

mysql> SELECT MAX(JSON_EXTRACT(data, "$.data.response_time")) as response  FROM table;
+----------+
| response |
+----------+
| 55.88    |
+----------+
1 row in set (0,03 sec)

mysql> SELECT MIN(JSON_EXTRACT(data, "$.data.response_time")) as response  FROM table;
+----------+
| response |
+----------+
| 6.15     |
+----------+
1 row in set (0,04 sec)

Bonus

Es posible, sobre todo si trabajamos en un proyecto no depurado todavia en el que guardamos datos a los bruto, sin normalización o verificación, que nos salgan valores anormales.

Entonces es bueno obtener los datos de un número limitado de la respuesta ordenados para ver si es algo que falla.

SELECT id, JSON_EXTRACT(data, "$.data.response_time") as response  FROM tabla ORDER BY JSON_EXTRACT(data, "$.data.response_time") DESC LIMIT 20;
+--------+----------+
| id     | response |
+--------+----------+
| 224623 | 600.47   |
| 200807 | 598.7    |
| 177004 | 598.54   |
| 177006 | 598.29   |
| 177005 | 598.29   |
| 177008 | 597.68   |
| 153187 | 596.45   |
| 153189 | 596.33   |
| 129369 | 595.87   |
| 129368 | 595.85   |
| 129371 | 595.33   |
|  10806 | 588.38   |
|  10807 | 588.35   |
|  10809 | 588.19   |
| 273886 | 25.08    |
|  24709 | 22.62    |
| 265865 | 22.32    |
|  92768 | 20.92    |
| 275543 | 20.91    |
| 122073 | 20.15    |
+--------+----------+
20 rows in set (1,30 sec)

Evidentemente aquí hay una desviación bastante clara que debemos limpiar o revisar.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como esta, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

MySQL

DBeaver (java - mysql) Public Key Retrieval is not allowed

Introducción

DBeaver es una app para manejo remoto de bases de datos de distinto motores, basada en Java.

Dbeaver

Sin embargo a veces aparacen errores un tanto extraños para quienes no estamos acostumbrados a Java, como puede ser, Public Key Retrieval is not allowed al tratar de configurar un tunle de accesso SSH a una máquina remota.

Solución

En el post Connection Java - MySQL : Public Key Retrieval is not allowed hay una respuesta válida escrita por Javier Aviles

  1. Editar conexión
  2. Driver Propierties
  3. Añadir en user propierties dos nuevas propiedades: useSSL con valor false y allowPublicKeyRetrieval con valor true

Ventana de ajustes de conexión

Esto puede diferrir entre versiones.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

MySQL

Mysql no reduce espacio consumido tras un delete en tablas InnoDb

Introducción

Muchas veces los administradores de sistemas, o los clientes de estos, no son conscientes que no es lo mismo jugar o trabajar con bases de datos de tamaño medio, y otra muy distinta es enfrentarse a databases de 40GB o más.

En estos entornos, mysqldump no es una opción viable, y se hace necesario el uso de una estructura maestro-esclavo como mínimo, para hacer los backups en el esclavo, en lugar de en el maestro, con sus correspondientes problemas además de ser un medio eficaz, por si algo ocurre.

Muchos Sysadmin jamás se han enfrentado a una restore de un servidor mysql de más de 50GB y los que lo han hecho saben la de cositas que pueden salir por ahí.

Recuperación de espacio

Bien, muchas veces en algunos escenarios hay que vaciar tablas pesadas, ya sea por fechas o contenidos, pero tras el vaciado este no suele ocurrir una reducción del espacio en el servidor.

En este documento hablo de mi experiencia con Mysql 8 en una base de datos con InnoDb, y además con el valor innodb_file_per_tableactivado. Esto es importante, pues de lo contrario el ataque debe ser realizado con otra óptica.

mysql> show variables like "innodb_file_per_table";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

Liberar espacio

Por ejemplo queremo liberar datos en una tabla entre dos fechas.

> mysql 
mysql> use mi_database;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> DELETE FROM logger_xxxxx WHERE created_at BETWEEN '2023-01-01 00:00:00'  AND '2023-04-30 23:59:59';
Query OK, 1849983 rows affected (5 min 55,64 sec)
mysql> ALTER TABLE logger_xxxxx ENGINE=InnoDB;
Query OK, 0 rows affected (6 min 3,97 sec)
Records: 0  Duplicates: 0  Warnings: 0

Evidentemente la tabla ya estaba en formato InnoDb, pero el comando en sí mismo realizado, una optimización, como la que haríamos con mysqlcheck --auto-repair --optimize database sólo que con ese comando las tablas InnoDb no se optimizarán.

Agradecimientos

En particular mysqldump.guru donde encontrarás maravillosos snipets para usar con mysql.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

MySQL

Mysql conexión vía socket. Como saber donde está

Introducción

Soy amigo de usar los sockets para casi todo lo que puedo por eficacia. Asi que una que suele ocurrirme, es cuando entro a una máquina nueva que no se donde esta.

Revisar el Archivo de Configuración de MySQL

El archivo de configuración de MySQL generalmente se encuentra en /etc/my.cnf o /etc/mysql/my.cnf. Puedes buscar la línea que define la ubicación del socket.

grep -i 'socket' /etc/my.cnf /etc/mysql/my.cnf

socket = /var/run/mysqld/mysqld.sock

A veces no te da nada o te da error porque no encuentra alguno de los ficheros.

Usar el Cliente MySQL

Puedes conectarte al servidor MySQL y ejecutar un comando SQL para obtener la información del socket

mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"

+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| socket        | /var/run/mysqld/mysqld.sock |
+---------------+-----------------------------+

Revisar el Estado del Servicio MySQL

No suele decir mucho proque depende de como esta configurado el servicio en systemctl

grep -i 'socket' /var/log/mysql/*.log /var/log/mysqld.log

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-07-07 15:39:12 UTC; 4 weeks 2 days ago
       Docs: man:mysqld(8)
             http://dev.mysql.com/doc/refman/en/using-systemd.html
   Main PID: 992459 (mysqld)
     Status: "Server is operational"
      Tasks: 66 (limit: 48144)
     Memory: 7.8G
     CGroup: /system.slice/mysql.service
             └─992459 /usr/sbin/mysqld

Warning: journal has been rotated since unit was started, output may be incomplete.

lsof

❯  lsof -U | grep mysql
mysqld     992459            mysql    1u  unix 0xffff9411ca168000      0t0  96369986 type=STREAM
mysqld     992459            mysql    2u  unix 0xffff9411ca168000      0t0  96369986 type=STREAM
mysqld     992459            mysql    3u  unix 0xffff9411ca16b740      0t0  96369989 type=DGRAM
mysqld     992459            mysql   21u  unix 0xffff941565e79540      0t0  96373782 /var/run/mysqld/mysqlx.sock type=STREAM
mysqld     992459            mysql   25u  unix 0xffff941565e7ee80      0t0  96373785 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  235u  unix 0xffff941730f6c840      0t0 272319038 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  242u  unix 0xffff94194a1d1980      0t0 272319039 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  243u  unix 0xffff941646f8aec0      0t0 272319040 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  521u  unix 0xffff94173c81ea40      0t0 272290305 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  524u  unix 0xffff94190a088440      0t0 272290325 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  525u  unix 0xffff941837156a40      0t0 272290403 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  528u  unix 0xffff9417321b2200      0t0 272289661 /var/run/mysqld/mysqld.sock type=STREAM
mysqld     992459            mysql  529u  unix 0xffff9417321b3b80      0t0 272289664 /var/run/mysqld/mysqld.sock type=STREAM
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Flutter

Flutter es un entorno de producción de apps para Android, IOs, Web, o destktop que permite crear desarrolos en un entorno único. Basado en el lenguaje Dart, es uno de los entornos de programación que esta pisando fuerte.

Flutter

Instalación de Android Studio para Flutter en Ubuntu

Flutter

La mejor descripción de Flutter es la que le dan: Construye aplicaciones para cualquier monitor Efectivamente, multiplataforma, para moviles (Android e IOs), para Web, para Linux, para Windows, para embebidos.

Basado en el lenguaje de programación Dart que es un lengaje compilado, nos permite crear aplicaciones para multiples dispositivos, en un gran entonro de desarrollo.

Vamos a instalar Flutter en nuestra Ubuntu 22.04 con SNAP

Te recomiendo un repaso por Flutter :: Linux Install, auqne aquí tenrdas tips que no aparecen, y te facilitara verlos.

> sudo snap install flutter --classic

Después la primera vez tendremos que ejecutar el instalador en el path de usuario indicandonos en la última linea el path.

> flutter sdk-path
Initializing Flutter
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  158k  100  158k    0     0   300k      0 --:--:-- --:--:-- --:--:--  300k
Downloading https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.0.0-stable.tar.xz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  596M  100  596M    0     0  18.8M      0  0:00:31  0:00:31 --:--:-- 25.4M
Flutter initialized
Flutter 3.0.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ee4e09cce0 (hace 9 días) • 2022-05-09 16:45:18 -0700
Engine • revision d1b9a6938a
Tools • Dart 2.17.0 • DevTools 2.12.2
/home/abkrim/snap/flutter/common/flutter

Android Studio Spalsh Screen

Podemos ejecutar el doctor para comprobar que esta todo bien.

❯ flutter doctor
Running "flutter pub get" in flutter_tools...                       8,3s
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.0, on Ubuntu 22.04 LTS 5.15.0-30-generic, locale es_ES.UTF-8)
[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[!] Android Studio (not installed)
[✓] IntelliJ IDEA Community Edition (version 2022.1)
[✓] VS Code (version 1.67.1)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

! Doctor found issues in 2 categories.

En mi caso, no tengo instalado el Android Studio que si requiero para ver y conocer con las demos, como es el entorno de trabajo.

Instalar el SDK

Instalar Android Studio

Bibliotecas necesarias 32 bits

> sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
> sudo /usr/local/android-studio/bin/studio.sh

En mi caso en cuanto quedo instalado añadí un alias a mi zshrc para no tener que escribir el path. Antención tambien que ese es el path tras la instalación con snap. Otras formas pueden variar.

Tras instalarlo ejecutamos de nuevo flutter doctor

❯ flutter doctor
…
[!] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
   ✗ cmdline-tools component is missing
     Run `path/to/sdkmanager --install "cmdline-tools;latest"`
     See https://developer.android.com/studio/command-line for more details.
   ✗ Android license status unknown.
     Run `flutter doctor --android-licenses` to accept the SDK licenses.
     See https://flutter.dev/docs/get-started/install/linux#android-setup for …
! Doctor found issues in 1 category.

Flutter doctor

Instalar las cmdline-tools desde el Android Studio es la mejor opcion, proque el mensaje es la pescadilla que se muerde la cola, no existe el sdkmanager.

Android Studio :: Splash Screen

Accediendo a More Actions > SDK Manager podremos instalar las Command-line Tools y otras cosas si queremos.

Androi Studio :: System Settings :: Android SDK

Al final volvemos a ejecuatr, corregimos el tema de las licencias y deberemos obtener.

❯ flutter doctor

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.0, on Ubuntu 22.04 LTS 5.15.0-30-generic, locale es_ES.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 2021.2)
[✓] IntelliJ IDEA Community Edition (version 2022.1)
[✓] VS Code (version 1.67.1)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

• No issues found!

Flutter doctor OK

Preparación para el desarrollo

En mi caso prefiero de momento la emulación de Andorid, que usar un dispositivo en modo debug. Ya tendré tiempo más adelante.

Para ello hay que preparar el Android Emulator en la máquina de desarrollo.

Debemos tener en cuenta de que cada dispositivo cuenta con su imagen segun la version de Android, y esto es importante a efectos de compatibilidad de nuestro futuro trabajo.

Crear un dispositivo virtual de Android (AVD)

Como crear y administrar dispositivos virtuales

En primer lugar tendremos que escojer el tipo de dispositivo que queremos crear, y descargar la imagen de su emulador.

Las instrucciones son mas que suficientes para hacer los dispositivos minimos que queramos.

Librerias aconsejadas en linux

sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev

Android Setup para Flutter

Agradecimientos

I am getting error "cmdline-tools component is missing" after installing Flutter and Android Studio... I added the Android SDK. How can I solve them?

Flutter

La mejor descripción de Flutter es la que le dan: Construye aplicaciones para cualquier monitor Efectivamente, multiplataforma, para moviles (Android e IOs), para Web, para Linux, para Windows, para embebidos.

Basado en el lenguaje de programación Dart que es un lengaje compilado, nos permite crear aplicaciones para multiples dispositivos, en un gran entonro de desarrollo.

Vamos a instalar Flutter en nuestra Ubuntu 22.04 con SNAP

Te recomiendo un repaso por Flutter :: Linux Install, auqne aquí tenrdas tips que no aparecen, y te facilitara verlos.

> sudo snap install flutter --classic

Después la primera vez tendremos que ejecutar el instalador en el path de usuario indicandonos en la última linea el path.

> flutter sdk-path
Initializing Flutter
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  158k  100  158k    0     0   300k      0 --:--:-- --:--:-- --:--:--  300k
Downloading https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.0.0-stable.tar.xz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  596M  100  596M    0     0  18.8M      0  0:00:31  0:00:31 --:--:-- 25.4M
Flutter initialized
Flutter 3.0.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ee4e09cce0 (hace 9 días) • 2022-05-09 16:45:18 -0700
Engine • revision d1b9a6938a
Tools • Dart 2.17.0 • DevTools 2.12.2
/home/abkrim/snap/flutter/common/flutter

Android Studio Spalsh Screen

Podemos ejecutar el doctor para comprobar que esta todo bien.

❯ flutter doctor
Running "flutter pub get" in flutter_tools...                       8,3s
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.0, on Ubuntu 22.04 LTS 5.15.0-30-generic, locale es_ES.UTF-8)
[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[!] Android Studio (not installed)
[✓] IntelliJ IDEA Community Edition (version 2022.1)
[✓] VS Code (version 1.67.1)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

! Doctor found issues in 2 categories.

En mi caso, no tengo instalado el Android Studio que si requiero para ver y conocer con las demos, como es el entorno de trabajo.

Instalar el SDK

Instalar Android Studio

Bibliotecas necesarias 32 bits

> sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
> sudo /usr/local/android-studio/bin/studio.sh

En mi caso en cuanto quedo instalado añadí un alias a mi zshrc para no tener que escribir el path. Antención tambien que ese es el path tras la instalación con snap. Otras formas pueden variar.

Tras instalarlo ejecutamos de nuevo flutter doctor

❯ flutter doctor
…
[!] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
   ✗ cmdline-tools component is missing
     Run `path/to/sdkmanager --install "cmdline-tools;latest"`
     See https://developer.android.com/studio/command-line for more details.
   ✗ Android license status unknown.
     Run `flutter doctor --android-licenses` to accept the SDK licenses.
     See https://flutter.dev/docs/get-started/install/linux#android-setup for …
! Doctor found issues in 1 category.

Flutter doctor

Instalar las cmdline-tools desde el Android Studio es la mejor opcion, proque el mensaje es la pescadilla que se muerde la cola, no existe el sdkmanager.

Android Studio :: Splash Screen

Accediendo a More Actions > SDK Manager podremos instalar las Command-line Tools y otras cosas si queremos.

Androi Studio :: System Settings :: Android SDK

Al final volvemos a ejecuatr, corregimos el tema de las licencias y deberemos obtener.

❯ flutter doctor

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.0, on Ubuntu 22.04 LTS 5.15.0-30-generic, locale es_ES.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 2021.2)
[✓] IntelliJ IDEA Community Edition (version 2022.1)
[✓] VS Code (version 1.67.1)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

• No issues found!

Flutter doctor OK

Preparación para el desarrollo

En mi caso prefiero de momento la emulación de Andorid, que usar un dispositivo en modo debug. Ya tendré tiempo más adelante.

Para ello hay que preparar el Android Emulator en la máquina de desarrollo.

Debemos tener en cuenta de que cada dispositivo cuenta con su imagen segun la version de Android, y esto es importante a efectos de compatibilidad de nuestro futuro trabajo.

Crear un dispositivo virtual de Android (AVD)

Como crear y administrar dispositivos virtuales

En primer lugar tendremos que escojer el tipo de dispositivo que queremos crear, y descargar la imagen de su emulador.

Las instrucciones son mas que suficientes para hacer los dispositivos minimos que queramos.

Librerias aconsejadas en linux

sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev

Agradecimientos

I am getting error "cmdline-tools component is missing" after installing Flutter and Android Studio... I added the Android SDK. How can I solve them?

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como esta, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.