Nouvelle version: Unicode

En passant, j'ai mis à jour ma page sur les caractères unicode...

Il y a plus de rubriques et j'ai ajouté un moteur de recherche qui accepte plusieurs mots séparés par des espaces.

par exemple: http://unicode.warriordudimanche.net/?search=aubergine

Allez, bisou !

Getlib: ramener des bibliotheques & frameworks en local en une ligne [Edité]

Certains se souviennent peut-être de goofi, pour récupérer des google fonts en local; sur la base de ce script, j'ai bricolé une version qui permettra de faire la même chose avec les bibliothèques et frameworks (notamment js) que tout un chacun utilise et dont l'appel participe aux stats de google et consorts à chaque requête sur leur serveur.

Donc, en gros, il suffit de remplacer l'appel du script dans le en ajoutant getlib.php?url= devant.

Ainsi

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

deviendra

<script src="http://monserveur/getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Le fichier est récupéré une seule fois et seule la vertsion locale sera renvoyée par la suite.

Au cas où vous voulez que le script récupère une éventuelle mise à jour, il suffit d'ajouter update dans l'url:

<script src="http://monserveur/getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Getlib vérifiera alors si le fichier distant a changé et le retéléchargera si c'est nécessaire.

Comme avec Goofi, seule l'IP du serveur qui héberge le script est connue du serveur distant, jamais celle du visiteur.

C'est tout! Je n'ai pas testé à fond encore et les erreurs ne sont pas gérées pour le moment, mais ça fonctionne quand même pas mal !

<?php 
# get libs from distant servers to local (& avoid unnecessary requests to servers who can log user's connections)
# ex:  
# https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# becomes
# getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# if you want to update local file if the distant one changes, just add "update" 
# getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# author: warriordudimanche.net
# 
$lib_folder='libs/';
$check_updates=isset($_GET['update']);

if (!empty($_GET['url'])){
    if (!is_dir($lib_folder)){mkdir($lib_folder);}

    $url=strip_tags($_GET['url']);
    define('LOCAL_FILENAME',$lib_folder.basename($url));
    $ext=pathinfo(LOCAL_FILENAME)['extension'];
    //$flag='non';
    if (
        !is_file(LOCAL_FILENAME)
        ||
        ($check_updates && !isSameFile($url))

    ){
        $lib=file_get_contents($url,false,null,0,1000000);
        file_put_contents(LOCAL_FILENAME,$lib);
        $head = array_change_key_case(get_headers($url, TRUE));
        file_put_contents(LOCAL_FILENAME.'.info', $head['last-modified']);
        //$flag='oui';
    }
    if ($ext=='css'){
        $mime='text/css';
    }elseif ($ext=='js'){
        $mime='text/javascript';
    }else{
        $mime=mime_content_type(LOCAL_FILENAME);
    }

    header('Content-Type: '.$mime);
    exit(file_get_contents(LOCAL_FILENAME));
}


function isSameFile($url){
    $head = array_change_key_case(get_headers($url, TRUE));
    $local=file_get_contents(LOCAL_FILENAME.'.info');
    $distant=$head['last-modified'];
    return $distant==$local;
}

getlib.zip le dépôt

Comme toujours,
c'est aux autres de débugger
les scripts que tu commets, heu... commit...
super.
🗦

Et je vais t avouer un truc  j ai même pas honte   C est même ma marque de fabrique  une genre de  Bronco s touch .jpg

Googol résiste (et ça fait du boulot)

imgbin-computer-icons-avatar-deadpool-desktop-deadpool-pixel-art-x5Gc4h4YnvARncaJgpPeGT2bw.png
La version 4.2 «unban» de Googol est en phase de test et elle m'a pris le pack premium de chez MaximumEffort. Toutefois, ça valait le coup: plutôt que de me contenter de rediriger vers duckduckgo lors du bannissement par google - ce qui arrivait de plus en plus souvent - j'ai opté pour l'utilisation temporaire d'un moteur alternatif à la place de google...

