Classe PHP pour GD + API: Scriptopic

Il y a quelques jours, lassé de reprendre à zéro à chaque fois que je dois faire un truc avec GD sur PHP, je me suis dit que je pouvais faire une classe pour ça. Comme, exceptionnellement, j'avais un peu moins de deux heures de tranquillité, je m'y suis collé.

Au bout du compte, une fois la classe codée, il faut bien la tester...😬

drame.jpeg

C'est le problème des codeurs : ils ont du mal à arrêter de coder 🤩. Du coup, me voilà en route pour un script exploitant pictools.php... et ce qui aurait du prendre deux heures a pris plusieurs jours de papa codeur (petit rappel: 1 h de papa codeur = 7,2 heures de codeur normal en zone de guerre, au cours actuel 💣)

Bref, j'ai donc pondu une «api» avec un frontend permettant d'appliquer des transformations à une image à partir de son URL.

😎 petite image, long discours, toussa.

Capture du 2022-07-04 21-43-27.png

Donc, on fournit l'URL de l'image puis on ajoute des actions les unes à la suite des autres. Certaines n'ont pas besoin de paramètres (emboss, sepia etc) et d'autres si (contrast, resize etc)

Quand on clique sur un bouton action, on ajoute cette action à la liste avec, le cas échéant, l'input qui va bien pour les paramètres avec un placeholder de rappel.

Ainsi, on peut resize l'image à une taille précise ou à un pourcentage de la taille normale: tous les paramètres de coordonnées et de taille peuvent être précisés en pixels ou en pourcentages.

De plus, si on veut redimensionner l'image à une largeur en conservant le ratio automatiquement, il suffit de mettre -1 à la place de la hauteur: le script se démerdera tout seul.

La config ci-dessus donne le résultat ci-dessous:

pexels-photo-67818-large-758x505.jpeg

L'image d'origine

result.jpeg

Le résultat donné par scriptopic

Mais c'est pas tout

Donc, scriptopic permet de retoucher une image automatiquement. OK.👍

Mais cette image est utilisable directement depuis son URL de génération: si on colle l'URL précisée dans le cadre résultat, ça fonctionne. Avec un peu d'habitude, on peut le faire en direct (genre pour une image d'en-tête...). Comme les images retouchées sont sauvegardées avec un hash de l'url de requête, si on l'appelle à nouveau, elle ne sera plus générée mais simplement renvoyée (visible soulagement du serveur )

Et aussi

Comme des fois on a la flemme de faire une balise image, Scriptopic vous la donne directement: un double-clic et c'est copié prêt à coller...

Mais ce n'est toujours pas tout... (vous êtes gâtés)

Un truc rigolo, c'est que, comme pour Stamp, le front de scriptopic génère un bookmarklet en temps réel (c'est la deuxième ligne du cadre résultat): une fois satisfait de votre script, le bookmarklet généré permet de l'appliquer à l'image en cours: vous ouvrez l'image dans un onglet et clic-clac merci kodak.

Si vous voulez simplement envoyer l'image en cours pour travailler dessus, le bookmarklet de base est dispo en footer.

Atta atta, pars pas j'ai pas fini

Histoire d'ajouter encore une feature, vous pouvez stocker des scripts, à la main, dans le dossier ... scripts/ . Vous utiliserez le nom du fichier dans l'url avec ?script=[nomdefichier]

Ainsi, en sauvant le json de l'exemple (cadre «Script au format JSON») dans un fichier scripts/sepia.json vous pouvez ensuite l'appeler avec&script=sepia

Vous pouvez vous faire une bibliothèque de scripts pour tout et les appeler directement au lieu de vous taper du json dans l'URL

Tout est expliqué dans l'aide : https://api.warriordudimanche.net/scriptopic/?help

Hé m'sieu m'sieu:  pourquoi à la main ?  C'est mieux avec un  ptit bouton pour sauver  le script, non?

Ben parce que pour sauver sur le serveur, il faudrait un compte admin, donc un espace sécurisé et tout le toutim... et là, on parle pas du même projet

En conclusion

Le bouzin est testable là: https://api.warriordudimanche.net/scriptopic/

Et téléchargeable ici: https://api.warriordudimanche.net/scriptopic/?download

Je n'ai pas nettoyé le code, vu que je subis un harcèlement constant à la maison (lol), mais je le ferais, promis ! Le tout est en beta à l'arrache en licence amusez-vous avec.

