Utiliser screen

Bonjour,

Quand j’utilise ssh, ma hantise c’est de perdre la connexion. En effet, les processus sont attachés à la session ssh, donc toutes les tâches en cours sont stoppées par le système dès que la console ne répond plus.

Une solution simple est screen. C’est une application qui abstrait la console. On peut donc se détacher et se rattacher sans que les tâches ne soient perturbées.

On peut se rattacher à une console screen depuis n’importe où. Pas besoin d’être sur le même ordinateur que celui qui a créé l’instance.

Voici un petit exemple d’utilisation de screen.

Créer une instance :

screen -S moninstance

moninstance est un identifiant comme le prenom, on peut créer une instance sans préciser l’identifiant mais on obtiendra un identifiant numérique difficile à retenir et qui peut prêter à confusion si on est plusieurs à utiliser screen.

Se détacher quand on est dedans :

<ctrl> a d

on peut aussi fermer la fenêtre du terminal pour se détacher 🙂

Lister les instances :

screen -ls

Détacher une instance attachée à un terminal :
Il est préférable de détacher une instance qu’on sait attachée à un terminal fantôme, sinon on expulsera l’utilisateur en cours.

screen -d moninstance

Se rattacher à une instance qui n’est attachée à personne :

screen -r moninstance

On peut combiner les flags :

screen -dr moninstance

La commande ci dessus, détache moninstance et la rattache a mon terminal.

Voilà les bases de l’utilisation de screen. J’ai parlé de ssh mais on peut utiliser screen sur un terminal local. Ca évite de garder une fenêtre ouverte sur le bureau. On peut lancer une tâche en local puis vérifier qu’elle tourne toujours via ssh.

Utiliser Mysql en tant que back-end pour libreoffice base

Bonjour,

Ms access est la solution qui me vient à l’esprit quand je dois faire une base de données que je serais seul à utiliser. Parmi les points forts, on peut citer :

  • Transportable
  • On peut l’ouvrir sur quasiment tous les ordinateurs Windows
  • Facile à utiliser

On peut faire tout ce que l’on veut quand on a appris à contourner certains bugs.

Malheureusement, depuis plusieurs années, je suis sous Linux et je m’interdit d’utiliser wine car il pollue les fonctionnalités natives de l’environnement de travail.

Il reste les machines virtuelles quand je dois utiliser Windows. C’est stable, rapide et on peut transférer les fichiers entre la machine hôte et la machine invitée.
Mais, c’est une solution très gourmande en RAM et HDD. C’est pourquoi, j’ai cherché une alternative.

Mes exigences pour un remplaçant sont assez faibles :

  • Gérer les tables
  • Gérer les vues
  • Faire des formulaires
  • Faire des états
  • Intégrer un langage de script
  • Comprend SQL

C’est tout. Il ne doit pas être compatible avec quelqu’autre logiciel, ni importer ou exporter dans un format particulier.

Libreoffice base est le candidat idéal. Il a tout ce qu’il faut.

Les premiers essais sont concluants et je décide de faire ma base de données avec.

Au bout de quelques jours, la base de données est corrompue, le fichier ne veut pas s’ouvrir. Heureusement que je sauve tous mes travaux personnels dans un repository svn. Un petit retour en arrière, on réinsert les données et ça roule.

Rebelotte, quelques jours après, nouvelle corruption. C’est la cata, libreoffice correspond à mes besoins mais son système de stockage est trop fragile.

Qu’est ce qui a fait ses preuves en matière de base de données ? Mysql.
Je décide donc de chercher un moyen d’avoir un front end libreoffice pour sa simplicité d’utilisation et son esthétique et de l’utiliser par dessus une base de données mysql pour la robustesse.

Voici donc la procédure

  • installer le connecteur mysql
sudo apt-get install libreoffice-mysql-connector
  • choisir le driver mysql
  • choisir connecter directement

Les autres options ne sont pas aussi facile à mettre en place.

