Pour remédier à cela, la solution est toute simple mais pas vraiment documentée.
Il suffit de placer la directive suivante dans le fichier .ovhconfig de votre hébergement.
app.engine.flags=noforcetmp
Des notes et des liens sur les technologies informatiques, Linux, Apache, Php, Mysql, Javascript, Android, etc
Pour remédier à cela, la solution est toute simple mais pas vraiment documentée.
Il suffit de placer la directive suivante dans le fichier .ovhconfig de votre hébergement.
app.engine.flags=noforcetmp
Pendant longtemps je m'en suis servi pour publier des documents techniques à partir d'informations enregistrées dans des bases de données.
Puis j'ai eu un client dans le domaine de l'édition qui voulait produire des ouvrages de 300 - 400 pages avec des techniques de mise en page assez différentes de celles que j'utilisais jusqu'à présent et là j'ai dû faire face à plusieurs problèmes :
Après cette dernière modification, j'avais une solution qui fonctionnait vraiment bien mais j'avais eu tellement de mal à comprendre le code que j'avais un peu perdu confiance dans la bibliothèque.
Du coup, j'en ai cherché une autre qui permette elle aussi de créer des PDF en Php à partir d'un contenu en html. C'est là que j'ai découvert mPDF.
Après avoir épluché le manuel et m'être laissé séduire par les fonctionnalités de cette nouvelle bibliothèque, j'ai fait quelques tests qui ont tous réussi du premier coup puis j'ai modifié mon application pour remplacer html2pdf par mpdf.
Ce dernier point m'a pris quelques heures mais depuis tout va vraiment bien et la diminution du temps de production des ouvrages est un vrai bonheur.
Accéder aux menus : M-x menu-bar-open ouvre le premier menu et on peut ensuite naviguer entre les options avec les flèches du clavier.
Activer le fonctionnement de la souris : M-x xterm-mouse-mod permet d'activer / désactiver la souris.
Cette configuration peut être enregistrée à l'aide du menu Options/Customize Emacs/All Settings Matching.
Taper par exemple xterm dans la barre de recherche puis un nouveau buffer apparaît affichant toutes les options correspondantes.
Utiliser le bouton Toggle pour changer l'état de la souris puis le bouton State et choisir l'option 1 = Save for future sessions.
Cependant après une ultime mise à jour d'Android elle est devenue inutilisable : Extrême lenteur et surtout des plantages inopinés et très fréquents. Elle s'est mise à s'éteindre brusquement aussi bien lorsque je m'en servais que lorsqu'elle était en veille. J'ai cherché un peu et j'ai découvert que je n'étais pas le seul à rencontrer ce problème.
J'ai un peu tout essayé : Vidage des différents caches, désinstallation de certaines applications, limitation du nombre de tâches en arrière plan, réinstallation complète, etc.
Rien à faire, au bout de quelques minutes ou de quelques heures, le problème revenait.
Un peu en désespoir de cause, je l'ai déverrouillée et j'ai installé la dernière version stable disponible de CyanogenMod (12-1) avec Android 5.1.1.
C'était la première fois que je faisais ça mais tout est très bien expliqué ici et l'opération s'est déroulée sans problème.
Aussitôt ma tablette a retrouvé sa réactivité d'origine et n'a plus connu aucune panne.
J'ai attendu un peu avant de crier victoire mais cela fait maintenant deux mois que je n'ai plus aucun problème. Si toutefois ceux ci devaient réapparaître, je pense que je réinstallerai CyanogenMod avec Android 4.4 qui était la version installée d'origine.
Pour mes développements Php, j'utilise encore beaucoup une ancienne machine sous Debian/Lenny.
La dernière version de Php disponible dans les paquets Debian pour Lenny est la 5.2.
Il y a presque deux ans, j'expliquais comment j'avais pu installer la version 5.3 en utilisant les paquets fournis par dotdeb.
Il y a quelques mois, j'ai dû mettre à jour une nouvelle fois ce vieux serveur pour installer Php 5.5.
J'ai cherché un bon moment mais je n'ai pas trouvé de paquets disponibles pour Debian/Lenny. J'ai donc téléchargé les sources de la version 5.5.32 sur php.net et je les ai compilées.
Je n'ai rencontré aucun problème problème notable, j'ai juste dû recommencer deux ou trois fois pour installer des bibliothèques nécessaires au support de nouvelles options que je voulais installer alors que je ne les utilisais pas auparavant et depuis tout fonctionne très bien.
Lorsque la version 46 de Firefox s'est installée, j'ai remarqué que le texte de la barre d'adresses était invisible, comme si on utilisait une police blanche sur un fond blanc.
Après quelques recherches dans le support de Mozilla, j'ai essayé de désactiver l'accélération matérielle de Firefox et aussi de passer à false la valeur de gfx.xrender.enabled (via about:config).
Ces essais n'ont rien changé, le problème était toujours là. Comme je n'avais pas vraiment le temps de chercher à en savoir plus, je suis revenu à ma dernière version stable : 45.0.2 et j'ai désactivé les mises à jour automatiques.
Hier soir, mon navigateur m'a signalé sans l'installer que la nouvelle version 46.0.1 était disponible.
J'ai effectué la mise à jour en pensant que le problème avait pu être corrigé mais non, toujours pas de texte dans la barre d'adresses.
En cherchant un peu, j'ai remarqué que le problème disparaissait lorsque j'abandonnais le thème par défaut de Firefox au profit de celui appelé Douce lumière. J'avais presque décidé de me mettre à utiliser ce nouveau thème lorsque je me suis rendu compte que si le texte de la barre d'adresses était bien visible, celui des fenêtres d'authentification http et celui de certains champs de formulaires étaient eux invisibles.
Je n'ai pas cherché à comprendre si ces problèmes que je venais de remarquer étaient liés au nouveau thème ou à la version de Firefox et je suis revenu une nouvelle fois à la version 45.0.2.
Note : A mon avis, la méthode la plus simple pour revenir à une ancienne version de Firefox est de sélectionner celle que vous souhaitez et de la télécharger à partir de http://ftp.mozilla.org/pub/firefox/
Cela peut être très pratique et permet d'éviter des manipulations de fichiers temporaires sur le serveur, lorsque l'utilisateur doit télécharger du contenu généré de façon dynamique.
Par exemple, je m'en sers souvent pour le téléchargement de sauvegardes de bases MySQL.
Avec passthru, quelques lignes comme celles ci dessous suffisent.
<?php
header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename=sauvegarde.sql');
passthru('mysqldump -host MonServeur -u Utilisateur -pMotDePasse MaBaseDeDonnees');
?>
Il y a quelques jours, je travaillais sur une vieille application et j'en ai profité pour mettre à jour html2pdf.
Premier essai, vite fait mal fait, j'ai simplement téléchargé la dernière version et remplacé mon dossier html2pdf par celui que je venais de télécharger.
Résultat : un message d'erreur me prévient qu'il y a un problème de dépendance car tcpdf n'est pas installé.
Du coup, je creuse un peu dans ce que j'ai téléchargé, arborescence des dossiers, code source, etc et comme je ne voyais pas où installer et configurer tcpdf, j'ai fini par ouvrir le fichier LISEZMOI.md et je me suis rendu compte que les dépendances étaient gérées par composer.
Il suffisait donc :
Remarques :
Dans le cas de scripts bash très utiles pour automatiser certaines tâches il existe une solution simple et fiable : utiliser la commande pidof.
De façon générale la commande pidof nomprocess sert à retrouver les identifiants de tous les process portant le nom nomprocess.
Par défaut, cette commande ne prend pas en compte les scripts shell.
Si dans le script nommé monscript j'utilise pidof -x monscript je vais bien récupérer les identifiants des éventuelles autres instances de monscript mais aussi celui de l'instance courante.
L'option -o identifiant_à_omettre permet de remédier à cela. En effet, cette option indique à pidof de ne pas retourner l'identifiant identifiant_à_omettre.
Sous bash, la variable $$ contient l'identifiant du script courant.
Donc, la commande pidof -x -o $$ monscript renvoie bien les identifiants de toutes les instances de monscript sauf celui de l'instance courante.
Pour être sûr que plusieurs instances de monscript ne soient pas exécutées en même temps, celui ci peut donc être écrit de la façon suivante :
#!/bin/bash
# dum verifie qu'il n'y a pas d'autres instances du script en cours d'execution
dum=$(pidof -x -o $$ monscript)
if test -z "$dum"
then
actions à effectuer
fi
find racinedemonprojet -type f -name "*.php" -exec wc -l {} \; > ~/resultat.txt
Find explore de manière récursive l'arborescence de dossiers à partir de racinedemonprojet à la recherche de tous les fichiers portant l'extension .php.
A la fin j'obtiens un fichier resultat.txt qui comporte autant de lignes qu'il y a de fichiers Php dans mon projet et qui indique pour chacun d'eux le nombre de lignes qu'il contient.
Il suffit donc d'ouvrir ce fichier avec un tableur et de faire la somme des valeurs de la première colonne pour connaitre le nombre total de lignes de codes Php dans le projet.
Cela fait un peu plus de 15 ans que je développe des sites et des applications internet basées sur ce langage. Certaines tournent sur des serveurs locaux mais la plupart sont sur des hébergements mutualisés ou sur des VPS chez Ovh.
Pour les mutualisés on sait qu'ils passeront automatiquement à Php 5.4 en septembre.
Pour les VPS rien n'est annoncé concernant les serveurs en production mais pour les nouveaux, les distributions proposées semblent disposer au moins de Php 5.5.
Si mes scripts les plus récents sont déjà en Php 5.5, il en reste un certain nombre dans des versions antérieures et même en Php 4. Il adonc bien fallu que je me penche sérieusement sur le sujet et voici une petite liste non exhaustive des principaux changements et des choses à vérifier/corriger lorsque l'on migre vers Php 5.4 depuis une version antérieure.
A mon avis c'est le changement le plus important si vous ne l'avez pas anticipé. Il y a longtemps la valeur par défaut de register_globals était On. Avec Php 4.2 cette valeur par défaut est passée à Off mais jusqu'à la version 5.3 on pouvait encore la changer pour mettre à On. Depuis Php 5.4 cette directive disparaît et Php se comporte automatiquement comme si elle valait Off.
Donc si malgré tous les avertissements à ce sujet vous avez encore des scripts dont les variables sont automatiquement initialisées avec les paramètres (GET ou POST) de la requête qui les appelle, ils ne vont plus fonctionner en Php 5.4.
Cela concerne aussi bien les magic_quotes_gpc que les magic_quotes_runtime donc pensez bien à vérifier comment sont traités les guillemets simples ou doubles dans vos données externes.
Les principales fonctions concernées sont htmlspecialchars, htmlspecialchars_decode, html_entities, html_entity_decode, get_html_translation_table et il faut bien reconnaître que l'évolution de la valeur par défaut du paramètre optionnel encoding a de quoi prêter à confusion.
Si vous utilisez encore l'ancienne extension MySQL pour accéder à vos bases de données, il est grand temps de passer à MySQLi car MySQL est obsolète à partir de Php 5.5 et sera supprimée prochainement.
La solution existe est toute simple : sélectionner autant de lignes que l'on souhaite en insérer puis utiliser Insertion/Lignes.
Je pensais pouvoir continuer comme ça encore un moment, le temps d'installer une nouvelle machine sous un Linux plus récent et de procéder à une migration progressive des différents services. Mais comme tout ne se passe pas toujours comme on voudrait, un développement particulier et urgent m'impose d'utiliser Php 5.3.
Après quelques hésitations je suis parti à la recherche des paquets Php5.3 et de ses principales extensions (mysql, gd, imagick, etc). J'ai fini par atterrir sur dotdeb.org qui m'a paru être une source fiable.
J'y ai trouvé tous les .deb qui m'intéressaient, il ne restait qu'à les préparer pour une installation locale avec apt-get (voir le chapitre 2.2 de ce how-to).
Finalement, la mise à jour s'est déroulée sans aucun problème et ma machine Lenny exécute bien Php5.3.
Le détail des opérations que j'ai effectuées est le suivant :
Notes :
Même si les réseaux sociaux sont à la mode et qu'ils offrent un côté convivial très attrayant, je trouve qu'ils ne sont pas toujours la meilleure solution pour suivre efficacement les sites qui nous intéressent et ce pour au moins deux raisons.
Personnellement, je suis donc un adepte convaincu et un lecteur assidu des flux RSS (ou autres) pour suivre l'actualité des blogs qui m'intéressent.
Après avoir essayé pas mal d'autres systèmes, j'utilise depuis assez longtemps TheOldReader comme agrégateur.
TheOldReader offre toutes les fonctions essentielles à ce genre d'applications : abonnement aux flux et possibilité de créer des dossiers pour les classer par catégories, notification des articles non lus, signalement des flux inactifs, etc. L'interface web que certains trouveront peut être un peu vieillotte est simple et très efficace.
TheOldReader est accessible depuis un navigateur internet et permet également de retrouver ses flux à partir de plusieurs applications mobiles sous Android et iOs.
La version de base que j'utilise pour l'instant est gratuite et permet de suivre jusqu'à cent flux, des versions payantes sont aussi disponibles dont le principal avantage est l'augmentation du nombre d'abonnements autorisé.
Une fonction de bookmarks a récemment été ajoutée aux versions payantes qui doit permettre la mémorisation de n'importe quelle page comme le gestionnaire de favoris d'un navigateur. Si elle fonctionne comme je l'espère, je basculerai certainement vers une version payante.
Cela fait un peu plus d'un an que j'utilise DataTables dans un projet où les clients doivent manipuler de gros tableaux de données affichés dans des pages web.
DataTables est un plugin jQuery assez simple à configurer et à utiliser et qui permet d'éviter la plupart de la lourde programmation Javascript que ce type de développement peut impliquer.
Les principales fonctions de DataTables que j'utilise sont les suivantes :
Dans sa configuration initiale, DataTables travaille uniquement en Javascript ce qui signifie que tous les traitements de données sont effectués sur le poste client. Personnellement je l'utilise avec des performances tout à fait convenables pour des tableaux contenant entre 500 et 1000 lignes de 6 ou 7 colonnes. Pour des données nettement plus lourdes, DataTables peut également être configuré pour effectuer des appels Ajax chaque fois que la table doit être redessinée permettant ainsi de déplacer la charge vers le serveur.
Depuis un an que j'utilise ma tablette Nexus 7, je n'ai jamais été vraiment satisfait de la lecture des mails avec l'application standard d'Android.
Je dispose de plusieurs comptes mails chez OVH que je consulte en POP sous Thunderbird sur ma machine Ubuntu.
C'est sur cette machine que je filtre les spams, supprime ce qui ne m'intéresse pas et archive ce qui doit être conservé.
Sur ma tablette, je veux juste voir ce qui arrive sur mes adresses principales pour éventuellement réagir à une urgence lorsque je ne suis pas au bureau.
L'appli standard d'Android pour les mails n'est vraiment pas pratique à utiliser dans ce contexte car :
Un peu lassé de tester une à une toutes les combinaisons des différentes options de synchronisation, j'ai fini par chercher sur le net et par découvrir que je n'étais vraiment pas le seul dans cette situation et que personne n'avait de solution à proposer.
J'ai donc abandonné l'appli standard et installé Aquamail. Depuis, tous mes problèmes sont résolus :
Pour ceux que ça intéresse, une très bonne FAQ est disponible ici.
Ce site était hébergé depuis une dizaine d'années sur une ancienne offre 90 Plan et je devais le transférer vers la nouvelle offre Perso 2014.
L'encodage des caractères utilisé était ISO-8859-1 et l'affichage du contenu du site faisait appel à la fonction Php htmlspecialchars.
La version de Php utilisée sur l'ancienne offre d'hébergement était PHP 4 alors que sur les mutualisés 2014, la version par défaut est actuellement PHP 5.4.
Avec PHP 4, la valeur par défaut du paramètre facultatif encoding de htmlspecialchars est ISO-8859-1 alors qu'avec PHP 5.4 cette valeur est UTF-8.
La solution la plus simple et la plus rapide pour retrouver mes caractères accentués a été de revenir à la version 5.3 de Php en plaçant à la racine du site le fichier .ovhconfig suivant :
app.engine=php
app.engine.version=5.3
http.firewall=none
environment=production
Remarque : Un autre problème courant pouvant survenir lors du passage de PHP 4 à PHP 5 est lié aux modifications de la directive Register_globals. Voir ici.
Pour activer l'utilisateur root, il suffit de lui affecter un mot de passe en passant par sudo :
sudo passswd root
Les serveurs reliés à internet sont presque inévitablement scannés à l'aide d'outils cherchant des ports ouverts pouvant éventuellement être exploités dans des intentions malveillantes.
Si un serveur ssh est installé sur votre machine, l'ouverture du port 22 sera rapidement découverte et des connexions en tant que root vont tout aussi vite être tentées.
Il va sans dire que le mot de passe de l'utilisateur root doit être sérieux mais deux précautions valent mieux qu'une :
Je conseille vraiment de configurer le serveur ssh de façon à ce qu'il interdise les connexions du root et n'autorise que les connexions d'un utilisateur prédéfini auquel on aura attribué un login improbable, un vrai mot de passe, les droits les plus restreints et que l'on aura exclu de la liste des sudoers.
De cette façon, vous pouvez établir la connexion en utilisant cet utilisateur puis utiliser la commande su pour travailler en tant que root. Par contre si une personne mal intentionnée arrive à entrer en possession des informations lui permettant de se connecter via ssh, il faudra encore qu'elle trouve le mot de passe du root pour disposer des droits d'administration sur la machine.
Cette configuration est simple à mettre en place dans le fichier /etc/ssh/sshd_config où il suffit d'indiquer :