Time track sous linux

Bonjour,

Je travail en freelance, et il m’arrive souvent d’avoir plusieurs projets à mener de front et en parallèle.

Il me faut donc un outil qui me permette de gérer mon temps. Je suis de nature assez organisé mais quand trop de petites choses ne sont pas faites, il m’arrive de paniquer.

Pour ne plus stresser, il faut plannifier les tâches et coller au planning. Mais quels sont les applications qui permettent celà sous linux.

Comme d’habitude, je cherche d’abord dans le repository debian, et si je ne trouve rien qui me sied, je cherche sur internet.

Debian me donne quelques applications de gestion du temps, pas de planification mais du tracking. Je fais quelques tests rapides et statue sur un vainqueur temporaire.

Voici la liste :

  • hamster
  • charmetimetracker
  • timewarrior
  • ktimetraker
  • gnotime

Et le vainqueur est… personne. J’ai eu du mal à utiliser les quelques propositions dans le repository. Je suis aussi un peu de mauvaise foie car je n’ai pas passé plus de 5 minutes pour tester chacun d’entre eux.

Il faut dire que dans le cadre d’un contrat, j’avais du utiliser timedoctor et, je peux vous dire que les outils proposés sont bien loin derrière.

Je ne désespère pas de trouver quelque chose qui fasse ce dont j’ai besoin, puisque je ne peux pas rester sans rien, je vais essayer hamster time tracker.

Réflexion sur la mémoire cache

Bonjour,

Aujourd’hui, je vais parler de la gestion de cache pour les sites web.

Tout d’abord, je vais donner mon point de vue. Je suis contre l’application de mémoire cache à tout va. C’est devenue la solution de simplicité pour tout un chacun qui ne comprend pas ce qui se passe et veut faire croire que c’est la solution magique qui va accélérer le traitement de 30 à 70 pourcent d’après des études dont il a entendu parler.

C’est très faux, déjà, l’étude en question est surement un rapport fait par des chercheurs chez intel ou amd sur la gestion de mémoire cache interne au microprocesseur. Donc ça ne s’applique pas à un cas de plus haut niveau où mémoire cache signifie fichier pré-rendu.

Il faut bien comprendre que la gestion de cache doit être faite pour un besoin précis, en général de performances faibles et doit être mesurée, comme tout ce que l’on fait, avec des variants et des invariants lors de différentes implémentations du cache.

De nos jours, ce qui est le plus cher, c’est le temps de calcul, et ce qui est le moins cher, c’est l’espace de stockage. Pour faire un bon cache, il faut donc utiliser l’espace disque pour alléger le CPU.

Dans un site web, comment faire pour charger le disque et alléger le microprocesseur ?

Il faut transformer les pages dynamiques en pages statiques. C’est à dire faire l’inverse de ce qui est fait dans un CRM comme wordpress.

Et que font les CRM ? Et bien ils stockent toutes les pages incluant leur structure et leur contenu, dans la base de données. Bien souvent, ces pages sont des pages qui n’ont aucune interaction avec le client.

Alors, si ces pages ne changent jamais, on peut en faire une version pré-rendue et l’envoyer au client quand il la demande. C’est le principe d’un cache. Il faut prendre des mesures pour prouver que ce principe marche bien. On charge donc plusieurs fois la page sans cache, on fait la même chose, on simule avec un cache qui peut être recalculé à des intervalles réguliers. On a donc prouvé que ce cache est utile et répond à nos besoins.

Et ben non ! Et si on mesure la version avec cache contre une version du site pas stockée en base de données. C’est à dire, on fait des pages statiques qui n’ont pas besoin d’êtres mises en cache. Là on mesure la perte engendrée par le CRM et son cache.

Si la page est vraiment dynamique avec une phrase du genre « Bonjour M. DUPONT ». Dans ce cas, il faut enregistrer plusieurs versions du même fichier en cache et surement faire des accès disques pour aller chercher l’information qui distinguera le destinataire de chacune des varantes. Il faut mesurer, une mémoire cache pour ça ne sert à rien car les calculs ne sont pas assez importants pour les échanger contre de l’espace disque.

