Element implicitly has an ‘any’ type because expression of type ‘string’ can’t be used to index type

Con el fabuloso c si creamos un diccionario para acceder a datos, (el clickbait sería: «Deja de usar Switch» 😂😂 pero no suelen mostrarlo con TS ¿Quizás porque el tipado no queda elegante?).

La solución para que deje de arrojarnos error sería:

/**
 * Element implicitly has an 'any' type because
 * expression of type 'string' can't be used to
 * index type 'InterfaceName'.
 */

const keyToShow: string = 'username';

interface User {
  username: string;
  email: string;
}

const user: User = {
  username: 'Kike Beltrán',
  email: 'hello@email.com',
};

console.log(user[keyToShow as keyof User]);

Podemos verlo funcionando (y trastear) en:


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Combinar ngModel dentro de un Reactive Form de Angular

Puede ser que en alguna ocasión queramos manejar un valor con ngModel pero no tenerlo en un Reactive Form por cualquier motivo pero, cuando lo añadimos se nos tiñe la consola de rojo, cosa que no nos gusta (y básicamente deja de funcionar nuestra app).

Entonces… ¿Cómo podemos utilizar un campo con ngModel dentro de un Reactive Form?
Fácil, al campo que tiene el ngModel le añadimos el atributo

[ngModelOptions]="{standalone: true}"

De tal forma que nos quedaría algo parecido a:

<form (ngSubmit)="submitForm()" [formGroup]="formExample">
  <div>
    <label for="name">Name: </label>
    <input formControlName="name" type="text" id="name" />
  </div>
  ...
  <div>
    <label for="is_company">Is Company: </label>
    <input
      type="checkbox"
      [(ngModel)]="isCompany"
      [ngModelOptions]="{ standalone: true }"
      id="is_company"
    />
  </div>
  <button type="submit">Crear cuenta</button>
</form>

Aquí lo podemos ver y trastear con él:


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Invalid response from http://ejemplo.es/.well-known/acme-challenge/FKX34DBW_R…..GSXyOPjfkdcE: 204

Si al intentar obtener un certificado ssl con letsencrypt y certbot obtenemos este error:

Certbot failed to authenticate some domains (authenticator: apache). The Certificate Authority reported these problems:
Domain: nuestrodominio.es
Type: unauthorized
Detail: 2001:8d8:100f:f000::2fc: Invalid response from http://nuestrodominio.es/.well-known/acme-challenge/FKX34DBW_R…..GSXyOPjfkdcE: 204

Hint: The Certificate Authority failed to verify the temporary Apache configuration changes made by Certbot. Ensure that the listed domains point to this Apache server and that it is accessible from the internet.

Tenemos que seguir los siguientes pasos.

Primero: Comprobar que el dominio está funcionando, entramos en nuestrodominio.es y lo comprobamos visualmente.
Segundo: Podemos entrar en https://dnschecker.org y escribir nuestro domino para ver si a nivel mundial está bien propagada nuestra IP.
Tercero: Fijarnos bien en la IPv6… en este caso es el error que no es está dando, y ya que ahora mismo no estamos utilizando la IPv6, las borraremos de nuestro proveedor DNS.

Hecho esto, volvemos a intentar instalar el certificado, en mi caso:

sudo certbot --apache -d nuestrodominio.es

¡Y a funcionar!


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Quitar el borde inferior de ion-item

Por defecto, en una Ionic añade un borde inferior a cada , tal que:

Podemos quitarlas de toda la lista con el atributo lines=»none».

Poniéndolo el elemento quitaremos todos los bordes.

<ion-list lines="none">
    <ion-item>
        <ion-label>Pokémon Yellow</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>Mega Man X</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>The Legend of Zelda</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>Pac-Man</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>Super Mario World</ion-label>
    </ion-item>
</ion-list>

Ejemplo:

Si queremos quitar de cierto elemento:

<ion-list>
    <ion-item>
        <ion-label>Pokémon Yellow</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>Mega Man X</ion-label>
    </ion-item>
    <ion-item lines="none">
        <ion-label>The Legend of Zelda</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>Pac-Man</ion-label>
    </ion-item>
    <ion-item>
        <ion-label>Super Mario World</ion-label>
    </ion-item>
</ion-list>

Ejemplo:

