Catégories
Pratique

PNGWing, pour récupérer des images au format PNG

pnwing

Ayant besoin, pour un projet, d’images sans trame de fond pour l’illustrer, je me suis mis en quête d’un site pouvant me fournir ça gratuitement, facilement et sans inscription.

Je suis rapidement tombé sur PNGWING, une usine à publicités (il y en a absolument partout) garnie d’absolument tout ce que je recherchais (îcones google, spotify, apple, … et autres).

icones

PNGWing est accessible en suivant ce lien.

Catégories
Tech

Comment passer le paywall de Medium

Si vous développez du Flutter, vous vous êtes rendu compte que l’incontournable est le site Medium.

Ce dernier de manque pas d’exploiter le filon et rend les articles les plus intéressants payants avec un abonnement plutôt cher, je trouve, nécessaire pour passer son paywall.

Pour by-passer le paywall de Medium, il existe une méthode ultra simple qui consiste à remplacer le début de l’url https://medium.com/ par https://scribe.rip/

Comment passer le paywall de Medium

Par exemple, l’url https://medium.com/swlh/how-to-create-a-singleton-firebase-service-in-flutter-15d7a5ed596b devient https://scribe.rip/swlh/how-to-create-a-singleton-firebase-service-in-flutter-15d7a5ed596b

Plus d’infos sur le site https://scribe.rip

Catégories
Cinéma TV

Khraniteli, le Seigneur des Anneaux Russe

Si vous avez un peu de temps à perdre et SURTOUT que vous comprenez le Russe, vous ne pourrez que vous divertir avec ce kitschissime Seigneur des Anneaux version Russe en 2 parties.

Longtemps interdit par le pouvoir Soviétique (on comprend aisément pourquoi), ce chef d’oeuvre du bric à braque fait avec 3 bouts de ficelle a été diffusé pour la première fois à la télévision de Leningrad (Saint-Petersbourg) les 13 et 14 avril 1991. Rien depuis !

Seigneur des Anneaux Russe

Exhumé par des fans, « Khraniteli » (les gardiens), l’adapte très libre du « Seigneur des anneaux », de J. R. R. Tolkien a refait surface sur Youtube.

Episode 1

Episd

Réalisation : Natalia Serebryakova
Bande son : Andreï Romanov

Catégories
Histoire

Janet Airlines, la compagnie aérienne de la zone 51

La zone 51 est le secteur militaire américain objet de tous les fantasmes complotistes où seraient entreposés ovnis et Aliens, entre autres.

Perdue dans le désert (depuis trop longtemps) au beau milieu du Texas, cette fameuse zone 51 était très difficile d’accès pour des raisons évidentes de sécurité nationale.

compagnie aérienne de la zone 51

Au beau milieu de la guerre froide, en 1972, les forces US ont eu la merveilleuse idée de créer un pont aérien entre un terminal privé de l’aéroport de McCarran de Las Vegas, la zone 51 et le site d’essai nucléaire de Tonopah, toujours dans le Texas pour transporter militaires et sous-traitants entre les sites.

Caractérisé par une carlingue blanche traversée d’une ligne rouge sans autre inscription, cette flotte identifiée WWW par la codification internationale OACI, est toujours en activité.

Catégories
Tech

Gérer les règles de sécurité du Cloud Firestore

Au démarrage d’un projet avec la Firebase Database, les règles de sécurité sont fixées au minimum, autorisant une utilisation totalement ouverte pendant 30 jours.

flutter

Passé ce délai, il convient de modifier ces règles sous peine de voir toutes les requêtes refusées.

La vidéo ci-après explique comment fixer les règles de sécurité de la base de données Firestore.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
			match /users/{userId}/{document=**} {
      	allow read, write: if request.auth.uid == userId;
      }
  }
}

Le github et les tutos flutter de ResoCoder

https://github.com/ResoCoder/flutter-ddd-firebase-course

Catégories
Cinéma TV

Kaamelott Soundboard, révisez vos classiques avant la sortie du film

