Une bibliothèque de plus de 3000 éléments d'UI...
Je mettrais mon nez là-dedans un jour... il doit y avoir beaucoup à apprendre rapidement en auditant ces snippets...
Un jour...
Je me note ici pour une prochaine fois parce que fetch n'est pas forcément très intuitif...
fetch("index.php", { method: 'POST', body: formData })
.then((response)=>{
// on attend l'arrivée de la réponse et on la traite
return response.text(); // ou response.json();
})
.then((text)=>{
// on attend la fin du traitement de la réponse et on en traite le contenu
console.log(text);
});
En gros, on crée une fonction asynchrone pour pouvoir utiliser les await.
const fetchAPI = async(URL) => {
const response = await fetch(URL); // on attend l'arrivée de la réponse
const data = await response.json(); // on attend la fin du traitement de la réponse
console.log(data)
}
fetchAPI("https://jsonplaceholder.typicode.com/todos/1")
Oh ! Bon à savoir, ça: un médiateur gratuit qui permet de régler les conflits à l'amiable:
De côté pour plus tard... Une reset.css plus moderne... Je me contentais du box-sizing depuis son avènement.
Les explications associées sont intéressantes.
/* Box sizing rules */
*,
*::before,
*::after {
box-sizing: border-box;
}
/* Prevent font size inflation */
html {
-moz-text-size-adjust: none;
-webkit-text-size-adjust: none;
text-size-adjust: none;
}
/* Remove default margin in favour of better control in authored CSS */
body, h1, h2, h3, h4, p,
figure, blockquote, dl, dd {
margin: 0;
}
/* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
ul[role='list'],
ol[role='list'] {
list-style: none;
}
/* Set core body defaults */
body {
min-height: 100vh;
line-height: 1.5;
}
/* Set shorter line heights on headings and interactive elements */
h1, h2, h3, h4,
button, input, label {
line-height: 1.1;
}
/* Balance text wrapping on headings */
h1, h2,
h3, h4 {
text-wrap: balance;
}
/* A elements that don't have a class get default styles */
a:not([class]) {
text-decoration-skip-ink: auto;
color: currentColor;
}
/* Make images easier to work with */
img,
picture {
max-width: 100%;
display: block;
}
/* Inherit fonts for inputs and buttons */
input, button,
textarea, select {
font: inherit;
}
/* Make sure textareas without a rows attribute are not tiny */
textarea:not([rows]) {
min-height: 10em;
}
/* Anything that has been anchored to should have extra scroll margin */
:target {
scroll-margin-block: 5ex;
}
Deuxième épisode de mes notes perso sur la bibliothèque Image magic pour évoquer la classe ImagickDraw qui, comme son nom l'indique, permet de dessiner avec Imagick. ( 1er épisode )
On va se limiter à des usages basiques parce que la lecture du sommaire suffit à imaginer des possibilités certes alléchantes mais totalement hors de propos en ce qui me concerne (courbes de bézier etc)
Spoiler: c'est nettement moins intuitif et simple que pour le traitement d'image... l'écart entre Imagick et GD dans le domaine du tracé n'est plus si évident: ça mériterait de faire un classe pour simplifier tout ça... ( /me se jette sur son bujo pour griffonner spasmodiquement)
Cette classe crée un objet servant d'instructions à appliquer ensuite à un objet Imagick.
On partira du principe que vous avez fait des instances des classes comme suit:
$im=new Imagick(); # l'image dans laquelle vous allez appliquer l'objet ImagickDraw
$draw=new ImagikDraw();
$draw->setFont(fonte);
: sélectionne la fonte à utiliser$draw->setFontSize(taille);
: définit la taille en pixels$draw->setFillColor(couleur);
: définit la couleur de fond (normalement, couleur est un objet ImagickPixel, voir 1er épisode mais on peut passer une chaîne au format de couleur CSS )$draw->setTextAlignment(alignement);
: une des constantes d'alignement imagick::ALIGN_LEFT imagick::ALIGN_CENTER Imagick::ALIGN_RIGHT
$draw->setTextDecoration(decoration)
: une des constantes de décoration imagick::DECORATION_UNDERLINE imagick::DECORATION_OVERLINE imagick::DECORATION_LINETROUGH
et bien d'autres (comme du... bruit ?!).$draw->setTextAntialias(true);
: ajouter de l'antialias$draw->setTextInterwordSpacing(taille)
$draw->setTextInterlineSpacing(taille)
$draw->annotation(x,y,texte)
: trace un texte dans la police sélectionnée$im->annotateImage( $draw, 0, 0, 0, $fontName );
: ajoute le texte à l'image.$im->queryFonts($pattern = "*")
🆒 on peut filtrer avec une pattern à la façon de glob().$im->queryFontMetrics($draw, text);
on récupère un tableau comme ci-dessous
Array
(
[characterWidth] => 9
[characterHeight] => 9
[ascender] => 9 # la taille au-dessus de la baseline
[descender] => -2 # la taille sous la baseline
[textWidth] => 71
[textHeight] => 10
[maxHorizontalAdvance] => 12
[boundingBox] => Array
(
[x1] => 0
[y1] => -2
[x2] => 6.890625
[y2] => 7
)
[originX] => 70
[originY] => 0
)
$draw->setStrokeOpacity(0-1);
$draw->setStrokeColor(couleur);
$draw->setStrokewidth(nb);
$draw->setStrokeDashArray()
Le motif semble être plein de possibilités car on peut le définir très spécifiquement et même utiliser une image comme motif (->setStrokePatternURL)$draw->setFillColor(couleur);
$draw->circle ($x, $y, $x + $r, $y);
$draw->ellipse($ox,$oy,$rx,$ry,$start,$end);
$draw->point ($x, $y);
$draw->polygon ($tableau_de_coordonnées);
: array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) $draw->polyline ($tableau_de_coordonnées);
: array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) $draw->rectangle ($x, $y, $x2, $y2);
) $draw->roundRectangle ($x, $y, $x2, $y2,$rayonx,$rayony);
Pour écrire un texte dans une image:
$text='pipo et mollo';
$im=new Imagick();
$draw=new ImagickDraw();
//var_dump($im->queryFonts('*'));exit;
$draw->setFont( 'Courier' );
$draw->setFontSize( 20 );
$draw->setFillColor( 'black' );
$draw->setTextAntialias(true);
$metrics = $im->queryFontMetrics($draw, $text);
$draw->annotation(0,$metrics['ascender'],$text);
$im->newImage( 300, 20, 'lightblue');
$im->drawImage($draw);
$im->setImageFormat( 'png' );
header('Content-type: image/jpeg');
exit($im);
ce qui donne cette image
Il serait intéressant de pousser les tests mais là, j'ai pas le temps...
Peut-être reprendrais-je des trucs existant avec tout ça ( scriptopic, RoR, Stamp mematic etc etc.)
Allez, pour une fois, j'ai un peu de temps devant moi, je vais éplucher un peu la lib Image magick dont je parlais il n'y a guère...
Simple: pas besoin de plusieurs fonctions selon le format, il suffit de $images = new Imagick('image.jpg');
Même pas nécessaire de passer par un foreach, on fournit le tableau des fichiers voire directement un glob: $images = new Imagick(glob('images/*.JPG'));
$im->writeImage('image.jpg');
Si on laisse une dimension à 0, les proportions sont conservées (quand tu vois la merde que c'est avec GD !)
$image->thumbnailImage(100, 0);
header('Content-type: image/jpeg');
$image = new Imagick('image.jpg');
# ici on effectue un traitement puis on sort le résultat
echo $image;
$im->getImageWidth() $im->getImageHeight()
$im->getImageFormat()
$im->setImageFormat('png');
! 😍$im->NewImage(largeur,hauteur,couleur de fond);
Comme pour GD, il faut créer un objet couleur dans les traitements d'image, mais c'est plus simple qu'avec GD (et plus complet): il suffit de passer une couleur selon les normes CSS. Du coup, la transparence n'est pas gérée par une connerie de paramètre «alpha» mais simplement par ... rgba()... 💖
$couleur=new ImagickPixel("white");
$couleur=new ImagickPixel("#FFF");
$couleur=new ImagickPixel('rgb(255,255,200)');
$couleur=new ImagickPixel('rgba(255,255,200,0.5)');
🆒 ⮕ Ça peut paraître compliqué, mais en fait, dans les fonctions où on est sensé utiliser ImagickPixel, je me suis aperçu qu'on pouvait tout simplement passer une string contenant la couleur css... elles se démerdent seules. 😍
$im->borderImage(new ImagickPixel("white"), 5, 5);
$im->setFont("example.ttf");
$im->negateImage(0);
$im->normalizeImage();
$im->autoLevelImage();
$im->gammaImage(5);
$im->contrastImage(niveau)
$im->brightnessContrastImage(niveau luminosite, niveau contraste);
$im->equalizeImage()
$im->colorizeImage("red",0.5);
🤬 pas réussi à l'utiliser pour ce test...$i->resizeImage(250,0,Imagick::FILTER_POINT,0);
$im->cropImage(200,200,50,50);
$im->flipImage()
pour retourner horizontalement$im->flopImage()
pour retourner verticalement$im->rotateImage(new ImagickPixel('#00000000'), 75);
$im->->setImageOpacity(0.3);
$im->blurImage(5,2);
$im->gaussianBlurImage(5,2);
$im->motionBlurImage(5,5,45);
$im->posterizeImage(5,0);
`$im->addNoiseImage(imagick::NOISE_GAUSSIAN );
voir les constantes de type de bruit $im->sketchImage(rayon, deviation, angle);
$im ->charcoalImage(rayon, deviation);
$im->->shadeImage(1, 90, 2); # emboss + image grisée
$im->shadeImage(0, 90,2) # emboss sur l'image d'origine (couleur)
$im->oilPaintImage(5);
$im->edgeImage(5);
$im->waveImage( 10, 10);
$imageclonee=$image->clone();
$im->compositeImage($autreimage, imagick::COMPOSITE_OVER, 0, 0);
(la composition, la façon de mélanger les images, peut être une de celles-ci https://www.php.net/manual/fr/imagick.constants.php#imagick.constants.compositeop)Image Magick me semble particulièrement bien nommée tant les possibilités sont énormes et la simplicité d'utilisation étonnante: on sent une volonté de se simplifier la vie lors de l'utilisation... c'est juste beau.
Je voulais mettre une image de chaque effet dans les descriptions mais:
Ma version à jour de la page de Timo
sudo apt update && sudo aptitude safe-upgrade
sudo apt-get install apache2 php libapache2-mod-php php-json php-zip php-gd php-sqlite3 sqlite php-curl php-mbstring php-xml sqlitebrowser gparted filezilla python3 sublimetext vlc kdeconnect
sudo apt purge hexchat hexchat-common libespeak1 libsonic0 libspeechd2 python3-speechd speech-dispatcher speech-dispatcher-audio-plugins gnome-orca mate-screensaver mate-screensaver-common brltty mono-runtime-common avahi-daemon xscreensaver-data-extra xscreensaver-data xscreensaver-gl-extra xscreensaver-gl java-common icedtea-netx-common pix pix-data onboard timeshift
Le fichier se trouve dans /etc/php/NUMERO DE VERSION PHP/apache2/php.ini. Soit on l'ouvre via le terminal, soit on utilise l'éditeur de son choix.
On édite les lignes suivantes:
post_max_size = 20M
upload_max_filesize = 1000M
error_reporting = -1
display_errors = On
zend.multibyte = On
Pour limiter le nombre de processus de php, on ajoute à la fin
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 1
MaxSpareServers 3
MaxClients 12
MaxRequestsPerChild 3
</IfModule>
sudo ln -s ~/www /var/www
Puis, on relance le serveur: sudo service apache2 restart
sudo iw reg set FR
timedatectl set-local-rtc 1 # mettez 0 pour la remettre sur UTC
Tiens, il existe une API qui permet de transformer du texte en Bionic Reading, cette technique améliorant la lecture en mettant en gras le début du mot. Je m'interrogeais justement sur la pertinence d'implémenter ça sur mon appli de documents en espagnol pour les élèves éprouvant des difficultés de lecture...
Bon, il faudra que je fasse une couche d'interface afin que les données des élèves ne transitent pas vers le site de l'API, comme pour celle de synthèse vocale... mais rien de trop ardu.
A creuser.
Depuis quelques jours, un truc étrange s'est manifesté sur mon ordi portable: les dossiers Document, Images, Téléchargement, Bureau avaient tous été déplacés dans un sous-dossier à ouatmille niveaux sans aucune raison visible...
Au cas où ça vous arrive, remettez-les à leur place (en drag drop ou via le terminal) puis éditez le fichier : ~/.config/user-dirs.dirs
pour rétablir les chemins d'origine. Redémarrez et voilà...
Merci à @sebsauvage pour le partage !
« Amis de la fonction publique d'État, si on vous pose la question... En #France, les suites collaboratives #Microsoft #Office 365 et #Google #Workspace sont proscrites dans les services de l'État. Les bases réglementaires : → Note de la CNIL (27/05/2021) : https://www.cnil.fr/fr/la-cnil-appelle-evolutions-dans-utilisation-outils-collaboratifs-etatsuniens-enseignement-superieur-recherche → Circulaire 6282-SG (05/07/2021) et note (15/09/2021) : https://acteurspublics.fr/upload/media/default/0001/36/acf32455f9b92bab52878ee1c8d83882684df1cc.pdf → Ministre de l'Éducation Nationale, en réponse à une question écrite (2022) : https://questions.assemblee-nationale.fr/q16/16-971QE.htm
Clamp permet de spécifier trois valeurs pour une propriété : la valeur minimale, la valeur préférée et la valeur maximale.
Ainsi, on pourra donner des tailles fixes comme minimum et maximum et une taille variable (pourcentages ou valeur de viewport) comme valeur préférée: la valeur variable sera utilisée, mais bornée au minimum et au maximum.
ex: clamp(20px, 5vw, 54px)
On peut faire des calculs directement dans clamp() : font-size: clamp(20px, 16px + 5vw, 54px);
Clamp peut être utilisé sur les paddings, les margins etc... Tout ce qui a une valeur numérique (length, number, percentage...)