Vous êtes ici

tutoriel

Avec Jitsi Meet Electron la prise de contrôle à distance sécurisée, libre et multiplateforme est enfin simplifiée !

Si vous pratiquez l'assistance informatique pour vos proches, vous devez certainement connaître TeamViewer, c'est la référence dans le genre pour prendre la main à distance sur le poste d'une autre personne car il est simple d'utilisation et qu'il joui d'une certaine réputation avec le temps, donc une majorité de gens le connaissent. Mais ça c'est quand on ne se préoccupe que des fonctionnalités et qu'on oublie les risques de sécurité et d'espionnage industriel, comme certaines entreprises française en ont fait les frais à une époque. D'un autre côté en entreprise il existe les classiques VNC, RDP, Skype Enreprise ou encore assistance à distance Windows, parfois difficiles à mettre en œuvre pour un particulier (envoi de fichiers, trouver l'adresse IP, ouverture de ports sur la box ou que sais-je encore).

Aujourd'hui il semblerait que j'aies trouvé le logiciel qui combine le meilleur des deux mondes : Jitsi Meet Electron.

Jitsi Meet Electron est une application de bureau (pour poste de travail sous Mac OS, GNU/Linux ou Windows) reposant comme son nom l'indique sur le framework open source Electron qui permet de rejoindre une réunion à distance sur n'importe quelle instance de Jitsi Meet publique sur internet (ou en réseau local si vous en auto-hébergez une ainsi). Dans le contexte actuel (confinement dû au covid19, recours accru au télétravail), la réputation de cette solution de Messagerie instantanée, Visioconférence, audioconférence à plusieurs n'est évidemment plus à faire, car d'une extrême simplicité et très performante par ailleurs et sécurisée pour couronner le tout (avec un chiffrement de bout en bout par exemple). Mais Jitsi Meet Electron va un peu plus loin : d'abord parce qu'une application de bureau est souvent plus confortable et fonctionnelle qu'un simple onglet dans un navigateur (meilleure intégration au système d'exploitation, enregistrement de préférences) elle va aussi vous permettre de prendre le contrôle à distance d'un ordinateur qui dispose de celle-ci.

Pour cela, une fois que les participants (au moins 2 évidemment, et il faudra penser à protéger la réunion par mot de passe !) il vous suffira de cliquer sur les trois petits points en bas à gauche de votre interlocuteur puis sur "Start/stop remote control", ce dernier devra alors confirmer en cliquant de son côté sur "Allow".

And voilà !

Le logiciel est en version beta et comporte sans doute encore quelques bugs ou des traductions incomplètes, mais rien de rédhibitoire à mon sens.

MAJ du 10/04/2020 : un bug empêche pour l'instant de prendre la main sur un poste sous GNU/Linux depuis un poste sous Windows par exemple.

MAJ 2 : il faut juste désactiver le bac à sable.

Une meilleure expérience de la ligne de commande avec l'émulateur de terminal tilix et l'interpréteur de commandes fish

J'utilise ces deux outils au quotidien et ils pourraient être des prérequis dans les prochains tutoriels publiés sur ce blog. Ce billet a simplement vocation à les mettre en lumière, il serait dommage de vous en passer si vous êtes débutant.

FISH

Pour commencer Friendly Interactive Shell (aka Fish) intègre des fonctionnalités telles que la coloration syntaxique, la saisie automatique au fur et à mesure et la possibilité de compléter les commandes de manière sophistiquée ou encore l'insensibilité à la casse quand c'est utile, sans qu'aucune configuration ne soit nécessaire.

Installation de Fish sous Debian/Ubuntu :

sudo apt install fish

chsh -s /usr/bin/fish

TILIX

Tilix quant à lui permet d'avoir plusieurs terminaux dans la même fenêtre voir de créer des groupes de terminaux, de gérer des sessions, de rechercher des commandes déjà utilisées, de configurer des raccourcis claviers, de synchroniser des commandes entre plusieurs terminaux ouverts, etc.

Installation de Tilix sous Debian/Ubuntu :

sudo apt install tilix