(...)

Plugin pluxml: reposter vers mastodon directement.

icone
Si ça intéresse quelqu'un, voici un plugin dont le but est de reposter automatiquement les billets de pluxml vers un compte mastodon.

pluxml2mastodon utilise le chapô ou le contenu (si le chapô est vide) comme corps de message en le retaillant si nécessaire.

Dans les options, il faudra compléter l'url de votre instance et le jeton de sécurité; vous pouvez également ajouter un message d'en-tête et de pied, si vous le souhaitez.

(...)

RoR - un générateur d'avatars auto-hébergeable en un script

Bon, j'ai un peu tout dit dans le titre... Toutefois, je peux préciser que ce script permet de générer un avatar à partir d'une chaîne de caractères (genre un pseudo, quoi )

Le script utilise les variables $_GET suivantes:

  • str : la chaîne de caractères (obligatoire)
  • sz : la taille souhaitée (par défaut:128)
  • c1 : couleur d'avatar (optionnel, par défaut le script déterminera une couleur en fonction de la chaîne)
  • c2 : pareil que c1 mais pour la couleur de fond.

Du coup Par conséquent, la requête suivante:

index.php?str=Bronco&sz=128&c1=ff0000&c2=00ff00

donnera

avatar généré

et

index.php?str=Bronco

donnera

avatar généré

A noter que lorsque l'avatar est généré, il est sauvegardé dans un dossier avatars/ afin d'éviter de le régénérer à chaque demande.

«Mais comment t'as fait ?» allez-vous me demander d'un ton péremptoire autant que fébrile
Non,non... on s'en fout... en fait.
🗦
PAN
🗦

Donc, le premier problème était d'avoir une pattern pour chaque lettre sur une grille qui ne soit pas trop étendue. Après avoir réfléchi un bon moment, je me suis frappé le front en me disant que la pattern était toute trouvée: l'ordre en binaire de la lettre à encoder...

Second problème, le nombre de lettres et de caractères potentiels m'obligeaient à avoir une grille trop grande (minuscules/majuscules/nombres -> 62 caractères !) 62 en binaire 111110, soient 6 cases x2 pour la symétrie, on se retrouve avec une matrice de 12 x 12... trop à mon goût.

Troisième problème, la taille variable des chaînes potentiellement fournies par l'utilisateur. Il faudrait normaliser ces chaînes avant traitement... pfff.

Illumination: le hash d'une chaîne est toujours de la même longueur... et hash('crc32','blabla'); donne toujours une chaîne de 8 caractères hexadécimaux \o/ : tous les problèmes sont résolus:

  • encodage de 16 caractères (0 à F) : 0000 à 1111.
  • chaîne de longueur fixe quelle que soit les données fournies
    $h1=hash('crc32',$_GET['str']); # pour la génération du dessin et de la couleur 1
    $h2=hash('crc32b',$_GET['str']);#pour la génération de la couleur 2

Il ne reste plus qu'à tracer des carrés de la couleur d'avatar à l'emplacement des 1 et de la couleur de fond à la place des 0.

function drawLine($linenb,$pattern,$size){
    global $image,$couleur_avatar,$couleur_fond;
    for ($i=0;$i<9;$i++){
        $x=$i*$size;
        $y=$linenb*$size;
        if ($pattern[$i]==1){
            imagefilledrectangle ( $image , $x,$y  , $x+$size ,$y+$size , $couleur_avatar );
        }else{
            imagefilledrectangle ( $image , $x,$y  , $x+$size ,$y+$size ,$couleur_fond);
        }
    }
}

Le reste est relativement simple à saisir, je vous mets donc le script complet