Le 21 juillet prochain sortira en salles le dernier opus d’Alexandre Astier, Kaamelott – Premier volet. Je ne compte pas en faire la retape, les sites spécialisés regorgent d’informations à ce sujet.

Au lieu de cela, je vous propose plutôt de réviser vos classiques à deux trois poils de cul avec le Kaamelott Soundboard.

Kézako le Kaamelott Soundboard ?

Le Kaamelott Soundboard est une compilation des répliques les plus percutantes ou les plus amusantes de Kaamelott (la série), classées par épisode et par personnage. Le moteur de recherche permet d’ailleurs de sélectionner son héros favori.

Kaamelott Soundboard

Alors bien sûr, tout n’y est pas mais ça permet de se remettre en mémoire les meilleurs moments.

Ça s’appelle Kaamelott Soundboard, c’est gratuit et ça s’accède par ici.

Catégories
Tech

Comment passer de zsh à bash sur MacOS

Depuis la version Catalina de MacOS, le Shell par défaut est zsh.

zsh à bash sur MacOS

Il présente quelques avantages indéniables mais, personnellement, je conserve une affectation pour le bon vieux bash qui, bien qu’inutilisé, est toujours installé sur MacOS.

MacOS : Changer le shell… de ZSH à Bash

Pour changer de shell et passer de zsh à Bash sur MacOS, il suffit d’ouvrir un terminal et d’y taper la commande chsh (pour change Shell) comme ceci :

chsh -s /bin/bash
Capture decran 2021 06 29 a 11.58.06

Et pour revenir en arrière et donc au Shell zsh, de simplement taper dans le terminal

chsh -s /bin/zsh
Catégories
Tech

Régler l’erreur multidex dans Flutter

Après que j’ai connecté mon application Flutter à Firestore, je me suis mangé cette splendide erreur multidex dans Flutter empêchant tout lancement de l’émulateur Android : Error:Cannot fit requested classes in a single dex file

C’est ce qui arrive quand on dépasse la taille maximale autorisée pour le fichier de classes Dex.

En guise de pense-bête, voici comment autoriser le multidex dans Flutter Android pour se débarrasser de l’erreur.

Autoriser le multidex pour Flutter

La manip est tout ce qu’il y a de plus bête, d’autant qu’elle n’impacte que 2 fichiers de l’arborescence :

erreur multidex dans Flutter
  • mon_projet > android > app > build.gradle (ne vous plantez pas en prenant l’autre)
  • mon_projet > android > app > gradle.properties

Les modifications multidex dans build.gradle

Dans mon_projet > android > app > build.gradle, il faut ajouter multiDexEnabled true et passer idéalement le minSdkVersion à 21.

    defaultConfig {

        ...
        minSdkVersion 21
        multiDexEnabled true
    }

Toujours dans ce fichier, il convient d’ajouter la ligne implementation ‘com.android.support:multidex:1.0.3’ dans dependencies.

dependencies {
    ...
    implementation 'com.android.support:multidex:1.0.3'
}

Les modifications multidex dans gradle.properties – Ajouter Jetifier

Et dans mon_projet > android > app > gradle.properties, il faut s’assurer que android.useAndroidX et android.enableJetifier sont présents et positionnés à true pour ajouter Jetifier, comme ci-dessous. Ajoutez les si elles sont manquantes

android.useAndroidX=true
android.enableJetifier=true

Il reste maintenant à sauvegarder les fichiers et relancer l’émulateur.

Catégories
Société

Le pouvoir de guérison des suites de chiffres

Ces derniers jours, j’ai vu paraître dans mon fil d’actualité des articles, en provenance de la presse mainstream, relayant le pouvoir de guérison des suites de chiffres.

Le principe s’appuyerait sur une « séquences de chiffres qui font du bien. [Qui] lorsqu’on les répète, vont notamment réharmoniser nos états émotionnels.« 

Ces suites de chiffres : 819471 contre le stress,  517 489719 841 pour développer la confiance en soi, 28 7 741 pour être en joie seraient à répéter 3 fois selon l’état final souhaité parce que ça entrerait en résonance avec notre organisme. La belle affaire !

