Aller au contenu
Korben, roi d’internet, logo bébé avec des lunettes en mode thug life

Du Python pour les développeurs avancés

— Article en partenariat avec talent.io

Le mois dernier, je m’adressais aux développeurs JavaScript en passant en revue les meilleurs outils pour debugger du NodeJS. Et cette semaine, toujours en partenariat avec talent.io, je m’adresse cette fois aux développeurs Python.

Avant de rentrer dans le vif du sujet, j’aimerais revenir sur un point que j’ai pu évoquer avec certains d’entre vous : l’envie de changer de job. C’est une démarche qui peut s’avérer assez compliquée, stressante parfois, tant on a envie de trouver un travail qui nous corresponde. On peut souhaiter avoir un travail plus proche de chez soi voire en télétravail complet, un meilleur salaire, une meilleure ambiance au travail, ou même tout ça à la fois (mais ce n’est pas forcément facile à trouver).

Pour cela, il vous suffit de créer un compte sur la plateforme talent.io en quelques clics pour ensuite recevoir des offres de la part d’entreprises qui correspondent à vos critères précis et qui affichent un salaire d’entrée de jeu. talent.io est vraiment le moyen le plus simple de trouver son prochain job tech, d’ailleurs les inscrits trouvent leur emploi en 20 jours en moyenne.

Même si en passant par talent.io, vous éliminez le côté pénible de la recherche d’emploi, vous devez également en tant que développeur, vous tenir informé des évolutions de votre langage fétiche et améliorer votre niveau technique afin de vous démarquer des autres.

Et ça tombe bien puisque dans cet article, je passe en revue quelques méthodes et astuces pour que vous deveniez un meilleur développeur Python.

Allez, on commence avec du facile…

Évitez les variables globales

Une variable locale c’est mieux qu’une variable globale concernant l’occupation mémoire. Donc si vous avez des variables à déclarer, faites le dans vos fonctions plutôt qu’hors de celles-ci sauf si vraiment, vous n’avez pas le choix.

Par exemple, plutôt que ceci :

x = 5
y = 8

def add():
    return x + y

print(add())

Privilégiez cela :

def add():
    x = 5
    y = 8
    return x + y

print(add())

Ça n’a l’air de rien, mais c’est toujours un peu de performance qui peut-être grappillé. Et nous savons tous que le gain de performance est très important, surtout en Python, donc il ne faut jamais négliger ces petites choses.

Les slotted classes

Lorsque vous créez des objets à partir d’une classe, vous pouvez également faire en sorte qu’ils occupent moins de mémoire. Cela est faisable en créant des classes qu’on dit « slotted ». Cela consiste à définir de manière explicite l’ensemble des champs que notre classe est autorisée dans le champ __slots__ plutôt que dans un champ __dict__.

class Exempleslots():
    __slots__ = ['name', 'age']

    def __init__(self, name, age):
        self.name = name
        self.age = age


x1 = Exempleslots('Raymonde', 36)
x2 = Exempleslots('Korben', 40)
print(x1.name)
print(x2.age)

Au-delà de l’économie de mémoire, ça offre également un accès plus rapide aux attributs de la classe et ça permet également de ne plus se tromper dans les attributs qu’on ajoute à sa classe. Si vous avez un programme qui nécessite la création de nombreuses instances d’une même classe, cela vous permettra d’optimiser ses performances, de faire de réelles économies de mémoire et accessoirement d’éviter les boulettes.

Utilisez toujours les fonctions et les libs de Python

C’est important de bien connaitre un langage, car en général, tout est déjà présent dans celui-ci. Admettons que j’ai une liste de mots que je souhaite joindre. C’est parfaitement possible avec une boucle « for » comme ceci :

s = " "
for word in words:
    s = s + word + " "
print(s)

Mais autant utiliser la fonction « join » de Python :

words = ["hello", "world", "my", "name", "is", "Korben"]
print(" ".join(words))