Synchroniser une timeline Twitter sur un compte Mastodon

Face aux limites imposées aux clients non officiels du réseau social Twitter - pourtant généralement meilleurs que l'officiel - notamment la limite des 200 statut par requête et des 15 requêtes toutes les 15 minutes maximum ou encore la non conservation de la position dans la timeline, j'ai eu l'idée de synchroniser le contenu de la timeline sur celui d'un compte privé Mastodon par l'intermédiaire d'un script, puisqu'en général instances et clients Mastodon son nettement moins limités. Il suffirait ensuite d'appeler de façon régulière ce script sans interaction humaine (car on ne peut pas passer sa vie à récupérer des tweets !).

Voici donc un début de résultat.

Pour l'exploiter à votre tour, il vous faudra au minimum PHP et son extension CURL. Sans oublier de faire le nécessaire pour obtenir vos jetons d'accès développeurs sur votre instance Mastodon et Twitter...

Son utilisation dans crontab sera ensuite on ne peut plus simple :

*/1 * * * * sudo -u www-data php /chemin/twitter_to_mastodon_timeline.php

Le script PHP

<?php // simple-php-twitter-to-mastodon-timeline.php

chdir('/script/path');

    function buildBaseString($baseURI, $method, $params) {
        $r = array();
        ksort($params);
        foreach($params as $key=>$value){
            $r[] = "$key=" . rawurlencode($value);
        }
        return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
    }

    function buildAuthorizationHeader($oauth) {
        $r = 'Authorization: OAuth ';
        $values = array();
        foreach($oauth as $key=>$value)
            $values[] = "$key=\"" . rawurlencode($value) . "\"";
        $r .= implode(', ', $values);
        return $r;
    }


    $url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'; // or home_timeline.json

    // Custom Twitter data

    $oauth_access_token = " ";
    $oauth_access_token_secret = " ";
    $consumer_key = " ";
    $consumer_secret = " ";

    // Custom Mastodon data

    $mastodon_token = ' ';
    $mastodon_instance_url = 'https://instance.url'; // example : https://framapiaf.org'

    $curl_opt_url = $mastodon_instance_url . "/api/v1/statuses";

    $oauth = array( 'oauth_consumer_key' => $consumer_key,
                    'oauth_nonce' => time(),
                    'oauth_signature_method' => 'HMAC-SHA1',
                    'oauth_token' => $oauth_access_token,
                    'oauth_timestamp' => time(),
                    'oauth_version' => '1.0');

    $base_info = buildBaseString($url, 'GET', $oauth);
    $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature'] = $oauth_signature;

    $header = array(buildAuthorizationHeader($oauth), 'Expect:');
    $options = array( CURLOPT_HTTPHEADER => $header,
                      CURLOPT_HEADER => false,
                      CURLOPT_URL => $url,
                      CURLOPT_RETURNTRANSFER => true,
                      CURLOPT_SSL_VERIFYPEER => false);

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    curl_close($feed);

    $twitter_data = json_decode($json);

    $lastid='';

    $lastidfile = 'lastid.txt';
    $current = file_get_contents($lastidfile);
    $content = "";
    $i = 0;

    foreach ($twitter_data as $twt) {
        if ($i == 0) {$lastid = $twt->id_str;}
        if ($twt->id_str == $current OR !isset($twt->id_str)) { break;  } else {

        $headers = [
        'Authorization: Bearer ' . $mastodon_token
        ];

        // You can change twitter API fields here :
        $toots[] = $twt->created_at . " -  " . $twt->user->name . "\r\r " . $twt->text . "\r\r https://twitter.com/" . $twt->user->screen_name . "/stat$

        $i++;
        }

}

if (!isset($toots)) { } else { 

$toots = array_reverse($toots);

foreach ($toots as $toot) {

$status_data = array(
  "status" => $toot,
  "language" => "fre",
  "visibility" => "private"
);

$ch_status = curl_init();
curl_setopt($ch_status, CURLOPT_URL, $curl_opt_url);
curl_setopt($ch_status, CURLOPT_POST, 1);
curl_setopt($ch_status, CURLOPT_POSTFIELDS, $status_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);

}

file_put_contents($lastidfile, $lastid);

}