En conclusion, je dirais qu’il ne faut pas systématiser l’utilisation de cache. Il faut, au contraire se dire que si il y a du cache et peu de calculs à la base, c’est peut-être le mécanisme de gestion qui engendre des calculs et demande une solution gourmande en espace disque pour palier à cette fuite de puissance.

api pour gerer les images

Bonjour,

Aujourd’hui j’ai eu a faire une api qui devait gérer des images pour un client, mettre en place le serveur et gérer le cache pour les images.

On traitera dans cet article que l’api.

Version 1

La première version était simple :

/test : affiche un formulaire pour envoyer une image. Cette page n’existera pas dans la version finale, c’est juste pour insérer des images manuellement.

/change : permet d’insérer une image. Les données sont envoyées en POST. C’est vers cette page que /test envoie le formulaire.

/get/{id} : permet de donner une image au format jpeg

Les images données sont transformées en png et stockées, si la convertion ne retourne aucune erreur, avec un nom modifié, un hash de {id} en l’occurence. Ainsi on évite de stocker des images qui n’en sont pas et on a des noms qui sont de longueur fixe et avec des caractères acceptés par le système d’exploitation. Le choix du png en stockage est pour éviter de perdre de l’information et le choix du jpg en sortie est pour contrôler la taille et la qualité.

Version 2

Il y a beaucoup de choses que le client fait et qui devrait être fait par le serveur. Par exemple redimensionner l’image. Ca tombe bien c’est le sujet de la version 2.

En réfléchissant, j’ai trouvé 2 façons de redimensionner une image :

  • On donne x, on calcule y.
  • On donne y, on calcule x.

J’ai donc 2 nouvelles entrées dans mon api :

  • /width/{id}/{x}
  • /height/{id}/{y}

Comme pour /get, on récolte une image au format jpeg

Version 3

Après une réflexion un peu plus poussée, j’ai vu que dans la majorité des cas j’ai besoin de spécifier x et y. Le serveur donnera une image aux dimensions voulues.

  • /stretch/{id}/{x}/{y}

Version 4

Etirer une image n’est pas très esthétique. Il faut donc renvoyer une image aux bonnes proportions mais dans les limites x et y données. C’est ce que j’appelle l’image inscrite dans le rectangle x,y.

On peut aussi renvoyer l’image circonscrite, c’est à dire que le rectangle x,y est inscrit dans l’image renvoyée.

Les images que j’appelle inscrite et circonscrite sont des noms empruntés aux cercles mathématiques. Si quelqu’un connait leur véritable nom, qu’il n’hésite pas à laisser un commentaire.

Les 2 fonctionnalités sont les suivantes

  • /in/{id}/{x}/{y} : On donne x et y, on calcule l’image inscrite dans le rectangle de taille x,y.
  • /out/{id}/{x}/{y} : On donne x et y, on calcule l’image circonscrite au rectangle de taille x,y.

Version 5

Des fois, j’ai besoin d’avoir une image aux dimensions données, mais on a écrit plus haut que l’étirement n’est pas bien. Il faut donc envoyer une image inscrite avec des bordures pour remplir le vide. Ce serait bien de pouvoir choisir la couleur des bordures. Qu’a cela ne tienne, c’est moi qui fait l’api, donc, c’est moi qui décide.

  • /pad/{id}/{x}/{y}/{couleur}