<?php 
########################
#                      #
# █████   ████   █████  #
# ██  ██ ██  ██ ██  ██ #
# ██  ██ ██  ██ ██  ██ #
# █████  ██  ██  █████  #
# ██  ██ ██  ██ ██  ██ #
# ██  ██ ██  ██ ██  ██ #
# ██  ██  ████  ██  ██ #
#                      #
########################
# Ror: avatar generator
# @author: bronco@warriordudimanche.net
# howto: use get vars to generate an avatar (once generated, it'll be saved in avatars/ folder)
# ?str=[string] (required)
# ?sz= [integer] avatar's size (opt.) 
# ?c1= [string] avatar's color (opt.)
# ?c2= [string] avatar's background color (opt.)

###############################
#                             #
#  ░░░░  ░   ░░  ░░░░  ░░░░░░ #
#   ░░   ░░  ░░   ░░   ░ ░░ ░ #
#   ░░   ░░░ ░░   ░░     ░░   #
#   ░░   ░░░░░░   ░░     ░░   #
#   ░░   ░░ ░░░   ░░     ░░   #
#   ░░   ░░  ░░   ░░     ░░   #
#  ░░░░  ░░   ░  ░░░░   ░░░░  #
#                             #
###############################

if (!is_dir('avatars')){
    mkdir('avatars');
}
$avatar_filename='';

if (!empty($_GET['c1'])){
    $c1=strip_tags($_GET['c1']);
    $avatar_filename.='-c1='.$c1;
    $c1=separatRGB($c1);
}
if (!empty($_GET['c2'])){
    $c2=strip_tags($_GET['c2']);
    $avatar_filename.='-c2='.$c2;
    $c2=separatRGB($c2);
}
if (!empty($_GET['sz'])){
    $size=intval(strip_tags($_GET['sz']));
}
if (empty($size)){$size=128;}
$avatar_filename='x'.$size.$avatar_filename.'.png';
$dotsize=$size/9;


##################################################################
#                                                                #
# ░░░░░░ ░░  ░░ ░   ░░  ░░░░  ░░░░░░  ░░░░   ░░░░  ░   ░░  ░░░░  #
# ░░     ░░  ░░ ░░  ░░ ░░  ░░ ░ ░░ ░   ░░   ░░  ░░ ░░  ░░ ░░  ░░ #
# ░░     ░░  ░░ ░░░ ░░ ░░       ░░     ░░   ░░  ░░ ░░░ ░░  ░░    #
# ░░░░░  ░░  ░░ ░░░░░░ ░░       ░░     ░░   ░░  ░░ ░░░░░░   ░░   #
# ░░     ░░  ░░ ░░ ░░░ ░░       ░░     ░░   ░░  ░░ ░░ ░░░    ░░  #
# ░░     ░░  ░░ ░░  ░░ ░░  ░░   ░░     ░░   ░░  ░░ ░░  ░░ ░░  ░░ #
# ░░      ░░░░  ░░   ░  ░░░░   ░░░░   ░░░░   ░░░░  ░░   ░  ░░░░  #
#                                                                #
##################################################################

function separatRGB($color){
    $color=str_replace('#','',$color);
    if (strlen($color)==3){
        $color=$color[0].$color[0].$color[1].$color[1].$color[2].$color[2];
    }
    $RGB=array();
    $RGB['r']=hexdec(substr($color, 0,2));
    $RGB['g']=hexdec(substr($color, 2,2));
    $RGB['b']=hexdec(substr($color, 4,2));  
    return $RGB;
}

function drawLine($linenb,$pattern,$size){
    global $image,$couleur_avatar,$couleur_fond;
    for ($i=0;$i<9;$i++){
        $x=$i*$size;
        $y=$linenb*$size;
        if ($pattern[$i]==1){
            imagefilledrectangle ( $image , $x,$y  , $x+$size ,$y+$size , $couleur_avatar );
        }else{
            imagefilledrectangle ( $image , $x,$y  , $x+$size ,$y+$size ,$couleur_fond);
        }
    }
}