Cette méthode est en fait l’idée d’un illuminé, le russe Grigori Petrovich Grabovoi, responsable d’une secte et adepte de Baba Vanga (la vieille qui avait annoncé la fin du monde). Incarcéré pendant un temps pour avoir promis à des familles endeuillées qu’il pouvait faire revenir à la vie leurs enfants, ce type promet de guérir le cancer, et annonce le retour de Jésus. Déjà que rien ne prouve qu’il ait existé, alors un retour.

pouvoir de guérison des suites de chiffres

Bref, ce truc est une pure arnaque relayée par ses adeptes, ou des mal intentionnés qui espèrent pouvoir se faire un peu d’argent, en remettant au goût du jour une ineptie New-Age des années 90. C’est le cas de Zoran Bouazri, un psycho-énergicien (rien que le titre m’amuse) dont parle l’article de RTL.

L’article, en plus de citer des conneries, porte ça sous un jour scientifique où l’on relie mathématiques et physique quantique pour développer des milliers de séquences de chiffres qui font du bien.

Bref, passez votre chemin. C’est une secte !

Embrassez un arbre ou comptez les nuages, ça vous fera prendre l’air et ça épargnera votre psychique et votre porte-monnaie.

Catégories
Tech

Menu déroulant Flutter avec texte dans la AppBar

Comme je me frotte à Flutter depuis quelques temps, et que je ne dois pas être le seul à peiner parfois, voici quelques petits trucs pense-bête qui pourraient éventuellement servir à d’autres.

Ce que je veux, c’est obtenir un menu déroulant Flutter avec texte dans la AppBar, comme ça :

Menu déroulant Flutter avec texte dans la AppBar

Pour réaliser cela, j’ai besoin visuellement :

  • d’un widget MyAppBar que j’appellerai dans le widget principal
  • d’un texte qui me donne le titre « MonApp »
  • d’un menu déroulant avec un texte
  • et d’un autre menu que je ne traite pas ici.

Ce qui signifie :

  • qu’il faut déclarer un title pour la barre d’application. Ici c’est

title: Text("Mon App", style: TextStyle(fontSize: 20)),

  • que le texte et le bouton doivent être positionné dans un row pour être alignés sur une même ligne ET que ce row est implémenté dans le PopupMenuButton, c’est à dire ce qui permet d’afficher le menu déroulant.
  • et que, puisqu’on a un menu puis un bouton en enfilade, qu’on va coller ça dans une liste actions pour faire propre sur l’interface (et surtout pour y retrouver ses jeunes)

On secoue et ça donne ça :

class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
  // element indispensable pour les AppBar déclarées à part
  Size get preferredSize => new Size.fromHeight(50); // la hauteur du appBar

  @override
  Widget build(BuildContext context) {
    return AppBar(
      backgroundColor: Colors.grey[600],
      title: Text("Mon App", style: TextStyle(fontSize: 20)),
      actions: [
       PopupMenuButton<int>(
            child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
              Text("Le texte du bouton"),
              Icon(Icons.arrow_circle_down),
            ]),
            onSelected: (item)=> onSelected(context, item),
            itemBuilder: (context) => [
                  PopupMenuItem<int>(
                    value: 1,
                    child: Text("Suivi du lien 1"),
                  ),
                  PopupMenuItem<int>(
                    value: 2,
                    child: Text("Suivi du lien 2"),
                  ),
                ]),
        SizedBox(width: 10),
        IconButton(onPressed: () {}, icon: Icon(Icons.menu)),
      ],
    );
  }
}

Vous remarquerez au passage le <int> après les PopupMenuButton et PopupMenuItem. Cela permet de passer en paramètre la valeur du champ déterminée dans value grâce à la méthode onSelected que je vous colle ici.


void onSelected(BuildContext context, int item) {
  switch (item) {
    case 1:
      Navigator.of(context)
          .push(MaterialPageRoute(builder: (context) => MaPage1()));
    case 2:
      Navigator.of(context)
          .push(MaterialPageRoute(builder: (context) => MaPage2()));
  }
}

D’ailleurs, si quelqu’un a une meilleure option, je suis preneur.