Moins de lignes, moins de temps, moins de risques d’erreurs. Ce n’est là qu’un tout petit exemple, mais c’est un réflexe que vous devez avoir. Lorsque vous ferez des tests d’évaluation après avoir trouvé l’entreprise de vos rêves, vous ferez la différence avec ce genre de petits détails qualité.

Exploiter les classes de données

Une classe de données est une classe ordinaire qui est créée spécifiquement pour contenir des données. Pour la créer, vous aurez besoin du decorator @dataclass. Les décorateurs sont des fonctions qui modifient le comportement d’autres fonctions sans affecter leurs fonctionnalités de base.

Voici un exemple :

from dataclasses import dataclass
@dataclass
class Dog:
    name: str
    age: int
    owner: str

dog1 = Dog("Medor", "4", "Mike")
dog2 = Dog("Sultan", "2", "Korben")

print(dog1 == dog2)
#False
print(dog1.name)
#Médor
print(dog1)
#Dog(name='Medor', age='4', owner='Mike')

Aussi, les classes de données que vous créerez seront comparables grâce à la méthode « eq » déjà présente dans la @dataclass.

Cela ajoutera à votre classe de nombreuses fonctionnalités qui seront héritées du decorator, ce qui vous permettra d’avoir une classe très compacte. Cette classe ne contiendra pas de fonctions, mais uniquement des champs avec vos données.

Ajouter un « else » après vos boucles

Lorsque vous faites un boucle qui doit tourner jusqu’à ce qu’une condition soit remplie, vous utilisez une variable comme « test = True » lorsque la condition est remplie et vous interrompez la boucle avec un « break » comme ceci, puis vous enchaînez sur un « if test… » :

for i in range(6):
    print(i, i*i)
    if i == 7:
        test = True
        break
    else:
        test = False

if test == False:
    print("test is false")

Bien que moins habituelle, une meilleure syntaxe serait plutôt d’utiliser un else après vos boucles « for » ou « while » comme ceci pour que votre code soit plus concis :

for i in range(6):
    print(i, i*i)
    if i == 7:
        break
else:
    print("test is false")

Fusionner des dictionnaires

Si vous utilisez des dictionnaires de données et que vous voulez les fusionner, d’une manière assez naturelle, on fait en général ceci :

dict1 = {'name':'John', 'age':'25'}
dict2 = {'height':'193', 'weight':'100'}

#fusion dans dict3
dict3 = dict1.copy()
dict3.update(dict2)

print(dict3)

Mais avec l’arrivée de Python 3.9 et supérieures, c’est encore plus simple. Il suffit d’un petit « pipe » comme ceci :

dict1 = {'name':'John', 'age':'25'}
dict2 = {'height':'193', 'weight':'100'}
dict3 = dict1 | dict2
print(dict3)

Pensez toujours à vous renseigner sur ce que permettent de faire les nouvelles versions de votre langage fétiche. C’est un peu comme lors de votre recherche d’emploi. Pensez bien lorsque vous renseignerez votre profil talent.io à vous démarquer en faisant ressortir vos points forts et vos éléments différenciant pour que les entreprises qui recrutent s’arrêtent sur votre profil et soient convaincus que c’est vous le meilleur.

Utiliser des tuples

En Python, les développeurs débutants ont tendance à créer des listes dès qu’il s’agit de stocker des données. Mais avez-vous songé à utiliser un tuple à la place ? Celui-ci partage sensiblement les mêmes caractéristiques qu’une liste à la différence près que le tuple est immuable (on ne peut pas le modifier une fois défini) et que sa syntaxe est différente (il faut des parenthèses).

Voici à quoi ressemble une liste :

test_scores = [100, 90, 70, 60, 50, 40, 30, 20, 10, 0]

Et voici à quoi ressemble un tuple :

test_scores = (100, 90, 70, 60, 50, 40, 30, 20, 10, 0)

Ensuite, il suffit de comparer la taille en mémoire de chacun des objets pour se rendre compte que le tuple bouffe moins d’espace mémoire :

import sys