###########################################################
#                                                         #
#  ░░░░  ░░░░░░ ░   ░░ ░░░░░░ ░░░░░   ░░░░  ░░░░░░ ░░░░░░ #
# ░░  ░░ ░░     ░░  ░░ ░░     ░░  ░░ ░░  ░░ ░ ░░ ░ ░░     #
# ░░     ░░     ░░░ ░░ ░░     ░░  ░░ ░░  ░░   ░░   ░░     #
# ░░ ░░░ ░░░░░  ░░░░░░ ░░░░░  ░░░░░  ░░░░░░   ░░   ░░░░░  #
# ░░  ░░ ░░     ░░ ░░░ ░░     ░░  ░░ ░░  ░░   ░░   ░░     #
# ░░  ░░ ░░     ░░  ░░ ░░     ░░  ░░ ░░  ░░   ░░   ░░     #
#  ░░░░  ░░░░░░ ░░   ░ ░░░░░░ ░░  ░░ ░░  ░░  ░░░░  ░░░░░░ #
#                                                         #
###########################################################
if (!empty($_GET['str'])){
    $h1=hash('crc32',$_GET['str']);
    $h2=hash('crc32b',$_GET['str']);

    if (empty($c1)){$c1 = separatRGB($h1);}
    if (empty($c2)){$c2 = separatRGB($h2);}

    $s=$h1.$h2[0];
    $file='avatars/'.$s.$avatar_filename;
    if (is_file($file)){
        header ("Content-type: image/png");
        exit(file_get_contents($file));

    }

    $image = @ImageCreate ($size, $size) or die ("Erreur lors de la création de l'image");
    $couleur_fond   = ImageColorAllocate ($image, $c1['r'], $c1['g'], $c1['b']);
    $couleur_avatar = ImageColorAllocate ($image, $c2['r'], $c2['g'], $c2['b']);

    $a[dechex(0)]='000010000';
    $a[dechex(16)]='111111111';

    for ($i=1;$i<=15;$i++){
        $bin=decbin($i);
        $bin=str_repeat('0', 4-strlen($bin)).$bin;
        $a[dechex($i)]=$bin.'1'.strrev($bin);
    }



    for ($i=0;$i<9;$i++){
        drawLine($i,$a[$s[$i]],$dotsize);
    }

    header ("Content-type: image/png");

    ImagePng($image,$file);
    chmod($file,0644);
    ImagePng($image);
}


?>

Le script est téléchargeable ici

(...)

C'est con, j'ai ri 4

Pour celles et ceux qui en ont marre de leur semaine, de la météo, de la politique, des affaires, des gens qui tuent leurs conjoints alors qu'ils faisaient genre «chuis trop inquiet sur la vie de ma reum», du code du travail, des inondations, qu'on leur parle de la Seine ou des nichons de la famille Kardachiants, voici un Dump du Dredi: attention, c'est con (mais j'ai ri )

(...)

Go ! - un raccourcisseur d'URL

Il y a quelques jours, j'ai eu à filer un lien vers un travail à mes élèves, j'avais donné un qrcode mais, bien entendu, la plupart ne savait même pas de quoi il s'agissait et ne disposaient de toutes façons pas de l'appli; les voilà donc partis pour taper l'url dans le navigateur, pour ceux qui savaient ce que c'était, ou dans la recherche google pour les autres ...

Or, facteur aggravant, l'URL était longue et alambiquée ce qui, pour des mômes qui ont la capacité de rétention d'un bulot cuit, constituait déjà un challenge qui aurait à lui seul pu subir une évaluation notée.

GrosJean comme devant, je me promets in petto de coder à l'arrache un raccourcisseur d'url perso, histoire de ne plus perdre 22 minutes à attendre que tout le monde ait tapé les bons caractères dans le bon ordre et dans la bonne case...

Donc, voilà, c'est fait.

capture