Je n'ai pas encore écrit de doc pour pictools_class.php qui se trouve dans le zip, mais c'est assez simple à utiliser et chaque méthode est «documentée»


$picture=new pictool();// on peut mettre un array contenant les valeurs initiales des attributs : ['format'=>'png'] par exemple)
$picture->load('www.moncul.sur/la_commode.jpeg');
$picture->contrast(20);
$picture->sepia();
$picture->save("fichier.jpeg");
$picture->display();

Le script matrix qui alterne sketch et gaussian à plusieurs reprises puis colorise en vert

Pas flippant du tout.

Todo

  • Débugger, vu que ça va se dévoiler à l'usage plus intensif
  • ajouter le listage et l'usage des scripts sauvegardés dans le front.

Note de service: Sortie de de crashweb.org de ma river

Gros gros +1

La liberté d'expression ce n'est pas avoir le droit de gueuler partout - et en particulier chez les autres - impunément et sans conséquences.

De plus, la liberté d'expression de gens qui n'attendent qu'une occasion de limiter drastiquement celle des autres, on s'en torche.

Liberté d'expression = responsabilité d'expression et != d'obligation de publication et d'écoute.

Allez bien bouffer vos morts les fachos.

Via http://2038.net/links/

Stamp v1.0

Dans la catégorie débranchement de cerveau, je vous propose une appli vigoureusement inutile mais totalement défoulatoire: Stamp.

Cette appli/api vous donne la possibilité d'ajouter un tampon sur une image en un minimum d'opérations. Ainsi, vous pourrez passer :

de ça

1.jpg

à ça

2.jpeg

A partir du frontend

En partant de là : https://api.warriordudimanche.net/stamp/ vous remplissez l'URL et le texte, vous validez et hop.

Capture du 2022-06-22 17-18-14.png

Mais aussi avec le bookmarklet

Comme toujours, le bookmarklet vous permet d'envoyer l'URL courante à Stamp: ouvrez l'image dans un nouvel onglet et cliquez sur le bookmarklet.

pour les plus observateurs

Bande de coquins, vous avez sans doute remarqué un autre bookmarklet à côté du premier... c'est un bookmarklet dynamique: grâce à lui vous pouvez créer des bookmarklets avec un texte spécifique.

Par exemple, si vous envisagez d'utiliser souvent le tampon «dans ton cul», pourquoi le retaper à chaque fois ? Glissez ce lien dans la barre de favoris et let's the fun begins !

Comme d'hab

Fait à l'arrache, interrompu toutes les minutes mais avec amour, dévotion à l'absurdité du monde et mon ordi.

PHP: “JPEG library reports unrecoverable error: Not a JPEG file: starts with 0x89 0x50” Error Solved – An Exploring South African

Tiens, je ne savais pas que la bibliothèque GD avait une fonction imagecreatefromstring() qui permet de créer une ressource image à partir d'une chaîne.

C'est très utile dans le cas où on récupère une image via une URL sur un site et qu'on veut lui appliquer un traitement.

En effet, quand on veut faire ça «normalement», on a recours à imagecreatefrom[FORMAT] (imagecreratefromPng() par exemple), ce qui oblige à connaître l'extension ou au moins le type mime de l'image... et des fois, ça couille : l'URL ne contient pas l'extension ou alors il y a des paramètres GET dedans, bref, ça fait chmir.