list_test_scores = [100, 90, 70, 60, 50, 40, 30, 20, 10, 0]
tuple_test_scores = (100, 90, 70, 60, 50, 40, 30, 20, 10, 0)

print(sys.getsizeof(list_test_scores))
# taille de la list : 136
print(sys.getsizeof(tuple_test_scores))
# taille du tuple : 120

Vous l’aurez compris, si vous n’avez pas prévu de modifier une liste, autant utiliser un tuple.

Comme vous pouvez le voir dans cet exemple, j’ai également utilisé la fonction sys.getsizeof() qui permet de mesurer l’utilisation mémoire d’un objet Python. Cela vous permettra de benchmarker l’utilisation mémoire de votre code et de l’optimiser au fur et à mesure. D’une manière générale, essayez toujours de réduire le nombre de lignes et l’empreinte mémoire de votre programme. Essayez également de réduire le temps passé à chercher un job, et visez directement la qualité.

Remplir une liste

Si je vous demande de remplir une liste avec des nombres impairs de 0 à 100, vous allez probablement utiliser la fonction « for » comme ceci :

mylist = []
for i in range(1,101):
        if i%2 != 0:
                mylist.append(i)
print(mylist)

Toutefois, il existe un autre moyen de remplir une liste sans boucle for en utilisant la méthode « comprehension » comme ceci :

mylist2 = [i for i in range(1,101) if i%2 != 0]

Une syntaxe plus courte, plus efficace dans laquelle vous pouvez même ajouter des fonctions si vous le désirez :

def ma_fonction(x):
    return x % 2 != 0

mylist3 = [i for i in range(1,101) if ma_fonction(i)]

Pensez à utiliser les itertools

Les itertools sont une lib qui propose des blocs d’itérations tout faits. Cela permet d’effectuer des opérations courantes rapidement.

Par exemple pour faire des permutations de lettres, on peut utiliser « permutations » ou des combinaisons comme ceci :

import itertools

print(list(itertools.permutations("KORBEN")))
print(list(itertools.combinations("KORBEN", 3)))

Et voici le résultat :

Permutations : 