C'est très minimaliste, fait à l'arrache, mais ça fonctionne: la page d'accueil contient une case pour taper l'url à raccourcir et une autre si vous voulez spécifier un code particulier (sinon, il génère au hasard): si vous précisez un code qui existe déjà, il écrasera l'ancien.

Voir la démo Télécharger le zip

C'est publié sous licence faisCeQueTuVeuxMaGueule (n'hésitez pas à virer le lien du footer si vous voulez )

[plugin] MyStaticStartPage : rediriger vers une page d'accueil hors de PluXML

Il y a quelques temps Cyrille Borne s'est fait une page d'accueil qui lui permettait de rediriger les visiteurs vers les différentes parties de son site, pluXML n'en constituant que la section Blog. Si je me souviens bien, il a un peu galéré à cause de la redirection de son blog vers https://cyrille-borne.com/pluxml qui avait cassé les liens de ses lecteurs vers son flux RSS.

Je me suis alors dit, ben pourquoi pas moi ?! Seulement, je me voyais pas galérer de la même façon. Donc, j'ai fait un plugin... Un tout chti: là on est sur du (je déteste cette expression pour VRP) made in 5 minutes... c'est simple, j'ai passé plus longtemps sur la rédaction de ce billet que sur la réalisation du plugin...

Donc, en gros, vous précisez dans la config l'adresse de la page servant d'accueil extérieur et c'est tout: le site ne redirige vers cette page que si on vient de l'extérieur et qu'on cherche à accéder à la page root du site.

Je n'ai pas constaté que ça ait cassé quoi que ce soit chez moi, mais bon, la journée n'est pas terminée

Téléchargez le zip

ma page d'accueil

Unicode - html

J'ai mis à jour la page unicode.warriordudimanche.net pour ajouter la quantité de caractères qui manquaient.
J'ai un peu recodé pour pouvoir faire des packs avec les listes qui ne se suivent pas (genre les maths, 4 packs ), j'ai ajouté un favicon et j'ai un peu changé le look...


Si ça intéresse kékin, ben c'est par là : http://unicode.warriordudimanche.net/
(le github: https://github.com/broncowdd/unicode_page )

Au passage, petit message à Cyrille qui ne manquera pas de grogner à propos de Bozon3:





[Plugin] Tag Editor: mettre de l'ordre dans les tags de pluXML

Je viens de m'apercevoir que j'ai omis de partager un plugin que j'avais fait pour mettre de l'ordre dans les tags de mes articles...

C'est tout con mais ça permet de faire le taf simplement.

capture Une fois le plugin activé, un lien apparaît dans le menu admin. Sur la page dédiée, les tags sont listés en deux colonnes: celle de droite permet de faire les modifications. Pour effacer un tag, effacez-le de la colonne de droite et sauvegardez...

Allez, amusez-vous et allez dans le pet du saigneur.

Tags_editor.zip

Galart: plus simple, comme galerie, spapossib' (plugin pluXML) [EDIT]

Comme ma moitié galérait avec son site de portfolio/galerie-usine à gaz, je lui ai proposé de monter un petit pluXML avec un plugin que je lui goupillerais entre deux tâches parentales, en mode charrette (mon favori)

Donc, prenant mon courage à deux mains et mon clavier, j'ai bricolé ça dans la journée.

Il s'agit d'un plugin volontairement minimaliste: il permet simplement de lier un dossier contenant des images (contenu dans le dossier data/images) à un article.

Lors de l'affichage dudit article, la galerie sera générée et ajoutée en fin d'article automatiquement et sans aucune autre intervention.

Une page de config, minimale elle aussi, permet de fixer la taille des miniatures (à configurer avant utilisation)

EDIT du 23/08

J'ai appliqué les modifs proposées par JerryWham et j'ai ajouté un flux rss pour la galerie: chaque article contenant une galerie propose le lien rss vers le contenu du dossier.

Télécharger Galart.

C'est très perfectible, mais bon, pour le moment, je peux pas mieux

Exemple de galerie:

RSS
Fil RSS des articles