Avant, je partais vers la récupération de l'extension du fichier pour appeler la fonction adaptée... c'est chiant, sale et pas parfait comme solution (bugs de nom et besoin de télécharger localement l'image sous forme de fichier)

$downloaded_pic=file_get_contents($url);
file_put_contents($local_path_pic,$downloaded_pic);
$ext=pathinfo($url)['extension'];
$fun=$ext=='jpg'?'jpeg':$ext;
$function_name='imagecreatefrom'.$fun;
$img  = $function_name($local_path_pic);

Heureusement

Avec imagecreatefromstring(), ça passe tout seul, c'est plus propre, plus lisible et surtout, pas besoin du type de l'image ou d'un fichier local...


if ($downloaded_pic=file_get_contents($url)){
    $image=imagecreatefromstring($downloaded_pic);
}else{
    exit("Erreur de téléchargement de l'image");
}

On peut même récupérer les dimensions de l'image avec un équivalent de getimagesize() : getimagesizefromstring() !

Appli: Metabook - search ebooks on multiple websites

Parfois un pouet sur Mastodon pour partager une URL et une idée concorde avec un truc que t'avais déjà fait : https://framapiaf.org/@bronco/108423992250980547

Ainsi, Gilles me fait passer une adresse de métamoteur de recherche d'ebooks ( https://recherche-ebook.fr/ ) tout en notant que ce serait bien de faire une version qui soit plus propre... (pas de JS, de redirections, de pubs etc..)

therese.jpeg

écoutez Thérèse, comme la vie est savoureuse, n'est-ce pas...

Il se trouve que je m'étais fait un script dont le but était justement de charger des urls, de les parser, de récupérer et d'organiser du contenu.

Ça s'appelle Slurp
Pour faire simple, on crée des «profils» correspondant à une série d'URL avec la regex de parsing et le template correspondants. Il suffit alors d'appeler le profil pour obtenir une page de résultats mise en forme.

Comment ça marche ?

  1. on accède au script : ?p=<profil>
  2. slurp accède au fichier de configuration du profil dans packs/<profil>.php
  3. pour chaque url du pack, il charge la page, la parse, met en forme les données dans le template

Le pack est un array du type:

$packs['<profil>']=[
    [
        'url'=>'http://urltoparse.com/',
        'pattern'=>'REGEX PATTERN with (?<name>..) capture',
        'template'=>'<li> HTML Template where data is inserted to : use %name% '
    ],
    [
        'url'=>'http://urltoparse.com/',
        'pattern'=>'REGEX PATTERN with (?<name>..) capture',
        'template'=>'<li> HTML Template where data is inserted to : use %name% '
    ],

];

Dans le template de chaque url,

  • on peut utiliser %variable% pour placer les captures regex : (?<title>[^"]*?)%title%
  • deux variables sont toujours accessibles:
    • %ROOT% pour accéder à l'url du pack
    • %DOMAIN% pour accéder au domaine de cette url (pour compléter une URL relative par exemple)
Ya plus qu'à   adapter

J'ai ajouté la possibilité de créer un dossier au nom du pack contenant un header et un footer pour qu'on puisse faire un site à partir d'un profil. packstemplates/<profil>/

J'ai ensuite créé un pack contenant les principaux sites d'epubs, cherché les patterns regex...

Et voilà: metapub cherche sur six sites en même temps: http://slurp.warriordudimanche.net/?p=ebook

meta.jpg

Comme d'hab

  1. c'est fait à l'arrache, mais vous avez l'habitude
  2. c'est cadeau, faites-en ce que vous voulez: avec slurp, vous pouvez parser les sites que vous voulez (warez, catalogues, porno... )
  3. vous pouvez installer slurp sur votre serveur et adapter le pack ebook au fur et à mesure que des changements se font (domaine, html de la page etc)
  4. vous pouvez télécharger slurp avec le pack ebook ici: http://slurp.warriordudimanche.net/?download

A venir ?

  • On peut déjà commencer par faire une UI moins dégueu, ce sera pas mal
  • slurp permet de récupérer le résultat en json mais le RSS n'est pas encore implémenté...
  • ajouter des sites... et les maintenir.

Enjoy !

Arnaud Bontemps (@arnaudbontemps): #Parcoursup : ce soir, environ un lycéen sur deux ne recevra aucune proposition d'affectation.

Un fil sur parcoursup, son algo et ses dégâts trouvé sur Masto ( https://mamot.fr/@talou/108412157847358211 )

TLDR

  • l'algo de parcoursup ne permet pas de hiérarchiser les voeux
    • ➜ moins efficace qu'APB
    • ➜ reporte le travail sur les lycéens et leur famille
    • ➜ on maintient les lycéens dans l'attente de voir les rangs bouger dans les listes d'attente ⮕ STRESS CONTINU
    • ➜ mauvaise image de soi à cause du fait que les «meilleurs» laissent des miettes
    • ➜ on ne sait plus si l'affectation correspond aux voeux réels
  • l'algo de parcoursup introduit de la sélection jusque dans les filières non sélectives à la base (la fac)
    • ➜ les profs du supérieur paramètrent 15000 algo locaux pour classer les étudiants
    • ➜ ces choix se font dans l'opacité totale et sans logique réelle
    • ➜ on perd du temps pédagogique au lycée à rédiger des lettres de motiv et autres conneries (équivalent à 2000 enseignants à temps plein sur l"année)
    • ➜ on désorganise totalement le lycée
    • ➜ on rejette la responsabilité de la non sélection sur le lycéen

      A retenir chers lycéens:

  • C'est pas votre faute
  • le classement c'est du bullshit
  • on pouvait faire autrement

My two cent

Ma grande est en plein dedans. Déjà, je suis incapable de piger le merdier du bouzin: des options choisies par stratégie plus que par goût à l'inscription sur parcoursup, c'est mon épouse qui s'est pris la tête là-dessus et heureusement... J'en étais incapable.

Ma môme est une bonne, voire très bonne élève, félicitée à tous les conseils de classe, soucieuse de réussir, avec un avis extrêmement favorable. Ben elle n'a rien pour le moment: liste d'attente partout. Et elle stresse énormément depuis le début du lycée: elle est même passée par une phase de dépression pour laquelle elle prend encore des AD.

Dans son lycée, ils sont extrêmement nombreux dans son cas, dépressifs chroniques, anxieux, angoissés...

Je me souviens de mes années de lycée puis de la fac... C'étaient de belles années malgré tout. Quels souvenirs leur restera-t-il ?

Arnaud Bontemps  Parcoursup   ce soir, environ un  .jpg

Feather Wiki

Un wiki en une page html qui contient aussi l'éditeur permettant de le modifier (ajout/edition de pages, markdown etc) pour moins de 60ko.

Bim !

Via https://sebsauvage.net/links/ & http://nicolas-delsaux.hd.free.fr/Shaarli/?PenQ-A

What I wish I knew about React

Une lecture à faire avant de se lancer dans une formation React. ( https://www.youtube.com/watch?v=SMgQlTSoXf0&list=PLjwdMgw5TTLWom67YfZuha-1iYzIirwJR )

Quelques notes:

  • React est une bibliothèque, pas un framework.
  • React est une lib UI: elle sert à designer et rendre réactive des interfaces utilisateur. Si ce que tu veux faire ne s'affiche pas à l'écran, React s'en bat les steaks.
  • AngularJS change ta manière de coder en JS mais pas tes pratiques en HTML/CSS alors que React fait le contraire: peu de changement côté JS (hors le code spécifique de ton UI) mais modifie ta façon de créer en HTML/CSS.
  • Les composants React sont toujours des composants UI

The Cicada Principle, revisited with CSS variables – Lea Verou

Créer une impression de hasard (dans les formes, couleurs ou tout ce qui peut être stylé en css) en utilisant :nth-of-*() pour changer des variables css.

En utilisant assez de variables et en utilisant des nombres premiers pour nth-of, on donne l'illusion de la randomisation. Intéressant.

Plusieurs applications dans l'article.

HTML Drag and Drop API - Web APIs | MDN

Merci @Timo pour ce résumé qui explique bien des déboires personnels avec le Drag&drop.

Je me résume ça ici:

  1. un élément acceptera un 👉drop et déclenchera ⚡ondrop si et seulement si l’élément a un ⚡onDragEnter ET un ⚡onDragOver.
  2. 🔧event.target != 🔧event.currentTarget: event.target est l'objet qui reçoit l'événement alors que event.currentTarget est celui quel les gestionnaires d'événements sont attachés et ils peuvent être différents dans le cas d'objets imbriqués.
Via https://lehollandaisvolant.net/?mode=links

Teamvieux Old days comics

Yo la #teamvieux fan des BD marvel de notre enfance ? (nova, strange,spécial strange) ?

specialstrange01.jpg

https://www.extreme-down.io/ebooks/comics/93857-spgcial-strange-115-tomes.html

Couv437398.jpg

https://www.extreme-down.io/ebooks/comics/93856-nova-235-tomes.html

strange01couv.jpg

https://www.extreme-down.io/ebooks/comics/93848-strange-353-tomes.html

Couv132144.jpg

https://www.extreme-down.io/ebooks/comics/93862-marvel-les-grandes-sagas-8-tomes.html

c'est #cadeau

Le "réflexe du cintre" est... surprenant !

En dehors du réflexe lui-même, je trouve très didactique la méthode d'observation employée.

Pour ma part, je fais partie des «cintrés»...

Pardon pour ça...

...et je dirai qu'ils s'agit moins d'un réflexe que d'une envie inexpliquée de tourner la tête: on ressent un vif besoin, un peu comme une démangaison te donne envie de gratter, mais ce n'est pas incoercible. Ce qui est troublant, c'est que l'envie démarre dès la pose du cintre au bon endroit et s'arrête dès qu'on le retire.

Fil RSS des articles de cette catégorie