Vous êtes ici

linux

Recette CopyQ : ouvrir un chemin absolu d'un fichier dans le programme adéquat via mimeopen

Copier le texte ci-dessous et le coller simplement dans la fenêtre de CopyQ dédiée aux commandes personnalisées (menu Fichier > Commandes) vous permettra d'ouvrir avec le programme adéquat et via un menu contextuel n'importe quel chemin absolu de fichier qui se trouve dans l'historique de votre presse papier.

[Command]
Command="
    copyq execute mimeopen -n %1"
HideWindow=true
Icon=\xf0ac
InMenu=true
Match=^/|//|(/[\\w-]+)+$\n
Name=Ouvrir via mimeopen

Débutant en informatique et intimidé par la ligne de commande ? Implémentez un premier alias qui pourrait réalistement vous émanciper d'un gestionnaire de fichiers graphique

Book Folder File - Free vector graphic on Pixabay https://pixabay.com/vectors/book-folder-file-notebook-159747/

Supposons que vous ayez beaucoup de fichiers sur un disque dur ou un serveur de fichiers avec une arborescence de dossiers profonde, complexe et que vous ne vous souveniez plus exactement de son emplacement. Même avec un bon gestionnaire de fichiers graphique comme l'explorateur Windows retrouver et ouvrir le document que vous cherchez va requérir beaucoup de temps, d'autant que l'Indexation et la recherche par mot clé sur des systèmes d'exploitation comme Microsoft Windows ne sont pas toujours très convaincants.

Voici une commande qui pourrait vous aider. A vous ensuite d'en créer d'autre ou de l'adapter à vos besoins.

Prérequis

Au préalable

Ouvrez un émulateur de terminal :

Touche "Super" sous GNOME, saisir "term" puis appuyez sur entrée.

Créer un fichier texte dans u sous dossier

mkdir -p ~/dossier/et/sous/dossier
echo "test" > ~/dossier/et/sous/dossier/monfichier.txt

Mettez à jour l'index des fichiers de votre système

sudo updatedb

Normalement cette indexation devrait se faire régulièrement sinon la paramétrer avec cron

Définissez quelques associations par défaut pour types de fichiers

Tant qu'à faire avec le fichier que l'on vient de créer

mimeopen -d monfichier.txt

Choisir :

"2) Other"

Et saisir avant de valider :

/usr/bin/nano

S'il retourne un message d'erreur la pemière fois, créer le dossier qui va contenir le fichier de configuration de mimeopen {.is-warning}

Création de l'alias

alias ouvre='mimeopen -n "$( ls "$(locate * | fzf -i -e)" )"'

Utilisation de l'alias

C'est le plus compliqué ! 😅
Saisir et valider :

ouvre

Puis saisir simplement un(des) bout(s) de nom(s) de dossier(s) et/ou de fichier(s) avec un espace pour les séparer.
Par exemple, si vous ne vous souvenez plus du nom complet du dossier et du fichier :

ossier fichi

Faites votre choix avec les flèches et du clavier.

... magique 🤩

Vous pourriez rendre le processus encore plus performant en créant la base d'indexation en mémoire vive dans l'espace utilisateur plutôt que sur le SSD (ou pire le disque dur). Pour cela vous devrez utiliser l'option -o de updatedb

sudo updatedb -o /chemin/de/l/index

et lors de la recherche avec la commande locate, l'option -d

alias ouvre='mimeopen -n "$( ls "$(locate -d /chemin/de/l/index * | fzf -i -e)" )"'

Rendre permanent l'alias

Il faut ajouter la création de l'alias au fichier .bashrc

echo $'alias ouvre=\'mimeopen "$( ls "$(locate * | fzf -i -e)" )"\'' >> .bashrc

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

Pages

Subscribe to RSS - linux