[('K', 'O', 'R'), ('K', 'O', 'B'), ('K', 'O', 'E'), ('K', 'O', 'N'), ('K', 'R', 'O'), ('K', 'R', 'B'), ('K', 'R', 'E'), ('K', 'R', 'N'), ('K', 'B', 'O'), ('K', 'B', 'R'), ('K', 'B', 'E'), ('K', 'B', 'N'), ('K', 'E', 'O'), ('K', 'E', 'R'), ('K', 'E', 'B'), ('K', 'E', 'N'), ('K', 'N', 'O'), ('K', 'N', 'R'), ('K', 'N', 'B'), ('K', 'N', 'E'), ('O', 'K', 'R'), ('O', 'K', 'B'), ('O', 'K', 'E'), ('O', 'K', 'N'), ('O', 'R', 'K'), ('O', 'R', 'B'), ('O', 'R', 'E'), ('O', 'R', 'N'), ('O', 'B', 'K'), ('O', 'B', 'R'), ('O', 'B', 'E'), ('O', 'B', 'N'), ('O', 'E', 'K'), ('O', 'E', 'R'), ('O', 'E', 'B'), ('O', 'E', 'N'), ('O', 'N', 'K'), ('O', 'N', 'R'), ('O', 'N', 'B'), ('O', 'N', 'E'), ('R', 'K', 'O'), ('R', 'K', 'B'), ('R', 'K', 'E'), ('R', 'K', 'N'), ('R', 'O', 'K'), ('R', 'O', 'B'), ('R', 'O', 'E'), ('R', 'O', 'N'), ('R', 'B', 'K'), ('R', 'B', 'O'), ('R', 'B', 'E'), ('R', 'B', 'N'), ('R', 'E', 'K'), ('R', 'E', 'O'), ('R', 'E', 'B'), ('R', 'E', 'N'), ('R', 'N', 'K'), ('R', 'N', 'O'), ('R', 'N', 'B'), ('R', 'N', 'E'), ('B', 'K', 'O'), ('B', 'K', 'R'), ('B', 'K', 'E'), ('B', 'K', 'N'), ('B', 'O', 'K'), ('B', 'O', 'R'), ('B', 'O', 'E'), ('B', 'O', 'N'), ('B', 'R', 'K'), ('B', 'R', 'O'), ('B', 'R', 'E'), ('B', 'R', 'N'), ('B', 'E', 'K'), ('B', 'E', 'O'), ('B', 'E', 'R'), ('B', 'E', 'N'), ('B', 'N', 'K'), ('B', 'N', 'O'), ('B', 'N', 'R'), ('B', 'N', 'E'), ('E', 'K', 'O'), ('E', 'K', 'R'), ('E', 'K', 'B'), ('E', 'K', 'N'), ('E', 'O', 'K'), ('E', 'O', 'R'), ('E', 'O', 'B'), ('E', 'O', 'N'), ('E', 'R', 'K'), ('E', 'R', 'O'), ('E', 'R', 'B'), ('E', 'R', 'N'), ('E', 'B', 'K'), ('E', 'B', 'O'), ('E', 'B', 'R'), ('E', 'B', 'N'), ('E', 'N', 'K'), ('E', 'N', 'O'), ('E', 'N', 'R'), ('E', 'N', 'B'), ('N', 'K', 'O'), ('N', 'K', 'R'), ('N', 'K', 'B'), ('N', 'K', 'E'), ('N', 'O', 'K'), ('N', 'O', 'R'), ('N', 'O', 'B'), ('N', 'O', 'E'), ('N', 'R', 'K'), ('N', 'R', 'O'), ('N', 'R', 'B'), ('N', 'R', 'E'), ('N', 'B', 'K'), ('N', 'B', 'O'), ('N', 'B', 'R'), ('N', 'B', 'E'), ('N', 'E', 'K'), ('N', 'E', 'O'), ('N', 'E', 'R'), ('N', 'E', 'B')]

Combinaisons :

[('K', 'O', 'R'), ('K', 'O', 'B'), ('K', 'O', 'E'), ('K', 'O', 'N'), ('K', 'R', 'B'), ('K', 'R', 'E'), ('K', 'R', 'N'), ('K', 'B', 'E'), ('K', 'B', 'N'), ('K', 'E', 'N'), ('O', 'R', 'B'), ('O', 'R', 'E'), ('O', 'R', 'N'), ('O', 'B', 'E'), ('O', 'B', 'N'), ('O', 'E', 'N'), ('R', 'B', 'E'), ('R', 'B', 'N'), ('R', 'E', 'N'), ('B', 'E', 'N')]

Les itertools (ou outils d’itérations) sont vraiment très pratiques et je vous invite à consulter cette page de documentation qui passe en revue toutes les fonctionnalités de cette lib indispensable.

Déplacer les calculs hors des boucles

Toujours dans un souci d’optimisation, si vous faites de l’itération à l’aide d’une boucle « for » pour par exemple tester la validité d’un email à l’aide d’une expression régulière, pensez à sortir la regex de la boucle.

Par exemple, si vous faites comme ceci :

import re

emails = ["[email protected]", "[email protected]", "[email protected]", "youpi%korben.info"]
for i in emails:
        if re.match(r'^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', i):
                print(i + " is a valid email")
        else:
                print(i + " is not a valid email")
                

Vous pouvez faire plus optimisé comme ceci :

import re
email_regex = re.compile(r'^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')

emails = ["[email protected]", "[email protected]", "[email protected]", "youpi%korben.info"]
for i in emails:
        if re.match(email_regex, i):
                print(i + " is a valid email")
        else:
                print(i + " is not a valid email")
                

Encore un bon gain de temps dans les performances de votre code.

Penser autrement

Imaginez que vous deviez coder un développeur qui attaque son lundi matin. Voici l’algo : « Si j’ai Internet et que j’ai un café à la main, alors je peux travailler. Sinon, je me mets en position latérale de sécurité.« 