Si queremos hacerlo con CSS, tendremos que sobreescribir la propiedad custom de la propiedad ion-item: –border-style

ion-item{
    --border-style: none;
}

Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Modificar o quitar el padding de ion-item

Si queremos quitarle los paddings a un puede que hayamos intentado hacer con la propiedad CSS padding y nos habremos dado cuenta que no funciona.

Ionic tiene sus propias propiedades para (en este caso) manejar el padding de este elemento, son:

--padding-bottom
--padding-end
--padding-start
--padding-top

Para ello, setear nuevas propiedades lo haremos sobreescribiendo estas propiedades, por ejemplo:

ion-item{
    --padding-start: 0;
    --padding-end: 0;
}

Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Obtener una página concreta paginando con Laravel

Otra de paginaciones con Laravel 💃

Por defecto, Laravel ya tiene el sistema de paginación integrado y solo con pasarle el query param «page» ya el framework reconoce que queremos paginar (Siempre y cuando tengamos en el controlador el método «paginate»).

/posts?page=2
/posts?page=3

PERO… podemos tener el caso que no queramos utilizar el parámetro por defecto, o estemos haciendo alguna tramoya. En mi caso es reconstruir el caché cuando se modifica el resultado. Claro, en esto caso no hay implicación del objeto Request, por lo tanto no nos va a paginar nada.

El método de paginación de Laravel es el siguiente:

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

Visto esto, creo que ya entendemos lo que hay que hacer. Cuando llamemos a nuestro modelo para obtener la paginación:

Post::paginate(10);

Lo haríamos de la siguiente manera, suponiendo que el número de página lo tenemos en la variable $numeroDePagina:

$numeroDePagina = 5;
Post::paginate( 10,  ['*'], 'page', $numeroDePagina);

PD: Lo que más me ha costado de este artículo es el título:

  • Sobrescribir el $request->page de Laravel.
  • Obtener una página concreta con la paginación de Laravel.
  • Paginar con Laravel a través de parámetros en la ruta.

¿Cual os gusta más? ¿Sugerencias?


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Renombrar el parámetro por defecto de la paginación de Laravel

Como ya sabemos, por defecto tenemos que pasarle el query param «page» a Laravel para paginar:

/articulo?page=2
/articulo?page=3

Pero… ¿Cómo cambiamos el parámetro «page»?

Fácil, el método de paginación de Laravel es el siguiente:

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

Si nos fijamos en el parámetro $pageName seguramente ya nos de una pista. Parándole como parámetro al método paginate con el nombre nuevo ya lo tendríamos. En el caso que lo queramos llamar «pagina» para tener algo así:

/articulo?pagina=2
/articulo?pagina=3

Pasamos como tercer parámetro el nombre que queramos y a funcionar!

Article::paginate( $per_page,  ['*'], 'pagina' );

Saludos!


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Unir archivo . dashAudio y . dashVideo

Si nos hemos descargado a través de jDownloader, de youtube-dl, etc… estos dos tipos de archivos (o los tenemos por otra razón) y no podemos unirlos, tranquilos.

Tenemos la solución…

Para la solución que propongo necesitaremos instalar brew en nuestro Macos.

Y necesitamos tener instalado ffmpeg.
Para instalar ffmpeg:

brew install ffmpeg

Ok.

Para unir el archivo de audio y de video en uno mismo, en un mp4 por ejemplo ejecutaremos el siguiente comando:

ffmpeg -y -i  -i  -c copy -map 0:v:0 -map 1:a:0 

Pongamos que tengo los siguientes archivos:

  • ejemploAudio.dashAudio
  • ejemploDeVideo.dashVideo

Y queremos que nuestro video se llame «videoUnido.mp4».

El comando sería:

ffmpeg -y -i ejemploDeVideo.dashVideo -i ejemploAudio.dashAudio -c copy -map 0:v:0 -map 1:a:0 videoUnido.mp4

Saludos 🙃


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Error homebrew-core is a shallow clone.

Si estamos intentado actualizar brew o instalar un paquete y nos aparece este error:


homebrew-core is a shallow clone.

Con el comando que te recomienda la consola no me funcionó, solo me funcionó aplicando todos estos comandos (y con un poco de paciencia):

git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core" fetch --unshallow
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch
git -C "/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask" fetch --unshallow

Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?