?>

Revue de web automatisée sous Linux avec Semantic Scuttle, PHP, CutyCapt, GraphicsMagick ...

Les prérequis techniques

Pour ma part j'utilise de longue date Semantic Scuttle, qui me facilite grandement l'enregistrement des URL, notamment grâce à une extension pour Firefox ou le bookmarklet dédié. À défaut vous pourrez facilement adapter ce code avec une source de données en markdown... ou autre.

Certes, cela représente beaucoup de dépendances, mais on les trouve facilement sous GNU/Linux et ces composants restent gratuits.

Le script PHP


<?php // /chemin/script/RevueWeb.php $uneDate = date('Y-m-d'); $maDate = new DateTime($uneDate); $dateFormatee = date_format($maDate, 'Ymd'); $dateLisible = date_format($maDate, 'd/m/Y'); $imgDir = "/chemin/script/"; require_once 'src/Feed.php'; // (RSS to PHP) // Flux RSS des pages enregistrées dans Scuttle dédiés à votre revue de web : $rss = Feed::loadRss('https://instance.semantic.scuttle/rss.php/frenchhope/tag_de_la_revue_de_web?sort=date_desc&count=2048&privateKey=ma.cle.privee'); $versionMarkdown = "## Revue de web du $dateLisible" . PHP_EOL . PHP_EOL; // Titre // contenu foreach ($rss->item as $item) { $versionMarkdown .= "[" . $item->title . "](" . $item->link . ")" . PHP_EOL . PHP_EOL; // on formate le titre et les hyperliens // on réalise des captures d'écran au format JPEG, c'est plus joli et ça ne tiens pas trop de place. // pour cela on crée un serveur d'affichage virtuel (serveur X) avec xvfb-run parce qu'en ligne de commande sur un serveur il n'y en a pas ! // Voir la documentation de CutyCapt pour les options. $hash = hash('sha256',$item->link); $imgFile = $imgDir . "webScreenShot_" . $hash . ".jpg"; exec('xvfb-run --server-args="-screen 0, 1900x1080x24" cutycapt --min-width=1900 --min-height=1080 --smooth --url="' . $item->link . '" --out="' . $imgFile . '"'); // Recadrage avec GraphicsMagick exec('gm convert ' . $imgFile . ' -crop 1900x1080+0+0 ' . $imgFile); // Redimentionnement avec GraphicsMagick exec('gm mogrify -resize 950x540 -quality 65 ' . $imgFile); $versionMarkdown .= "![]($imgFile)" . PHP_EOL . PHP_EOL; $versionMarkdown .= "---" . PHP_EOL . PHP_EOL; } // Tout dans un fichier avec la date du jour file_put_contents("$dateFormatee.md", $versionMarkdown, FILE_APPEND | LOCK_EX); ?>

Affichage de la revue dans une page web

Pour ma part je copie ce fichier Markdown dans mon dossier de données Nextcloud car avec l'application Pico CMS je peux l'afficher directement. Dans ce cas il faut mettre à jour la base Nextcloud :