Traduit en code, naturellement ça donnerait ceci :

if Internet() is True:
        if Coffee() is True:
                print("Je me mets au travail")
else :
        raise Exception("Je me mets en PLS")

Mais en réfléchissant un peu, on peut retourner cette condition comme ceci et gagner quelques lignes :

if (not Internet()) or (not Coffee()):
        raise Exception("Je me mets en PLS")
print("Je me mets au travail")

Évidemment, j’espère que lors de vos prochains entretiens, vous n’évoquerez pas cette histoire de position latérale de sécurité ;-))). Toutefois, je suis certain que votre façon originale de penser sera fortement appréciée lorsque les entreprises parcourront votre profil.

Conclusion

Voilà, j’espère que ce petit tour d’horizon destiné aux développeurs confirmés Python vous aura plu. Gardez bien en tête que faire mieux c’est toujours possible quand on parle de développement informatique. Il y a toujours moyen d’aller plus loin dans sa réflexion et ses optimisations, et c’est précisément ça qui fera la différence entre vous et d’autres candidats lorsque vous chercherez votre prochain emploi.

Quoiqu’il en soit, encore un grand merci à talent.io sans qui cet article n’aurait pas vu le jour. Je vous invite d’ailleurs à cliquer sur ce lien pour en savoir plus sur leur plateforme et vous créer un profil (gratuitement!), que ce soit pour trouver votre nouvel emploi ou simplement rester à l’écoute du marché. Plus de 6 000 développeurs ont été recrutés grâce à talent.io, alors pourquoi ne pas tenter ?

Si vous êtes développeur et que vous aimez mettre du Python partout, dans vos poches, dans vos slips, sur vos tartines le matin, alors pourquoi ne pas en mettre également dans vos pages HTML ?

Et cela est maintenant possible grâce à ce PyScript, un bout de js + css à intégrer à votre code qui vous permettra de créer des applications Python directement au coeur de votre code HTML.

Pour ce faire, copiez ceci dans votre page :

<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
<script defer src="https://pyscript.net/alpha/pyscript.js"></script> 

Ensuite, il ne vous reste plus qu’à pondre du Python dans une balise <py-script> comme ceci :

<py-script>print("hello les petits fous")</py-script>

Voici un exemple avec le calcul de Pi pour 3 décimales après la virgule :

<html>
<head>
    <meta charset="UTF-8">
    <title>pytest</title>
    <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
    <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
</head>
<body>
       <py-script>
def wallis(n):
    pi = 2
    for i in range(1,n):
        pi *= 4 * i ** 2 / (4 * i ** 2 - 1)
    return pi

pi = wallis(100000)
s = f"π est approximativement {pi:.3f}"
print(s)
        </py-script>
</body>
</html>

Bon, je ne vous cache pas que c’est long niveau processing et je ne pense pas que ce sera vraiment utilisable pour de l’application web grand public. Mais c’est rigolo. On peut même utiliser des packages et autres modules, faire des interfaces, et même récupérer des valeurs dans les pages HTML avec la fonction pyscript.write comme ceci :

<html>
<head>
    <meta charset="UTF-8">
    <title>pytest</title>
    <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />
    <script defer src="https://pyscript.net/alpha/pyscript.js"></script>
</head>
<body>
<h1 id="pi">xxx</h1>
       <py-script>
def wallis(n):
    pi = 2
    for i in range(1,n):
        pi *= 4 * i ** 2 / (4 * i ** 2 - 1)
    return pi

pi = wallis(100000)
s = f"π est approximativement {pi:.3f}"
pyscript.write('pi', s)
        </py-script>
</body>
</html>

Si cela vous intéresse, vous trouverez tout sur le site de PyScript.


Découvrez le projet Decentraland ($MANA)

– Article en partenariat avec LiteBit . Cet article n’est en aucun cas un conseil en investissement, mais simplement la présentation d’un projet technique autour de la blockchain –

