arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |

details.sh (4185B)


      1 #! page
      2 title: Des détails
      3 author: Arthur Pons
      4 description: Plus de détails sur comment construire et gérer une playlist pour le nouvel an avec des outils simples et sobres
      5 publication: 2023-11-15
      6 sectionmd: main
      7 
      8 
      9 ## t2s2t
     10 
     11 C'est super nul comme nom. Sinon voici le code :
     12 
     13 	#! /bin/sh
     14 
     15 	if [ ! "$1" = "-r" ]
     16 	then
     17 		sed 's/:/*3600+/;s/:/*60+/' | bc -l
     18 	else
     19 		xargs printf 'tot=%s;
     20 					  hours=tot/3600;
     21 					  minutes=(tot-3600*hours)/60;
     22 					  seconds=tot-3600*hours-60*minutes;
     23 					  print hours,":",minutes,":",seconds,"\n";
     24 					  \n' |
     25 		bc |
     26 		sed -E 's/^[0-9]:/0&/;
     27 				s/:([0-9]):/:0\1:/;
     28 				s/:([0-9])$/:0\1/'
     29 	fi
     30 
     31 En gros si le script est utilisé dans le sens `hh:mm:ss -> ssss` alors on
     32 remplace simplement le premier `:` par `*3600+` et le second par `*60+`. Ainsi
     33 pour 01:23:55 on obtient l'expression mathématique `01*3600+23*60+55` que l'on
     34 donne à `bc` et hop le tour est joué.
     35 
     36 Si le script est utilisé dans l'autre sens le problème est un peu plus
     37 compliqué.  Les commandes `bc` (après le `printf`) fonctionnent parce
     38 qu'appeler `bc` sans l'option `-l` empêche les opérations sur des flottants et
     39 arrondi donc tout à l'entier inférieur. Ainsi `3654/3600` donne `1`, c'est à
     40 dire le nombre d'heures dans 3654 secondes. On soustrait ensuite le nombre
     41 d'heures complètes au total pour le diviser par 60 pour avoir le nombre de
     42 minutes complètes au delà du nombre d'heures complètes.  `(3654-3600*1)/60`
     43 donne `54/60` qui donne `0` puis de même avec les secondes qui ici va donner
     44 `54`. Finalement on affiche les trois variables séparées avec des `:`. Afin de
     45 pouvoir manger une potentielle longue liste de valeur on utilise `xargs` et
     46 `printf`.
     47 
     48 Admettons que l'on a la liste suivante :
     49 
     50 	seq 200 205
     51 
     52 	200
     53 	201
     54 	202
     55 	203
     56 	204
     57 	205
     58 
     59 Notre commande xargs va générer la commande printf suivante :
     60 	printf 'tot=%s;
     61 	        hours=tot/3600;
     62 	        minutes=(tot-3600*hours)/60;
     63 	        seconds=tot-3600*hours-60*minutes;
     64 	        print hours,":",minutes,":",seconds,"\n";' 200 201 202 203 204 205
     65 
     66 Qui déroulée va donner
     67 
     68 	tot=200;
     69 	hours=tot/3600;
     70 	minutes=(tot-3600*hours)/60;
     71 	seconds=tot-3600*hours-60*minutes;
     72 	print hours,":",minutes,":",seconds,"\n";
     73 
     74 puis pareil avec `201` etc. On met tout dans `bc` puis on passe un coup de
     75 `sed` pour ajouter des `0` quand il en manque.
     76 
     77 ## cumulduration
     78 
     79 Le code est celui-ci :
     80 
     81 	#! /bin/sh
     82 
     83 	tot=0
     84 	for duration in $(cat)
     85 	do
     86 		tot=$(( tot + $duration ))
     87 		echo $tot
     88 	done
     89 
     90 On boucle sur chaque ligne dans STDIN. Pour chacune d'entre elle on ajoute la
     91 valeur lue au total et on affiche sa valeur courante. Simple efficace.
     92 
     93 ## predict
     94 
     95 Le code :
     96 
     97 	#!/bin/sh
     98 
     99 	echo "0\n$(cat)" |
    100 		xargs printf "$(date -Iseconds --date "$1")+%sseconds\n" |
    101 		date -f - +"%X"
    102 
    103 On ajoute un `0` en début de flux sinon le résultat nous dira que la première
    104 chanson se lance après sa propre durée. Il faut donc lui faire croire qu'il
    105 existe une première de durée nulle. On construit une commande `printf` avec en
    106 argument toutes les durées en seconde de façon à construire tous les formats de
    107 date. Notez le `$1` qui permet de passer le date de début en argument à predict.
    108 Par exemple pour une date de début au 31 décembre à 19h :
    109 
    110 	seq 200 210 | 
    111 			xargs printf "$(date -Iseconds --date "dec 31 19:00")+%sseconds\n"
    112 
    113 Lancera la commande
    114 
    115 	printf "2023-12-31T19:00:00+01:00+%sseconds\n" 200 201 202 203 204 205 206 207 208 209 210
    116 
    117 qui donne :
    118 
    119 	2023-12-31T19:00:00+01:00+200seconds
    120 	2023-12-31T19:00:00+01:00+201seconds
    121 	2023-12-31T19:00:00+01:00+202seconds
    122 	2023-12-31T19:00:00+01:00+203seconds
    123 	2023-12-31T19:00:00+01:00+204seconds
    124 	2023-12-31T19:00:00+01:00+205seconds
    125 	2023-12-31T19:00:00+01:00+206seconds
    126 	2023-12-31T19:00:00+01:00+207seconds
    127 	2023-12-31T19:00:00+01:00+208seconds
    128 	2023-12-31T19:00:00+01:00+209seconds
    129 	2023-12-31T19:00:00+01:00+210seconds
    130 
    131 formats qui mangés par `date` en demandant de n'afficher que l'heure donnent :
    132 
    133 	printf "2023-12-31T19:00:00+01:00+%sseconds\n" 200 201 202 203 204 205 206 207 208 209 210 |
    134 		date -f - +"%X"
    135 
    136 	19:03:20
    137 	19:03:21
    138 	19:03:22
    139 	19:03:23
    140 	19:03:24
    141 	19:03:25
    142 	19:03:26
    143 	19:03:27
    144 	19:03:28
    145 	19:03:29
    146 	19:03:30
    147 
    148 En tout 24 lignes de code.