Riditleteur - grafikart - la sécurité
Bon, l'avantage de la video, c'est que je peux l'écouter en faisant la cuisine... ou le ménage... ou les courses... et merde.
Bon, l'avantage de la video, c'est que je peux l'écouter en faisant la cuisine... ou le ménage... ou les courses... et merde.
Vu le nombre d'ordis qui traînent à la maison, je commence à me dire que leboncoin pourrait permettre un win-win: je me défais de quelques-uns et ils ne vont pas à la casse.
Dans le lot, il y a mon ancien ordinateur, un pavilion g6 acheté à carrefour il y a une dizaine d'années. Je l'avais passé à ma fille puis il s'est mis à démarrer aléatoirement. Quand je l'ai testé, l'aléatoirement est devenu systématiquement.
L'ordinateur ne démarre pas, le ventilo tourne, l'écran reste noir.
Pas d'affichage de bios du tout et la led de la touche verrmaj clignote deux fois.
Ce serait le BIOS qui serait corrompu. .. J.O.I.E.
Alors, pour la faire courte, voici la procédure à suivre débarrassée des divers tâtonnements et échecs qui ont jalonné ma dernière heure...
Vous le trouverez sur la page d'hp qui va bien (https://support.hp.com/ca-fr/drivers/hp-pavilion-g6-2000-notebook-pc-series/5226244), mais je vous mets le fichier ici, au cas où...
On télécharge et on lance l'exe sur un win qui marche.
Attention, il faut copier ces fichiers sur une clé USB BOOTABLE ! Pas n'importe quelle clé... Heureusement, j'ai ma bonne vieille corsair flash voyager parce que les prémières m'ont bien fait caguer.
Vous lancez l'exe, vous suivez les directives et vous copiez avec l'option create recovery...
Ordi éteint:
Un petit résumé perso de cette page sur l'objet FormData en javascript.
let form = document.querySelector('form');
let data = new FormData(form);
['clé','valeur']
for (let entry of data) {
console.log(entry);
}
ou
for (let [key, value] of data) {
console.log(key);
console.log(value);
}
for (let key of data.keys()) {
console.log(key);
}
let title = data.get('title')
let titles = data.getAll('title');
data.set('date', '2022-12-25');
data.append('tags', 'vacations');
let hasID = data.has('id');
let arr = Array.from(data.keys());
let arr = Array.from(data.values());
let serialized = Object.fromEntries(data);
let obj = {};
for (let [key, value] of data) {
if (obj[key] !== undefined) {
if (!Array.isArray(obj[key])) {
obj[key] = [obj[key]];
}
obj[key].push(value);
} else {
obj[key] = value;
}
}
let stringified = JSON.stringify(obj);
En résumé, pour un bon .README, il faut les paragraphes:
Pour ma part, et comme un des commentateurs, je pense qu'il faudrait mettre le changelog dans un fichier séparé.
Dans le monde merveilleux de la découpe et gravure laser, je débarque à peine, il me faut bien l'avouer... Toutefois, comme dans beaucoup de domaines dans lesquels le montant à investir au départ est inversement proportionnel aux difficultés que tu vas rencontrer dans l'utilisation de l'appareil. le bazard est ardu, en particulier quand on ne t'explique pas les trucs à la base.
Le choix du logiciel de gravure n'échappe bien entendu pas à cette règle: si tu veux que le bouzin fasse des trucs un peu tout seul ou sans trop de prise de tête, il faudra faire tomber 60€ pour acheter LightBurn, qui semble la référence en la matière.
Sinon, tu te tourneras vers la seconde référence: LaserGRBL. Il est gratuit et ça c'est bien. Mais il ne tourne nativement que sous windows et ça c'est pas bien.
Les plus assidus se rappellent du billet précédent dans lequel je fournissais deux façons de faire tourner ce logiciel sous linux ( https://warriordudimanche.net/article1800/sculpfun-s9-gravure-decoupe-laser-pas-trop-cher ) : la difficulté est moins de faire démarrer laserGRBL que de lui faire détecter la machine sous linux... ça semble possible, mais comme souvent pour les trucs peu répandus ou geekesques, sous linux, ça devient assez peu intuitif... et pour ma part, j'ai pas le temps.
Certains me diront sans doute: «mais pitin, y'en a plein, t'oublies Ci, t'oublies Mi...» oui,oui, ok... https://alternativeto.net/software/lightburn/
Mais ya un moment, il faut bien choisir.
Les captures sont celles de la version windows pour le travail sur l'affiche Harry Potter de l'article précédent, juste pour que vous compreniez ce que vous voyez (référence à https://www.youtube.com/watch?v=xJ2tOJhx2s4 )
En ce qui concerne l'utilisation et l'aspect intuitif, LaserGRBL est à la gravure laser ce que vim est à l'édition de texte... voyez ?!
ça marche bien mais faut connaître...
Toutefois, avant de vous lancer, gardez en mémoire que l'alcool n'est pas la solution.
Je vais pas vous faire une lecture des sous-menus - qui est au tuto ce que le tang est au jus d'orange - mais juste un survol des trucs à voir.
La zone de gauche donne accès à un élément important (outre le bouton servant à connecter la graveuse): le nombre de passes. Contre toute attente, ce n'est pas un paramètre comme les autres, il n'est pas avec les réglages laser.
Rien ne vous dit d'ailleurs où ce trouve ce réglage en dehors du survol. Mais heureusement que ya Bronco pour vous sortir de la merde: c'est la petite case à côté de la barre progression qui dit combien de fois le travail doit être répété (sur l'image ya un «1», donc le travail ne sera fait... qu'une fois: bravo à toi dans le fond.).
Un petit label aurait été de bon aloi...
Et le petit triangle, là, encore à côté, c'est celui qui sert à lancer le processus de gravure/découpe...
A droite, vous retrouvez une représentation visuelle des éléments ajoutés (le résultat du Gcode généré): ils s'afficheront de la même façon qu'ils seront tracés sur la découpeuse.
Dans cette capture, trois fichiers ont été utilisés: le titre (découpe), la photo (gravure) et le sous texte (découpe)
Ces icônes s'avèrent utiles pour placer ou visualiser la zone sur laquelle la gravure va se faire. Ne serait-ce que pour vérifier qu'elle se fera à l'endroit du support où vous espérez...
Avec ce logiciel, on passe toujours par les mêmes étapes:
A chaque fois, vous passerez par ces étapes: pour tout changement de réglage, tout nouveau travail...
Il peut s'agir d'un fichier image ou d'un fichier Gcode. Ici nous choisirons un fichier image: hcoke.png
La fenêtre suivante sert à convertir l'image en fonction de ce qu'on veut obtenir. En gros, on peut choisir d'importer l'image telle qu'elle et de la convertir en lignes de dégradés de gris («tracé ligne par ligne» ou « pointillisme») ou alors de ne conserver que les bords extérieurs («vectorisation»).
Habituellement, pour la découpe, on se sert de la vectorisation.
C'est là qu'on va régler la puissance et la vitesse du laser. Mais avant tout, on choisit le mode du laser !
Ensuite vous pouvez spécifier la vitesse du laser en millimètres par minute et la puissance de 0 à 1000 (0% à 100%).
La rubrique du bas permet de spécifier la taille de la découpe et son décalage par rapport à l'origine 0,0 (en bas à gauche pour la S9 sauf si vous avez utilisé le bouton de LaserGRBL servant à fixer l'origine ailleurs). C'est là que vous décalerez les différents objets les uns par rapport aux autres dans les projets mêlant gravure et découpe)
Les plus observateurs d'entre-vous - ou ceux qui sont le plus habitués aux interfaces laconiques - auront remarqué le bouton en forme de livre. Un clic dessus vous donne accès à des préréglages selon une grande quantité de machines via la MaterialDB (mais pas la S9, j'ai du éditer la base via le menu GRBL>MaterialDB) :
Ici on prend les réglages pour découper du papier 100% / 800 mm/m / 1 passe en M3.
Une fois les réglages effectués on se retrouve devant l'écran principal où l'on n'a plus que le nombre de passes à préciser et un clic sur le bouton
On passe par les mêmes étapes sauf qu'on choisit le mode M4:
Notez le M4 !
Je vous tiens au courant !
Tiens... et si je faisais un bot pour poster une citation par jour tirée des passages de romans que j'ai sélectionnés et stockés su ma Kobo ?!
C'est par ces mots que j'ai commencé à galérer... comme quoi, il suffit d'une idée à la con pour se lancer dans tout un merdier pourtant parfaitement facultatif ...
Je veux qu'un BOT mastodon poste une citation de mes bookmarks de liseuse DONC il faut récupérer ces passages bookmarkés.
Donc, il faut trouver le fichier de base de donnée.
Puis il faut extraire les données intéressantes.
Puis utiliser ces données dans un BOT qui sera appelé une fois par jour.
En fouillant un peu, on trouve un fichier sqlite (JOIE) dont le chemin est .kobo/KoboReader.sqlite
Un passage par DBBrowser pour SQlite permet de jeter un oeil sur la structure des données.
Idéalement, il me faut deux informations: la citation et le titre du bouquin dont elle est extraite.
En fait les titres se trouvent dans la table content
et les annotations dans la table Bookmark
Je pourrais utiliser Calibre et chercher un moyen de faire un export complet de ces deux données uniquement. Pas sûr que ça marche. Ou alors faire un export via le DBexplorer pis me retaper le truc à chaque export...
En vieux programmeur qui bricole, je vois là un prétexte pour coder une petite appli en python qui se chargera de l'extraction.
Mon problème, c'est que je me sers des notes de la Kobo pour retenir des passages intéressants mais aussi, parfois, pour noter vite fait un mot de vocabulaire espagnol que je ne connaissais pas et dont je veux conserver la traduction. Mais ces mots de vocabulaire ne sont pas des citations: il faudrait donc les virer à la main à chaque fois. C'est chiant.
L'appli devra donc permettre de filtrer les citations avant de générer un fichier exploitable par le bot.
J'ai fait l'appli en question: elle permet donc de récupérer les données, filtrer en fonction de la longueur de la citation ou du fait qu'elle est ou pas accompagnée d'une note personnelle...
On peut formater les données selon plusieurs modèles (HTML, Json, Markdown, TXT brut, BOT) voire même créer son propre format (genre %title:«%quote» )
Rien d'extraordinaire ici: je fais un script qui parse le fichier obtenu à l'étape précédente, tire une citation au hasard et la poste sur le compte Masto du Bot.
Le point le plus intéressant du bouzin est plutôt la fonction servant à poster sur un compte mastodon:
define('TOKEN','letokendesécuritéquetuchopesdansmastodon');
define('MASTODON_URL','https://botsin.space/'); // Ici, il faut coller l'url de votre serveur mastodon
define('HEADER',"Citation du jour:");
function post2Mastodon($data=null){
if (!$data){return false;}
$headers = [
'Authorization: Bearer '. TOKEN
];
$data=[
'status'=> HEADER.$data,
'language'=>"fr",
'visibility' => 'public'
];
$ch_status = curl_init();
curl_setopt($ch_status, CURLOPT_URL, MASTODON_URL.'/api/v1/statuses');
curl_setopt($ch_status, CURLOPT_POST, 1);
curl_setopt($ch_status, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch_status, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_status, CURLOPT_HTTPHEADER, $headers);
$output_status = json_decode(curl_exec($ch_status));
curl_close ($ch_status);
return $output_status;
}
Aller sur le compte mastodon en question, puis dans les préférences.
Cliquer sur «developpement» puis «Nouvelle application».
Remplir le formulaire simplissime puis valider. Cliquez ensuite sur le nom de votre application dans la nouvelle page et copiez votre jeton d’accès. C'est celui-ci qu'il faut coller dans le script PHP (dans la constante TOKEN)
Direction le panneau de config de votre hébergement, rubrique cronjob. Sur Cpanel c'est là :
Définissez la fréquence (pour moi une fois par jour) et l'heure (8:00).
Ensuite, il faut définir la commande qui va appeler le script du BOT: wget fera l'affaire...
wget -qO /dev/null http://xxxxxxxxxxx.xx/index.php
L'option -q pour quiet et -O /dev/null pour éviter d'avoir un fichier de sortie qui se crée à la racine.
Une fois tout ça terminé, j'ai bien un bot qui poste une citation à 8:00 tous les jours.
Bon, elles ne seront pas toujours bien formatées vu que la sélection de texte sur liseuse c'est un peu touchy... mais c'était plus pour apprendre à le faire qu'autre chose...
Via un commentaire sur WDD:
Toutes les merdes que vous pouvez virer de votre Android. (et les trucs à pas virer )
Je débloate le p8lite de mon épouse vu que sur 16go, le système et les applis prennent...15.7go environ
Et pas possible de rooter vu que le fastboot est intouchable à cause de la politique de «saycuritay» de Huawei. Les bâtards refusent de filer le code de déblocage du fastboot depuis 2018.
Tu as acheté un appareil mais tu peux pas en faire ce que tu veux.
Pire, ils le bloatent à mort comme ça, quand tu peux plus l'utiliser parce qu'il est plein ben t'en achètes un autre.
Sauf que les couillons de chez huawei devraient se rappeler que dans ce cas, on N'ACHÈTE PLUS JAMAIS HUAWEI... Demandez à wiko
Un wiki à explorer... La page sur signal m'a convaincu.
Une lib créant une dropzone automatiquement à la place d'un input-file. Avec les explications techniques.
Grafikart <3
Pour lecture ultérieure
Faire un lecteur audio custom en CSS+JS
Un excellent article, très simple d'accès. Résumé pour mémoire mais je vous conseille d'aller lire le tout tant c'est clair et bien documenté:
function moncul(string $str)
pour éviter de vérifier les paramètres puisqu'un type erroné provoquera une erreurfunction moncul(string $str): int
car en cas de retour d'un autre type, il y aura erreur. (pour les fonctions ne retournant rien, :void
)private int $mon_cul;
pour qu'une erreur se déclenche en cas d'initialisation d'un type erroné.final class monCul(){
pour éviter tout héritage, même fortuit. ... pour éviter les confusions false/0 etc
En utilisant l'opérateur ternaire condition ? valeur retournée si true : valeur retournée si false;
Pourquoi ? Parce que c'est plus court mais aussi parce qu'on peut placer la condition directement dans une assignation ou à la place d'un paramètre: $count += ($value === CONTROL_VALUE) ? 1 : 0;
Par contre, je trouve qu'on y perd BEAUCOUP en lisibilité et en organisation.
Pour analyser une chaîne selon un format (et à la place d'un explode plus lourd). C'est l'inverse de printf(). ( https://www.php.net/manual/fr/function.sscanf.php )
[$var1, $var2, $var3, $var4] = [$var4, $var3, $var2, $var1];
$intersection = array_intersect(...$bigArray);
au lieu de $intersection = array_intersect($bigArray[0], $bigArray[1], $bigArray[2]); // Etc.
Ça m'a rappelé un épisode de BigBang Theory dans lequel Sheldon est prisonnier d'une boucle dans son algorithme HowToMakeANewFriend... (c'est Howard qui l'en sort en implémentant un compteur comme condition de sortie).
$block++;
if ($block > 1000) {
break;
}
Je plussoie vigoureusement ce point particulier
Avant de se lancer dans un traitement de tableau en créant une fonction ou une méthode exprès, relisez la doc de toutes les fonctions commençant par Array_ ... histoire de ne pas réinventer la roue.
Pour manipuler un tableau, penser à utiliser array_map plutôt que foreach si c'est possible:
array_map('trim',$tableau)
array_map(array($instance, 'methode'), $tableau)
Oufti ! Je vais parcourir tout ça DQP... Merci Seb !