Hello les amis, aujourd’hui je vais vous présenter Decentraland, un projet crypto qui tourne autour du métavers. C’est l’un des principaux concurrents à The Sandbox, dont j’ai déjà parlé, et dans une moindre mesure Enjin Coin. Allez c’est parti pour cette nouvelle addition à ma longue série d’articles sur les blockchains (Harmony, Solana, Ape Coin …).

Présentation du projet

Historiquement Decentraland est l’un des projets crypto les plus anciens sur le thème des métavers, il a été lancé en version publique début 2020, mais est en phase de développement depuis 2015. Ce qui en fait l’un des « vieux » du game. L’idée c’est de permettre aux joueurs d’acheter une parcelle de terrain qu’ils pourront exploiter par la suite. Il en existait 90 601 sur la carte originelle pour être précis.

Pour se faire une idée, lors de la version bêta (2017) la parcelle valait 20$, aujourd’hui ça se marchande dans les millions. On parle quand même d’une crypto qui est dans le Top 50 depuis assez longtemps, elle fait partie du paysage.

Il repose sur la blockchain Ethereum (en 2015/2016 c’était un peu la seule option valable) et se joue via un navigateur web. J’ai lu qu’ils pensaient migrer vers Polygon, blockchain layer 2 qui repose sur Ethereum avec des frais de transactions inférieurs, par contre j’avoue ne pas savoir ou ça en est. Le projet évolue sans cesse et a déjà ajouté de nouvelles possibilités pour devenir un monde virtuel 3D décentralisé complet, il intègre par exemple depuis longtemps la technologie des NFTs (voir ci-dessous). Métavers, NFT, GameFi … vous avez tous les buzzwords du moment, mais le projet était là avant leur existence 😉

Petite spécificité de Decentraland, l’équipe a annoncé avoir brûlé les clés privées du smart contract, le projet est donc aux mains des utilisateurs (via la DAO du projet).

Le token MANA

Si au début Decentraland n’avait qu’un token, le $MANA, il a depuis ajouté un second à son offre, le $LAND.

Le $MANA est le token utilitaire qui permet en priorité d’effectuer toutes vos transactions sur la plateforme : acheter/vendre votre terrain ou des objets (via le marketplace), de spéculer, etc. Il permet aussi d’obtenir un droit de vote dans la gouvernance du projet, donc d’émettre votre avis sur les évolutions futures. Le token assez classique que vous connaissez.

Le $LAND, de son côté, est un token sous forme de NFT qui valide que vous êtes bien détendeur d’une parcelle. La preuve de propriété du terrain sur votre adresse blockchain en somme. Lorsqu’une parcelle est mise aux enchères, les $MANA nécessaire à son achat sont brûlés, ce qui en fait un token déflationniste.

À vous de voir ce que vous faites ensuite, soit vous garder vos tokens sur la plateforme ou les places de marchés en ligne, soit vous les stockez sur Metamask ou, mieux, sur un hardware wallet (Ledger, Trezor …). Comme d’hab je vous recommande ces derniers si vous visez le long terme.

Pourquoi Decentraland est un projet intéressant ?

Les joueurs de Decentraland peuvent effectuer de nombreuses actions comme acheter ou vendre des parcelles de terrains, explorer de nouvelles zones, communiquer avec les autres joueurs, personnaliser son avatar, participer à des jeux, effectuer des paiements, interagir avec des applications, marchander des NFTs, etc bref les solutions sont multiples.

Et pas que pour les particuliers comme vous et moi, aussi (et surtout ?) pour les entreprises et personnalités qui veulent faire parler d’elles ou proposer des expériences différentes à leurs clients/fans. Beaucoup de noms connus s’y sont implantés, c’est le cas par exemple de Samsung, Atari, Dolce & Gabbana, Adidas. Ou encore Sotheby’s, qui y tient maintenant des ventes aux enchères virtuelles et La Barbade (le pays) qui y a ouvert la première ambassade virtuelle au monde. On n’arrête pas le progrès ma bonne dame.