Résultat, j’ai un front end plaisant avec un back end en béton.
Mais cette solution n’est pas pour moi :

  • On perd la transportabilité
    On ne peut plus enregistrer sa bdd sur clé Usb et l’ouvrir ailleurs, faire une exportation puis une importation mysql n’est pas idéal.
  • On perd la simplicité
    Il faut installer un paquet, installer un serveur de base de données, créer une base de données mysql pour chaque projet.
  • On perd l’universalité
    Ce n’est pas important pour moi, mais, on ne pas se dire qu’on a 90% de chances de trouver libreoffice + mysql sur un pc.
  • Il faut insérer le mot de passe à chaque ouverture du fichier
    Il y a surement moyen de l’enregistrer mais ce n’est pas directement avec une case à cocher lors de la création du projet.
  • On perd l’utilisation concurrente
    Mysql est fait pour une utilisation via une interface web et accepte une utilisation simultanée sur plusieurs postes. C’est un avantage qu’on ne gagne pas parce qu’on est limité par l’interface mono-utilisateur de libreoffice.
  • On ne gagne pas en stabilité
    Les fichiers ne sont plus corrompus mais ça plante trop souvent. Et ce n’est pas à cause du fichier qui grossit, vu qu’on le décharge du stockage des données.

Même si c’est une piste que j’ai pris plaisir à investiguer, je ne retiens pas libreoffice base, seul ou couplé avec un back end, comme une solution viable quel que soit le projet. En attendant d’avoir mieux, je vais créer une interface web + mysql pour tous mes projets perso.

Faire un watcher en javascript

Introduction

Bonjour,

Récemment, j’ai vu un tutoriel sur vue.js.
Il y a un concept qui m’a plu, c’est celui du binding.

En gros, on attache une variable à un contenu puis le contenu se met a jour automatiquement quand la variable change. Ce n’est pas a double sens, par exemple si le contenu est un input, la variable ne change pas quand on modifie le champ.

Je voulais recréer ce comportement en javascript et j’ai décidé d’appeler ça un watcher.

Implémentation

La syntaxe doit être simple et élégante. Voici comment j’aimerais utiliser le watcher :

<!DOCTYPE html>
<html>
 <head>
 <title>watcher</title>
 </head>
 <body>
 Exemple d'un watcher sur une variable.<br>
Tout ce qui est écrit dans ce champ sera répercuté immédiatement dans les instances dessous.<br>
 <input oninput="toto.valeur=this.value;"><br>
 Voici une instance : <span bind="toto"></span><br>
 Encore une : <span bind="toto"></span><br>
 Et une autre : <span bind="toto"></span><br>
 Allez, une dernière : <span bind="toto"></span>
 </body>
</html>

L’input sert à modifier la variable toto. un attribut bind= »toto » attachera l’élement à la variable toto.

Pour que tout se passe automatiquement, il faut utiliser get et set. Malheureusement, cela ne marche qu’a l’intérieur des objets. Il faudra donc que toto soit un objet.

Voici le script pour effectuer la magie :
On peut copier directement ce code avant </body>

 <script>
 var toto = {
 watcher : [],
 _valeur : "",
 get valeur () {
 return this._valeur;
 },
 set valeur(argValeur) {
 this._valeur = argValeur;
 for (i=0 ; i < this.watcher.length ; i++) {
 this.watcher[i].innerHTML = argValeur;
 this.watcher[i].value = argValeur;
 }
 },
 watch : function (argElement) {
 toto.watcher.push(argElement);
 }
 };
 elements = document.querySelectorAll('[bind=toto]');
 for (i=0 ; i < elements.length ; i++) {
 toto.watch(elements[i]);
 }
 </script>

Sans utiliser de champ input, on peut modifier la variable directement en javascript de la façon suivante :

toto.valeur="coucou";

Attention !

La variable toto.valeur n’est pas sanitisée, il ne faut donc pas l’utiliser directement comme ci-dessus.

Conclusion

C’était juste pour reproduire un comportement qui paraît « magique » au premier abord et d’en comprendre la mécanique.

 

Hamster time tracker – le verdict

Bonjour,

J’avais besoin d’un time tracker, et je disais qu’il serait difficile de trouver aussi bien que timedoctor.

Et bien, c’est vrai. Mais j’aime l’open source et je veux trouver un équivalent libre (et accessoirement gratuit).

Dans ma quête j’ai pris celui qui me semblait le moins pire : Hamster time tracker.

Ce n’est pas un tracker automatique qui donne touts les application ouvertes et utilisées au cours de la journée. On assigne une tâche sous la forme tache@categorie et on arrête quand on ne travaille plus sur la tâche.

Cette application n’est pas faite pour un travail de groupe. C’est uniquement pour qu’un individu sâche ce qu’il fait. Son aspect manuel est un peu frustrant mais on s’y fait. De plus, on peut corriger les temps. C’est à dire changer le début et la fin de chaque tâche qui se sont écoulées.

Il a un petit défaut de granularité. Il calcul à la minute près. C’est suffisant mais si on commence une tâche et qu’elle prend moins d’une minute, il l’efface au lieu de lui assigner une minute.

