L'erreur Cannot use string offset as an array en changeant de version PHP
Publié par The Troll le 23 11 2023

Petit billet sur l'erreur php 7.3 Cannot use string offset as an array.

Oui, vous avez bien lu ; php 7.3 Cannot use string offset as an array

je le pose là pour permettre de trouver plus facilement la réponse, si tenté que je suis un poil référencé. Pour le faire court, j'ai une application web assez importante qui fabrique des pdf avec latex à partir des éléments d'une base de données "métier". Par un coquin de sort, j'ai du réinstaller mo application sur un nouveau serveur et une chose en amenant une autre, je suis passé de php 5 et quelques à PHP 7.3 et mon appli ne fonctionnait plus.

l'erreur que j'avais était assez cryptique : Fatal error: Uncaught Error: Cannot use string offset as an array

cela tombe sur cette ligne :

#pas ok
$mon_tableau['un_indice']['un_autre_indice']['un_troisieme_indice']='toto';

Cela fait longtemps que je n'avais pas écrit de code et celui-ci date de... quelques années. je fais des recherches et ne tombe sur trop rien.. Je fais des tests de débogage et si j'utilise

#ok
$mon_tableau['un_indice']['un_autre_indice']='toto';

je n'ai plus d'erreur... Truc de malade. cela passe sans souci sur mon php 5 mais coince sur php 7.3. Après de la recherche sur le net (tous les moteurs) je tombe sur un bonhomme que explique que cette erreur arrive si on ne déclare pas

$mon_tableau=array();

voila qui est réglé après des heures de polissage de crane lisse... fini le Fatal error: Uncaught Error: Cannot use string offset as an array , il suffit de délcarer son tableau avant de l'utiliser. je ne sai pas pourquoi je ne l'avais pas fait avant, c'est le seul qui était non déclaré, et comme cela passait...

donc si vous aussi vous avez cette erreur Fatal error: Uncaught Error: Cannot use string offset as an array regardez si vous avez bien déclaré le tableau en question.

ps : oui il y a des répétition pour augmenter les chance qu'une personne cherchant cette erreur tombe plus rapidement ici, lui faisant gagner un temps assez précieux.

À tout seigneur tout honneur, j'ai trouvé la réponse sur cette page : https://stackoverflow.com/questions/1873970/cannot-use-string-offset-as-an-array-in-php

Debian linux - Serveurs - Commentez
nstallation linux sur m5a78L et récupération d'un flash bios foireux
Publié par The Troll le 14 07 2022

Cela fait longtemps que je n'avais pas écrit de truc technique et ce billet est dans les tuyaux depuis un bon moment. Pour faire un 3615 my life, j'ai une copine qui utilisait une vielle machine sur laquelle un ami à elle avait réinstallé une ubuntu (20 quelque chose il me semble). Je suis pas un spécialiste ubuntu (comme disait mon gamin il y a un temps : ubuntu ce sont des amis, mais on ne mange pas à la même table). mais il ramait la mort. Cela venait d'une machine un peu poussive ET du fait que ubuntu version pas light, ça demande un peu de ressources quand même.

Ni une ni deux, voila-t-y pas que je lui propose un re-lifting. Hervé toujours au taquet pour installer un linux chez des vrais gens de la vraie vie. Elle me dit qu'elle veut pouvoir travailler sur un VRAI excell…, gnagnagna, son taff lui demande de remplir un tableau excell avec des macros gnagnagna... bon je me pose un moment et lui explique que comme ça.. ca va pas être possible (les longues années d'install linux chez des gens de la vraie vie m'ont rendu spécialiste dans la compétence : "dis-moi ce dont tu as besoin, je t’expliquerais comment t'en passer". mais là.. c'était blocage.

une jolie carte mère m5a78L-le de chez asus

Oui, mais j'ai déjà acheté une clé pour une licence office 2019 - 2 postes. je commence à déprimer et puis Je me dis un VM win7 ultra light avec un excell cela peut le faire. Bon mais y va falloir repimper un peu la life de sa machine. elle avait un Phenom II X4 B35 et 4 Go de ram, ce qui était un poil pas possible de faire tourner un excell dans un vm win7.

Ni une ni deux, je propose d'upgrader (en english ça fait plus pro d'un seul coup) et je trouve d'occaz un amd FX6300 (que j'ai trouvé dans la liste des compatibles sur la doc de la carte mère) pour moins de 35 balles, je change de ventirad pour 15 balles, je t'y colle 4X4 Go ram pour 40 balles et un ssd pour 15. le systeme sur SSD et var, tmp, swap sur un "vieux" hdd sata et home sur son hdd sata. Pour moins de 100 euros cela change du tout au tout la machine. Le hic c'est que le bios sur la carte (une M5A78L-LE) était trop vieux pour accepter ce nouveau processeur… ni une ni deux, que file sur le site asus, que je te télécharge le bios à flasher que je commence le flashage, verif bios ok, effacement bios ok, écriture bios… et paff planté en plein milieux… la haine… que je retente, replanté… bon… la machine s’éteint… la carte est un brique. Légère en plus. Une jolie brique mais peu utile pour faire tourner un linux.