Les développeurs pourront aussi y trouver leur bonheur puisqu’il est possible de proposer des expériences virtuelles (visuelles, audio …), des animations, etc et cela gratuitement. Mais pas de panique pour les personnes non-dev, il est tout de même possible de faire des choses grâce à un outil d’édition proposé par la boite.

Parmi les nouveautés attendues, ils vont bientôt proposer un client desktop et les royalties pour les créateurs de contenu. Si vous êtes doué …

Par contre il faut aimer le style graphique un peu type Minecraft. Même si ça s’améliore au fil du temps; comparé à Sandbox on est toujours un cran en dessous je trouve. Idem en termes d’activité et nombre de joueurs, j’ai testé le jeu il y a quelques mois et c’était un peu le désert.

Quel est le cours du MANA ?

Où acheter des MANA ?

C’est facile : à peu près partout. C’est l’avantage avec les anciens projets, ça se trouve quasi sur toutes les plateformes d’achats du moment, de Coinbase à Binance et passant par Upbit ou LiteBit. Vous savez que ce sont mes partenaires et je vous ai déjà expliqué les raisons qui ont fait mon choix. Sécurité, fiabilité, expériencité expérience … que demander de plus ?

Et le choix commence à vraiment être sympa puisqu’il y a maintenant 78 cryptos disponibles depuis les ajouts récents du stablecoin USDC (un gros manque jusque là), de la crypto Audius ou encore de Ziliqa. La fonction de staking a aussi pris du poids avec la possibilité de gagner des intérêts sur vos Cardano, BNB ou encore MATIC.

Acheter Decentraland sur la plateforme LiteBit !

La trousse à outil nécessaire pour approfondir : le blogla documentationle whitepaper (lien PDF)

À bientôt pour la présentation d’un autre projet crypto !

Vous êtes en train de regarder une vidéo Youtube pépouze dans votre chaise longue, quand soudain un extrait vous semble idéal pour en faire un gif animé qui ravira vos amis et vous redonnera du succès auprès du sexe opposé (ou pas).

Alors dans ce cas, remplacez simplement le « youtube » de l’url par gifs et vous tomberez sur l’éditeur suivant.

Exemple, https://www.youtube.com/watch?v=EORg7Cod_IQ deviendra https://gifs.com/watch?v=EORg7Cod_IQ

Vous pourrez alors sélectionner le passage à extraire mais également rajouter du texte, des images, des effets (thug life…etc), des bordures, du flou, saturer les couleurs, retourner l’image…etc.

Certaines de ces fonctionnalités sont payantes mais on peut quand même faire pas mal de trucs gratuits. Bref, c’est super pratique si vous aimez faire des gifs animés à partir de vidéos Youtube. Vous pouvez également uploader vos propres vidéos en allant directement ici.

Enjoy !


MacOS embarque nativement un outil pour faire des captures écrans, soit d’une zone définie, soit de l’intégralité de l’écran. Pour cela, il suffit d’utiliser les raccourcis claviers :

  • CMD + MAJ + 3
  • CMD + MAJ + 4

Mais si vous avez besoin d’aller plus loin avec un outil plus précis, je vous invite à télécharger Shottr.

Shottr se lance automatiquement au démarrage de votre ordinateur et après une petite configuration qui consiste à lui donner quelques permissions et à désactiver les raccourcis systèmes de capture écran, vous deviendrez le boss de la capture écran.

Ainsi, Shottr vous permettra de faire des captures plein écran, des captures de zone mais également de fenêtres avec une personnalisation du fond (wallpaper, transparent, couleur unie…etc), ce qui est très cool pour avoir un truc plutôt propre.

Vous pouvez également choisir l’action qui se déroulera après votre capture écran. A savoir sauvegarder celle-ci, l’ouvrir dans l’éditeur de Shottr ou afficher une petite vignette avec différentes actions (sauvegarde, édition, upload…etc, de quoi avoir le choix).