Il peut fournir un résumé quotidien ou hebdomadaire des taches effectuées. Il manque donc un résultat mensuel et annuel. Les heures sont au format heures décimales, c’est à dire que 1h30 est affiché 1.5h, ce qui est un peu frustrant.

Comme tout outil, quand on apprend à l’utiliser, on apprend aussi à ne pas lui demander ce qu’il ne sait pas faire. Je trace donc uniquement le début et la fin du travail pour les clients.

Autre défaut qui gène mais pas au point d’être blocant, l’icone de la barre de navigation ne réagit pas comme touts les autres. Quand la fenêtre principale est réduite, un clic sur l’icône et elle apparaît. Jusqu’ici tout est normal. Là où c’est agaçant, c’est qu’un nouveau clic ne la réduit pas, on doit donc la fermer par le bouton de fermeture de la fenêtre. Quand la fenêtre est cachée, un clic sur l’icône ne la ramène pas au premier plan.

En conclusion, c’est un programme qui est largement perfectible mais que je vais conserver car il répond a mes besoins.

Sanitiser une chaine en javascript

Bonjour,

Je veux aujourd’hui partager une soluton simple à un problème qui se posait à moi assez souvent.

Comment afficher une chaine en javascript dans un élément html ?

C’est simple, vous me direz :

<div id="cible">
</div>
<script>
   String maChaine='Salut tout le monde !';
   cible = document.getElementById('cible');
   cible.innerHTML = maChaine;
</script>

Ca marche dans certains cas, mais si j’ai :

<div id="cible">
</div>
<script>
   String maChaine='Salut <i>tout</i> le monde !';
   cible = document.getElementById('cible');
   cible.innerHTML = maChaine;
</script>

On a :

« Salut tout le monde ! »

Et ce n’est pas une fonctionnalité trop cool.

J’aimerais avoir :

« Salut <i>tout</i> le monde ! »

Et oui, il faut échapper la chaine pour afficher toute la chaine sans rien interpréter. C’est ce que les « vrais » veulent.

Les vrais quoi ? Les vrais programmeurs, les pros quoi ! Adhérez à cette idée si vous ne voulez pas passer pour un amateur.

Alors, comment on fait ?

On peut installer une librairie qui fait ça, et on va ajouter du bloat à une application qui n’en a vraiement pas besoin.

On peut aussi le faire tout seul, ça prend 5min et ça durera pour toujours, ou jusqu’à ce que javascript propose un équivalent.

On va ajouter une méthode à String qu’on appellera toText()