sudo -u www-data php /var/www/nextcloud/occ files:scan [nom d'utilisateur]"

Mais vous pourriez tout aussi bien créer un script en PHP pour afficher le Markdown dans une page web avec parsedown par exemple.

L'alternative à base de source de fichier Markdown plutôt que Semantic Scuttle et RSS

remplacer :

$rss = Feed::loadRss('https://instance.semantic.scuttle/rss.php/frenchhope/tag_de_la_revue_de_web?sort=date_desc&count=2048&privateKey=ma.cle.privee');

par :

$contenu = file_get_contents('/chemin/du/fichier.md');
$regex = "/\[([^\[\]]*)\](.*)/";
preg_match_all("`$regex`", $contenu, $matches);  

et :

foreach ($rss->item as $item) {
$versionMarkdown .= "[" . $item->title . "](" . $item->link . ")" . PHP_EOL . PHP_EOL; 
$hash = hash('sha256',$item->link);
$imgFile = $imgDir . "webScreenShot_" . $hash . ".jpg";
exec('xvfb-run --server-args="-screen 0, 1900x1080x24" cutycapt --min-width=1900 --min-height=1080 --smooth --url="' . $item->link . '" --out="' . $imgFile . '"');

par :

foreach ($matches as $item) {
$versionMarkdown .= "[" . $item[0] . "](" . $item[1] . ")" . PHP_EOL . PHP_EOL; 
$hash = hash('sha256',$item[1]);
$imgFile = $imgDir . "webScreenShot_" . $hash . ".jpg";
exec('xvfb-run --server-args="-screen 0, 1900x1080x24" cutycapt --min-width=1900 --min-height=1080 --smooth --url="' . $item[1] . '" --out="' . $imgFile . '"');

Utilisation

  • En ligne de commande
sudo -u www-data php /chemin/script/RevueWeb.php
  • Ou depuis l'URL de la page "RevueWeb.php" si vous la publiez avec un serveur web

http://mon.serveur.web/RevueWeb.php

  • Puis téléchargement d'une revue :

http://mon.serveur.web/20200127.md

Automatisation avec cron

Tous les jours à 20h00 par exemple :

00 20 * * *    sudo -u www-data php /chemin/script/RevueWeb.php

Convertir une page de dokuwiki en markdown

Fichier attachéTaille
Image icon 1280px-Markdown-mark.svg_.png9.37 Ko

Voilà quelques temps déjà je me suis décidé à maximiser progressivement mon utilisation de la syntaxe Markdown, c'est pourquoi j'ai installé il y a quelques mois le filtre adapté pour Drupal (pour rappel le CMS utilisé pour réaliser ce blog). Après m'être aussi familiarisé avec lui sur le réseau social diaspora* et la rédaction de documentations professionnelles je poursuis cet effort en prévoyant de migrer progressivement de DokuWiki vers Wiki.js (qui permet de rédiger directement des pages de wiki en markdown), à cet effet je me suis posé la question de savoir s'il était possible à minima de récupérer certains articles sans avoir à les réécrire. Et c'est effectivement le cas. Je vous expose donc une méthode manuelle reposant sur l'utilitaire de conversion en ligne de commande Pandoc.

Il m'aurait été possible de décrire comment convertir tout le wiki puisque dokuwiki stocke les pages sous forme de fichiers, mais ce n'est pas l'objet de ce tutoriel qui se veut plus simple à comprendre et généralisable à d'autres systèmes de wiki sans avoir nécessairement accès au Back office du serveur.

Prérequis

  • Une instance de dokuwiki (forcément)
  • Pandoc 2.6 minimum

Installation de Pandoc sous Linux

Fedora / Redhat / Centos, etc.

sudo dnf update
sudo dnf install pandoc

Debian, Ubuntu, Raspbian, Mint, etc.

sudo apt update ; sudo apt upgrade
sudo apt install pandoc

Installation manuelle de la version la plus récente de Pandoc

Pour connaître le lien de téléchargement de la dernière version (actuellement 2.7.3) : c'est par ici

VERSION=2.7.3
TGZ=https://github.com/jgm/pandoc/releases/download/$VERSION/pandoc-$VERSION-linux.tar.gz
DEST=$HOME/.local
wget -O pandoc.tar.gz $TGZ
tar xvzf pandoc.tar.gz --strip-components 1 -C $DEST
cd $DEST/bin

Conversion de page dokuwiki en markdown

wget -O fichier.dokuwiki "http://mon.instance.dokuwiki/mapage?do=export_raw"
# ou wget -O fichier.dokuwiki "http://mon.insance.dokuwiki/?id=mapage&do=export_raw"
pandoc -f dokuwiki -t markdown fichier.dokuwiki -o fichier.md
# préférable dans le cas ou vous avez suivi l'étape d'installation manuelle :
# ./pandoc -f dokuwiki -t markdown fichier.dokuwiki -o fichier.md

Pages

Subscribe to RSS - tutoriel