Je suis d’avis que ce confinement exacerbe notre créativité. C’est vrai, on voit des tas de vidéos sur le Net de gens qui inventent toutes sortes de jeux, challenges, programmes, histoires, dessins, bd… Et j’en passe.

Perso, j’en ai profité pour faire du code. J’ai codé un million de trucs useless pendant ce confinement, en Perl, en Python, en C++.

Exemple : pourquoi ne pas utiliser Mojolicious pour faire une sorte d’API qui nous donne une citation random à chaque requête ?

J’ai fait ça avec un module, Fortune. Dans un premier temps, j’installe les dépendances (libre à vous d’utiliser perlbrew ou non) :

➜ cpanm Mojolicious::Lite Mojo::Server::Daemon Fortune

J’utilise pour le coup un perl d’un environnement local, puisque j’utilise perlbrew, avec un -w pour le flag warning.

#!perl -w
use strict;

Je charge ensuite quelques modules nécessaires à ma super application (rappelons-le, qui est super utile):

use Fortune;
use Mojolicious::Lite -signatures;
use Mojo::Server::Daemon;

Next step, charger les fortunes. Je me suis servi d’un fichier pris sur github. La méthode read_header permet de parser le fichier.

my $fortune = Fortune->new("fortunes.txt");
$fortune->read_header();

Ensuite, écrire la route principale de l’API. C’est là que je me sers de l’option -signatures de Mojolicious::Lite.

Ma route principale récupère une forturne en mode random grâce à la méthode du même nom. Je dégage ensuite à la volée ce qui ne m’intéresse pas dans la quote : saut de ligne et espaces en tout genre. Et enfin, je retourne la quote.

get '/' => sub($q) {
	my ($data, $quote);
	$data = $fortune->get_random_fortune();
	($quote) = $data =~ /(.*)\n.*/;
	$q->render(json => $quote);
};

Ensuite, Mojo::Server::Daemon me permet de faire tourner l’app Mojolicious sur l’interface et le port de mon choix, plutôt que le port 3000 de toutes les interfaces qui est le comportement par défaut du framework.

Mojo::Server::Daemon->new(
	app => app,
	listen => ["http://127.0.0.1:8080"]
)->run();

Pour le coup, en local, j’écoute sur mon localhost.

Résultat des courses :

➜  ~ http http://127.0.0.1:8080
HTTP/1.1 200 OK
Content-Length: 79
Content-Type: application/json;charset=UTF-8
Date: Mon, 04 May 2020 21:45:32 GMT
Server: Mojolicious (Perl)

"Whatever is not nailed down is mine. What I can pry loose is not nailed down."

➜  ~ http http://127.0.0.1:8080
HTTP/1.1 200 OK
Content-Length: 178
Content-Type: application/json;charset=UTF-8
Date: Mon, 04 May 2020 21:45:33 GMT
Server: Mojolicious (Perl)

"You can do anything if you have enthusiasm. Enthusiasm is the yeast that makes your hopes rise to the stars. With it, there is accomplishment. Without it there are only alibis."

➜  ~ http http://127.0.0.1:8080
HTTP/1.1 200 OK
Content-Length: 88
Content-Type: application/json;charset=UTF-8
Date: Mon, 04 May 2020 21:45:34 GMT
Server: Mojolicious (Perl)

"We are all in the same boat in a stormy sea, and we owe each other a terrible loyalty."

➜  ~ http http://127.0.0.1:8080
HTTP/1.1 200 OK
Content-Length: 319
Content-Type: application/json;charset=UTF-8
Date: Mon, 04 May 2020 21:45:34 GMT
Server: Mojolicious (Perl)

"The reason you should go to Las Vegas is because, for only the second time, the second time, ever, they have rebuilt Sodom and Gomorrah. It's back!! And you have the opportunity to see it before it turns to salt. And you wanna get out there before the Christian Right finds out what we're up to and shits all over it."

Le code complet :

#!perl -w
use strict;

use Fortune;
use Mojolicious::Lite -signatures;
use Mojo::Server::Daemon;

my $fortune = Fortune->new("fortunes.txt");
$fortune->read_header();

get '/' => sub($q) {
	my ($data, $quote);
	$data = $fortune->get_random_fortune();
	($quote) = $data =~ /(.*)\n.*/;
	$q->render(json => $quote);
};

Mojo::Server::Daemon->new(
	app => app,
	listen => ["http://127.0.0.1:8080"]
)->run();

exit(0);

N’oubliez pas : coder n’importe quoi permet d’apprendre 😄

PS, en parlant de citations : may the fo(urth|ce) be with you…