String.prototype.toText = function (){return this.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;');}

On utilisera toText() à chaque fois qu’on veut écrire notre chaine.

cible.innerHTML = maChaine.toText();

Le tour est joué.

J’ai échappé le strict minimum, soit 4 caractères. Libre à chacun d’en ajouter.

Timeout lors de la publication

Bonjour,

J’ai un petit souci depuis toujours sur wordpress chez free.

Lorsque je publie, il arrive très souvent (environ une fois sur deux) que la page bloque.

Ce n’est pas plus grave que ça car l’article est quand même publié. Le blocage arrive donc lors de la redirection vers la page de confirmation.

Le message d’erreur est le suivant : Network Error (tcp_error)

 

Je n’ai pas cherché de solution car ce n’est pas trop grave.

Je serais quand même intéressé par toute suggestion.

Mettre en place https

Bonjour,

Aujourd’hui j’ai du mettre en place https.

La méthode qui fût demandée est via Let’s encrypt. L’avantage c’est le prix : gratuit. L’inconvénient c’est qu’il faut renouveler la clé régulièrement (tous les 90 jours, il me semble) et ne peut pas l’utiliser pour tous les services.

J’ai essayé avec une ip dynamique et ça marche très bien.

On télécharge certbot et on le lance en tant que root.

On met en place
/etc/apache2/sites-available/mon-site.conf

On alias vers
/etc/apache2/sites-enabled/mon-site.conf

Et le tour est joué.

Cloacking

Bonjour,

Aujourd’hui j’ai appris que je faisais depuis longtemps sans le savoir du cloaking. J’ai l’impression d’être M. JOURDAIN découvrant la prose.

Alors c’est quoi le cloacking ?

Le cloacking c’est le fait de séparer les visiteurs et de donner une version différente de son site.

Avec cette définition, on a l’impression qu’un portail ou une interface d’admin c’est du cloacking. Pourtant, non. Dans ce cas, le visiteur sait ce qu’il y a, et il sait que le contenu change en fonction de certains privilèges.

La différence est donc, pour moi, le fait que le site donne des informations différentes à l’insu de certains visiteurs (des fois même à l’insu de tous les visiteurs).

Bien, je sais ce qu’est le cloacking, mais à quoi ça sert ?

Je vais d’abord expliquer le besoin qui m’a conduit à utiliser cette technique avant qu’elle ai eu un nom. Puis je vais donner des exemples d’autres applications.

Il y a longtemps (vers 2004), je maintenais un site qui était un « gros poisson ». Et comme tout site connu, c’était la cible régulière de pirates en tous genres.

Parmis eux, il y a ceux qui veulent tester leur savoir-faire sur un « vrai » site, et il y a ceux qui veulent avoir l’information sans payer. Il y a d’autres profiles comme les concurrents qui « aimeraient » que le site ait des difficultés, etc.

C’était ma première confrontation à des êtres malveillants envers un site que je maintenais. Et, ce que les pirates en face ne savaient pas, c’est qu’il y a des gens « en face » qui testent leurs connaissances sur la sécurité informatique sur des « vrais » pirates.

J’ai étudié des logs, stéganographié (tiens, un autre sujet intéressant d’article) des documents, traqué pendant deux ans quelqu’un qui a appris beaucoup en ignorant que j’en apprenais plus dans le même temps (sur lui et sur les techniques de plus en plus élaborées pour trouver les failles).

Le cloacking était donc un outil parmis d’autres pour arriver à mes fins. Lorsqu’un bot était détecté, je donnais une page malformée. Ainsi les attaques avec les outils de pentest devenaient inutiles. Lorsque une attaque était détectée mais pas le bot (attaque manuelle directement sur navigateur), je donne une page qui ressemble à celle du site, sans accès aux données et je log tout ce qui transite. Enfin, si aucune attaque, le site se comporte normalement.

J’ai donc 3 sites différents suivant le visiteur. Et, bien sur, les critères évoluent avec le temps pour corriger tout faux-positif, quelle que soit la catégorie.

Une utilisation récente que j’ai eu (d’où l’idée de cet article) est de donner un site complètement différent, pas une admin automatique, un autre site, si on y accède depuis une adresse spécifique.

On peut noter les utilisations pour le référencement. On donne une version spéciale pour google et bing. C’est une utilisation que je ne cautionne pas, mais qui a ses adeptes.

Je vais en rester là sur ce sujet passionnant.

Mettre un site en maintenance

Bonjour,

Lorsqu’on gère un site, il faut savoir rester professionnel.

Un peu de bla bla

Il y a beaucoup de façons de faire « amateur », et une de celles-ci est de laisser une page blanche, ou une page d’erreur quand le site est cassé.

Mettre une page « site en maintenance » montre que l’on fait attention à notre site et par conséquent à ceux qui le voient.

Bien sûr, on ne peut pas toujours prévoir les pannes, mais une action rapide est de rigueur. Ce qui serait mieux c’est une action pro-active. On met d’abord la page « en maintenance », puis on travail à l’aise.

Si on sait que la base de données ne sera pas disponible, une page « revenez dans une heure » est beaucoup mieux qu’une page avec des warnings « database not found » sur chaque texte dynamique.

Un peu de pratique

Maintenant c’est bien de paraître pro, mais on fait comment ?

Une option serait d’installer un plug-in qui affiche la page désirée aux heures prévues. Mais cela suppose que l’on soit sur un cms ou framework qui donne ce genre d’extension.

Pour ma part, je fais beaucoup plus basique : je mets une page _index.html à la racine du site (à côté de la page index.php).

Notez bien l’extention, .html. C’est important pour nous faciliter la vie plus tard.

Les sites ont généralement et par défaut une précédence de index.html sur index.php. C’est important aussi.

La page _index.html doit être la plus simple possible, sobre sans image. Ce ne sont que des suggestions, rien d’obligatoire ici. Par contre interdit d’avoir du contenu dynamique.

Maintenant que tout est en place, on renomme la page _index.html en index.html et le site n’est plus visible pour les nouveaux visiteurs.

Il reste les « pas nouveaux » visiteurs qui ont des chemins en cache dans leur navigateur ou des signets directement sur cetaines pages.

Pour tout ce beau monde, on fait un .htaccess (que l’on nommera .htaccess_ quand on n’est pas en maintenance) qui donnera index.html à tout le monde avec un code erreur 302 pour satisfaire les robots.

Garder ces fichiers a portée permet de changer le nom des fichiers sans faire de transfert et d’éviter d’avoir des accidents.