La couleur est au format rvb, comme pour le web mais sans dièse (#, le même symbole que hashtag).

Version 6

La dernière fonctionnalité de l’api dont j’avais besoin est la suivante :
Je veux une image aux dimensions spécifiées mais sans bordure, il faut découper l’image plutôt que de rajouter du vide.
Si on fait comme pour les bordures, on découpe deux morceaux égaux pour que l’image soit au bon format. On a un petit problème de cadrage qui peut arriver.
Pour palier au problème, on fournit les coordnnées du point chaud de l’image. C’est à dire le point au centre du sujet de l’image.

Voici le prototype de l’entrée dans l’api

  • /crop/{id}/{x}/{y} : Découpe l’image autour de son centre
  • /crop2/{id}/{x}/{y}/{x2}/{y2} : Découpe l’image autour du point x2,y2

Version 7

J’avais dit que la version 6 intégrait la dernière fonctionnalité voulue. Alors c’est quoi cette version de trop.

Je vais donner ici des fonctionnalité dont je n’ai pas besoin, et donc, pas implémentées mais intéressantes.

  • /cut : coupe un rectangle dans l’image

Beaucoup de filtres peuvent être implémenté, comme emboss et blur. Certains découpages spéciaux, comme une image ronde, ou un rectangle aux coins arrondis, une étoile.

On peut même imaginer une api qui peut enchaîner les fonctionnalités.

W3 total cache – le verdict

Bonjour,

J’ai installé W3 total cache à cause de la lenteur de wordpress. Ce plugin me paraissait ne rien faire après installation.

Je lui ai donc laissé le bénéfice du doute et j’ai oublié cet optimisateur pendant un moment.

Aujourd’hui j’ai décidé qu’il fallait faire le bilan de son travail.

Alors ?

Et bien, il ne fait pas grand chose, il y a des options pour le customiser mais rien d’intéressant dans la version gratuite. Je n’ai pas envie de payer pour l’instant, donc W3 total cache passe à la trappe.

Mais attendez ! Il faut activer le cache après avoir activé le plugin !
Bon, j’ai coché les rares options qu’ils donnent. Finalement, j’ai un résultat. Mais à chaque fois que je clique quelque part dans le tableau de bord, il réécrit le .htaccess, et bien sûre, ça casse le blog. Il est fatiguant de devoir garder une fenêtre ftp et de régulièrement supprimer ce fichier quand le plug-in est actif. Il passe donc quand même à la trappe.

Le prochain en liste ?

WP fastest cache. Toujours comme d’habitude, pas de mesure précise mais je vais voir si on gagne en vitesse de façon significative.

Si vous avez des retours positifs de gestionnaires de cache grauit, n’hésitez pas à partager.

wordpress, planifications manquées

Bonjour,

J’ai eu un problème d’articles n’ayant pas été publiés à temps.

WP scheduled posts ne sert pas du tout à lancer les planifications manquées, il donne dans la barre du haut un menu recensant les publications à venir, sans offrir la possibilité de les publier tout de suite ou de changer la date. D’ailleurs si vous avez de bon plugins qui permettent d’intercaler un post dans une liste planifiée, c’est à dire que tous les articles planifiés après celui inséré sont décalés, n’hésitez pas à le laisser en commentaire.

Il me faut donc trouver une autre extension pour réparer wordpress. J’ai décidé d’installer Scheduled posts trigger. Au moins son nom est évocateur sur sa fonction.

J’espère ne plus avoir à revenir sur ce sujet.

Envoi d’emails en php depuis une boite office365

Bonjour,

Des fois, un problème qui est censé être simple, devient un casse tête chronophage, en plus je DOIS le faire car c’est pour un client, donc pas de remise au lendemain (du moins pas sans se battre jusqu’à épuisement le jour même).

Voici les données de départ :

  • Un nom de domaine relié à un hébergement
  • Une boite e-mail chez office365

Le but est simple : pouvoir envoyer des e-mails depuis php grâce à office365. Et si on a choisi de payer une boite e-mail c’est pour avoir notre nom de domaine dessus.

C’est simple et en théorie facile. Il faut d’abord enregistrer les champs MX auprès de notre registrar pour avoir le nom de domaine qui colle à notre boite mail, c’est facile, ça marche un peu, on règle les DNS et ça roule.

Deuxième étape, on vérifie le smtp et pop/imap. C’est tout aussi facile. On prend icedove (oui, j’ai une Debian, si vous vous souvenez) et on configure les paramètres qu’office365 nous a donné. Après des dizaines d’années de configuration sur outlook express, thunderbird, et autres smartphones du s60 à android, le test se fait en deux coups de cuiller à pot.

Troisième étape, tester manuellement (avec openssl) sur le serveur en ssh. Ca fonctionne bien.

Quatrième étape, on fait un test en php avec la fonction mail(). Bien entendu, il faut une connexion StartTls avec authentification qui n’est pas prise en charge par mail().

Cinquième étape, installer et configurer un MTA qui pourra ne rien demander à mail() et envoyer le courrier quand même. On regarde du côté de sendmail, ç’est très compliqué. Postfix, c’est moins compliqué mais ça reste compliqué quand même. Le problème n’est pas de faire marcher cette solution, c’est de la sécuriser afin de ne pas devenir un zombie pour spammers.

Cinquième étape bis, chercher une alternative à mail(). Une solution vite trouvée : phpmailer. C’est facile et ça marche sur la machine de test (mon ordinateur) et un compte hotmail fait pour l’occasion. J’ajuste les paramètres pour le compte office365 et comme prévu, ça fonctionne toujours sur ma machine.

Sixième étape, on envoie la page de test sur le serveur. Ca ne marche pas ! Le syndrome « Ca marche sur ma machine » a encore été diagnostiqué. Je passe une journée entière à déboguer le code source de phpmailer afin de savoir où se situe le problème. C’est la fonction stream_socket_client qui fait un timeout, il y a donc un firewall qui empêche la connexion. Je règle le timeout de connexion à 10s pour que php donne une erreur de connexion plutôt qu’un timeout de la page (entre 2 timeouts, choisir le moindre). Une nouvelle journée passée à parler anglais (à la louche) pour se faire comprendre du staff de chez Microsoft (très professionnel d’ailleurs). Ils veulent m’aider grâce à un logiciel de partage d’écran, qui est compatible Windows et Mac… J’ai aussi un problème avec l’adsl en ce moment, j’utilise donc la 3G de mon téléphone, et donc pas d’internet quand je parle… Décidément, cette journée n’est pas la plus « jouasse ». Après quelque coups de fil et des mails échangés, on arrive à la conclusion que ç’est pas chez eux que ça coince.

Septième étape, on récapitule parce que ça commence à ressembler à du vaudou cette histoire.

  • Ca marche sur ma machine
  • Le même code ne marche pas sur le serveur
  • Le même code marche sur le serveur quand c’est hotmail qui est configuré
  • Le firewall est désactivé pour pas nous prendre la tête
  • Ca ne bloque pas du côté d’office365
  • Openssl nous permet d’envoyer les mails sur le serveur manuellement
  • Sendmail n’est pas à blamer car phpmailer le court-circuite

Les hypothèses qui restent :

  • phpmailer à une bogue qui fait que hotmail fonctionne et pas office365
  • Le serveur malgré le firewall désactivé fait une distinction entre office365 et hotmail

La deuxième hypothèse me parait plus plausible, je décide de faire un telnet tout bête, et ça ne passe pas, contrairement à openssl qui se connecte.
Un indice qui ne m’as pas échappé est que telnet coince devant une ipv6, je test derechef sur hotmail, ça passe, et bingo, une ipv4.
J’ai donc une piste sérieuse, je désactive l’ipv6 sur le serveur et telnet marche de partout sur toutes les adresses.

Enfin, je lance le script de test php et… Encore un timeout. Je consulte les logs, je constate qu’il y a un fait étrange dans phpmailer : La variable timeout est utilisée dans stream_socket_client(), ce qui est normal, mais aussi dans stream_set_timeout(), ce qui est bizarre pour moi. J’aurais aimé choisir une valeur différente pour chacun.
Et si j’ai remarqué cela c’est que le timeout n’est plus à la connexion mais lors de l’authentification. Le serveur met environ 12 secondes pour confirmer l’existence du compte, oui, j’ai mis 10s et ça me retombre dessus.
Je fais un calcul simple, la page php timeout à 30s, l’authentification met 15s, il reste donc 15s pour la connexion vers la boite mail.
Je met donc 15s pour timeout sans patcher phpmailer (afin de prendre 2 valeurs différentes, si vous suivez toujours).

Je croise les doigts et lance le test et… Ca marche \o/. On fais quelques tests supplémentaires pour voir si c’est tout le temps vrai, et oui.

J’ai quelques questions qui me viennent à l’esprit :

  • Pourquoi le test manuel est très rapide (connexion et authentification en 3s, le reste est quasi instantané) et phpmailer si lent.
  • Pourquoi ipv6 ne marche pas alors que le firewall est désactivé. J’ai une réponse qui vient de google, Digital Ocean, qui est notre hébergeur, désactive ipv6 sur les ports smtp, donc même si le firewall du serveur laisse passer ces ports, celui de l’hébergeur bloque quand même.

Je n’ai plus de temps pour résoudre ces questions. Et je me contente donc de cette petite victoire.

 

forcer un code retour http 200 en php

Bonjour,

J’avais l’habitude de donner des codes de retour http en php pour signaler des erreurs, c’est devenu de plus en plus vrai quand la réécriture d’url est devenue la norme.

Voici les codes de retour que j’utilise le plus :

  • 404 pour un lien invalide
  • 403 pour les gens inconnus dans une zone protégée
  • 401 pour les gens connus dans une zone dont ils n’ont pas accès
  • 501 pour un lien valide non configuré dans la base de données
  • 503 pour une erreur de service (par exemple mod_rewrite pas fonctionnel)

Il y en a d’autres qui sont implicitements envoyés par apache ou php.

En allant chez free.fr, htaccess n’accepte quasi rien.
La réécriture n’est pas possible directement et on a recours à la redirection de l’erreur 404 d’apache pour aller sur notre point d’entrée.

Jusqu’ici tout va bien, mais quand j’ai servi ma page, je ne veux pas qu’elle renvoie 404. Ce n’est pas un souci car j’ai l’habitude d’envoyer des codes de retour, donc si aucune erreur n’est détectée, je rajoute avant tout envoi le code suivant :

header("HTTP/1.1 200 Ok");

Sauf que le code retour 200 n’est pas honoré par php, j’ai donc cherché dans la doc de php pour trouver une alternative qui puisse donner un code 200 afin que les bots ne soient pas induits en erreur.

http_response_code(200);

Malheureusement tout aussi inefficace.

J’allais abandonner quand je suis tombé sur une réponse dans stackoverflow.

header("Status: 200");

J’ai vite testé et ça marche. J’ai aussi testé pour les autres codes et ça marche aussi.

Voilà donc ma nouvelle façon d’envoyer un code d’erreur (et de réussite) http via php.

wordpress correction des planifications manquées

Bonjour,

Encore un problème lié à wordpress, mais pas en rapport avec free.fr (du moins je pense). Les articles planifiés ne se publient pas automatiquement et un message planification manquée est affichée près du bouton publier.

J’installe le plugin WP Scheduled posts et je donne le verdict dans quelques jours. J’ai pas trop le temps de tester sur place, mais j’ai quelques articles planifiés.

Une solution plus casse tête mais moins polluante aurait été plus à mon goût mais celle-ci est plus simple à mettre en place et si elle marche, fera l’affaire.

Optimiser mon site chez free.fr

Bonjour,

Aujourd’hui je voulais optimiser le site. Première étape, le passer sous google page speed. Le verdict est affigeant. J’ai donc décidé d’essayer la méthode que j’ai mis au point :

  1. mod_deflate
  2. mod_expires
  3. mod_headers

Ces 3 modules sont bien sûr des modules apache et il faut les configurer dans htaccess.

Comme prévu, ça ne marche pas chez free.fr, j’abandonne donc la partie pour le moment.

Je pourrais faire un article pour le détail de l’optimisation évoquée plus haut. N’hésitez pas à la demander en commentaire pour que je sache qu’il y a de la demande.

W3 total cache

Bonjour,

J’ai essayé de palier à la lenteur de wordpress en installant un plugin.
Après une recherche minutieuse, certains noms commencent à sortir.

J’ai décidé d’installer W3 total cache. Bien sur étant chez free.fr, toute mise à jour, installation ou autre manipulation de ce genre change le .htaccess et casse le site mais c’est devenu habituel et la solution est rapide.

Alors W3 total cache chez free.fr ? Et bien j’ai pas mesuré mais c’est kif-kif. Il faut relativiser en disant que c’est une installation de base sans tweak et que peut-être dans quelques heures, le cache sera rempli et efficace.

Ce sera donc à l’occasion d’un autre article qu’on aura la réponse sur le cache chez free.fr.