Et oui le bios de la carte m5a78L se trouve la dedans

Après quelques jours de déprime je me rappelle d'un truc que j'avais lu pour flasher des eprom avec un arduino. Comme j'en ais je me dis regardons ce que l'on peut faire.. la même carte d'occaz c'est 50 balles, ça vaut le coup de se pencher dessus. Et en cherchant sur le net, que je te trouve effectivement une possibilité de flasher un bios avec un arduino. examen de la jolie brique teinte bleutée et que je trouve la puce bios, et que je te l'enlève. je fais le montage sur mon arduino (j'ai dû chercher les spec de la puce car dans l'article du bon samaritain, il y avait pas le sens dans lequel mettre la puce, sens que j'ai découvert avec la patte qui s'attendait à trouver le +3v.

Reprise de son image avec identification précise des pins arduino et sens de la puce :

Montage pour flasher un bios avec un arduino

Mon montage avec la carte de prototypage :

Montage pour flasher un bios avec mon arduino

Je suis les zinstructions et voila-t-y pas que le flash du bios fonctionne. j'avais mis la version 2101 mais la carte démarrait pas et plantait à l’initialisation de l'usb (probablement un truc usb3 ??) je reflash (re-démontage bios, remise sur l'arduino…) avec la version 2001 et la machine démarre. je suis joie. j't'e colle un debian récent avec openbox, un vm win7 avec un excell 2016 (le dernier à s'installer sur win7 et c'est parti. je profite pour faire une session pour son ado qui fait école à la maison et c'est le bonheur dans la famille… "Encore une victoire de canard". En plus avec le système sur le SSD, ça démarre très très vite. Cela change le regard des gens sur l'ordinateur.


Manipulation :

- Télécharger l'IDE Arduino
        $ sudo apt-get update
        $ sudo apt-get install arduino arduino-core 

- Télécharger les outils AVR
        $ sudo apt-get install avr-gcc avr-libc 

- Télécharger flashrom 
        $ sudo apt-get install flashrom 

- Télécharger Frser-duino 
        $ sudo apt-get install git 
        $ git clone --recursive git://github.com/urjaman/frser-duino 
        $ cd frser-duino 
        $ make u2

 - Transférer le programme dans l'Arduino
        # Connecter l'Arduino au PC
        $ make flash-u2

- Lancer flashrom
        # Sauvegarde de la rom présente sur le chip (facultatif)
        $ sudo flashrom -p serprog:dev=/dev/ttyACM0:115200 -r /chemin/romOri.rom

        # Télécharger la dernière version du BIOS
        # Sauvegarder la ROM quelque part sur le pc

        # Ecriture du chip avec la nouvelle version du bios
        $ sudo flashrom -p serprog:dev=/dev/ttyACM0:115200 -w /chemin/romNew.rom

Debian linux - Électronique - Libre - Commentez
Les caractères de dessin ascii en latex (comme pstree)
Publié par The Troll le 19 05 2021

Parfois, il vous prend l'envie de copier-coller une sortie d'un terminal sous linux pour faire un cours en latex (pour une formation linux) par exemple la sortie de pstree ou, pour mon cas d'un systemctl list-dependencies, un truc qui donne quelque chose comme çà :

systemdefault.target
● ├─exim4.service
● ├─hddtemp.service
● ├─slim.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
●   ├─apache2.service
Mais latex il aime pas du tout ça, mais alors pas du tout, et il vous le fait savoir avec des insultes bien senties qui ressemblent à cela :
! Package inputenc Error: Unicode char ● (U+25CF)
(inputenc)                not set up for use with LaTeX.
! Package inputenc Error: Unicode char ├ (U+251C)
(inputenc)                not set up for use with LaTeX.
! Package inputenc Error: Unicode char ─ (U+2500)
(inputenc)                not set up for use with LaTeX.
! Package inputenc Error: Unicode char └ (U+2514)
(inputenc)                not set up for use with LaTeX.
! Package inputenc Error: Unicode char │ (U+2502)
(inputenc)                not set up for use with LaTeX.
Alors bien entendu vous vous précipitez dans votre moteur favoris, pour trouver une solution et vous tombez sur une pléthore de gens qui vous proposent de les dessiner avec tkiz. Malheureux... c'est pour cela qu'il faut lire les docs, le plus possible. Parce que latex à prévu un package pour le faire tout seul, il suffit d'ajouter dans votre préambule

\usepackage{pmboxdraw} % For lines form from terminal
\DeclareUnicodeCharacter{25CF}{\textbullet}

Et là, il le fait pour vous, sans vous prendre le choux. Vous avez remarqué que j'ai ajouté \DeclareUnicodeCharacter{25CF}{\textbullet} parce que le rond noir ● qui est dans la sortie de systemctl n'est pas dans le dessins ascii des boites.

J'espère que cela vous fera gagner du temps un jour et que vous trouverez ce billet dans votre moteur de recherche favori.

Je vous mets en téléchargement la liste des symboles dispo en latex, cela vaut le coup d'y jeter un coup d'oeil : latex_symbols.pdf.

Debian linux - Latex - Commentez
Le if en latex, c'est simple parfois mais pas tout le temps.
Publié par The Troll le 20 04 2021

Oui les p'tits clous, 2 billets en un rien de temps (et j'en ai un troisième sous le coude, mais comme il est 'politique' j'ai la flemme). Donc deuxième billet pour annoncer au monde entier que j'ai résolu un problème que j'avais avec latex, dans une application (on dit appliance ?) de mon cru (ui il y a un R) utilisant latex.

Pour expliquer simplement, j'ai une macro qui reçoit des arguments, juste que là c'est assez simple. Disons que dans cette macro je teste pour savoir si un argument est vide (ui, ils peuvent être vides, sinon c'est moins drôle). Pour cela j'utilise le package \ifthen comme cela :


\RequirePackage{ifthen}

\RequirePackage{ color, graphicx, fancyhdr}
\definecolor{t3}{RGB}{85,212,0}

\newcommand*{\truc}[3]{
Écrit le #1
% si le 3 n'est pas vide écrit le 3
\ifthenelse{\equal{#3}{}}{}{\noindent{{\color{t3}\ding{109}}\itshape~ #3} ~\\}

Écrit le #2
}

Pour le moment tout va bien, la vie est belle et cela fonctionne. SAUF SAUF SAUF que si l'argument en question contient du code latex, la compilation [s|t]e plante avec un log pas forcément facile à comprendre :


! Incomplete \iffalse; all text was ignored after ligne....

Après avoir bataillé un peu de temps à comprendre (je suis pas un dieu en latex) j'ai finalement utilisé une autre construction du même paquet \ifx:


% vvvv le 3 est là
\ifx&#3&%
\else {\begin{small}\vbox{\begin{list}{}{}#3 ~\end{list}}\end{small}}

Et là roulement de tambour cela compile et fait ce qu'il faut comme il faut où il faut. Je suis joie.

Debian linux - Libre - Latex - Commentez
Nouvelles options de config pour apache
Publié par The Troll le 16 04 2021

au détour d'un post mastodon, j'ai découvert de nouveaux headers 'à la mode'.

Le point de départ est la nouvelle technique marketing google, la cohorte. On ne vous dépose plus de cookies,(enfin, plus seulement) de traceurs, mais on vous score dans une "cohorte" qui a le même comportement, comme un troupeau. De ce que j'ai cru comprendre cela ne concerne que les utilisateurs chrome. Mais qui peut utiliser chrome ? mystère.

Donc il y a un nouveau header que l'on peut ajouter à sa config, (apache pour moi) pour dire au navigateur pas de cohorte pour ce site:

Header always set Permissions-Policy: interest-cohort=()

Vous pouvez le mettre dans votre httpd.conf (du coup valide pour toute les hôtes virtuels.

Comme j'étais parti dans le délire, j'ai 'hardener' (un truc à la mode) mon serveur, avec tout pleins de directives qui sont bonnes :

  • Pour éviter de se faire iframer (utiliser nos données dans une iframe) : Header always set X-Frame-Options "SAMEORIGIN"
  • Pour ne pas envoyer de referer (ne pas dire d'où on vient) lorsque l'on suit un lien pointant vers un autre site. Ici je le garde pour les liens intra-site. : Header set Referrer-Policy "same-origin"
  • Pour empêcher les navigateurs de charger des assets d'un autre site (par exemple une feuille de style personnalisé : Header always set X-Xss-Protection "1"
  • Pour empêcher les navigateurs de charger des assets d'un autre site, les 2 valeurs self (pour votre site) et unsafe-inline (si vous utiliser des feuilles de style ou des scripts inlinés dans les pages) : Header always set Content-Security-Policy "default-src 'self' 'unsafe-inline';
  • Pour empêcher les navigateurs de sniffer sans se fier aux headers déclarés (cela permet d'éviter qu'un utilisateurs upload un fichier qui serait mal interprété) : Header always set X-Content-Type-Options "nosniff"
Debian linux - Serveurs - 2 commentaire(s)