Shottr embarque également un module d’OCR qui permet de récupérer le texte de la zone que vous avez capturée. Génial pour reprendre un bout de texte à partir d’un fichier où le copier coller n’est pas possible.

L’éditeur vous permettra également de mettre des flèches, du texte, de récupérer les couleurs avec une pipette mais surtout de flouter rapidement ou d’effacer des éléments. Shottr vous permettra aussi de mesurer en pixel l’espacement entre les éléments ou leur taille et d’afficher ça sur la capture. Ca permet aux développeurs frontend de faire le point sur les maquettes par exemple.

Je vous laisse avec la vidéo qui vous en montrera un peu plus.

Shottr vous fera gagner un max de temps avec toutes vos captures et vous pouvez le télécharger ici.


Savez-vous avec qui vous interagissez le plus sur Twitter ?

Pas vraiment. Et pourtant c’est facile de le déterminer grâce aux données publiques de Twitter grâce à cet outil Orbit. Vous entrez simplement votre pseudo Twitter ou celui de la personne qui vous intéresse et l’outil récupérera vos tweets et likes les plus récents ainsi que les interactions que vous avez eu avec les autres, pour produire un score d’interaction.

Et c’est ce score qui permettra de classer les gens par cercle. Ensuite la mise en forme, le nombre de cercles et les couleurs sont modifiables si vous le souhaitez et vous pouvez également télécharger l’image générée.

Je vous laisse donc découvrir les comptes Twitter de mon premier cercle d’interaction. Que des gens cools et sympas. The crème of the crème comme on dit en Normandie.

A tester ici pour ceux qui veulent.


Je vous en ai parlé rapidement dans mon dernier édito et ce matin en sirotant mon café, je me suis dit que ça méritait quand même un article plus détaillé.

Les Geek Faëries est un festival qui célèbre la culture geek au sens large. C’est un moment de partage unique où chacun peut venir avec ses passions, les faire découvrir, rencontrer d’autres passionnés et surtout apprendre et vivre de nouvelles choses. Ça n’a rien à voir avec les conventions geeks que vous pouvez connaître. C’est vraiment beaucoup plus large et beaucoup moins commercial. On est vraiment sur de la passion et de l’échange.

Aller aux Geek Faëries, ça permet vraiment de se ressourcer. De faire une pause de « monde réel » pour kiffer sa passion et celles des autres en toute bienveillance, dans un environnement détendu et ouvert.

Photo de Florian Belmonte (l’article est ici)

Le lieu est magique, les gens sont extra et les activités variées : conférences, cosplay, retrogaming, jeux de rôle, jeux de société, hacking, logiciel libre, arène de combat médiéval, ainsi que des concerts et des moments de rencontre avec les invités. Il y aura même Mozilla, Framasoft et Ratzillas !

Vous pourrez même devenir un livre vivant.

Photo de Florian Belmonte (l’article est ici)

L’événement, auquel je participerai ainsi que Remouk mon acolyte de Webosaure (et son groupe Kickban) aura lieu du 3 au 5 juin prochain. Nous aurons donc le plaisir de vous rencontrer là bas, d’échanger, et de passer un bon moment.

Et je suis certain qu’il fera beau et qu’aucune pandémie ne viendra gâcher la fête 🙂

En 2017, j’avais même réalisé une vidéo portrait de geek que je vous remets ici même si ça date 🙂

Infos pratiques

Maintenant les infos pratiques :

Voilà, pour le résumé. J’espère vraiment vous voir là bas. C’est un peu ma sortie de l’année donc j’espère vraiment qu’on ne se ratera pas sur place.

À très vite !

La magnifique affiche de Fanélia

Mes gazouillis

Bolo végétariennes ! Merci Jow pour la recette. (20€ de courses offert ici https://t.co/RMrENnC4HU ) #kbn #foodhttps://t.co/XRfdHUzzYC
Du #Python pour les développeurs avancés https://t.co/9hYPUcBNyN avec @talent_io #code #kbn