Compare commits
18 Commits
d96238bca4
...
a1f7d1e0f2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a1f7d1e0f2 | ||
![]() |
2dd4896b6c | ||
![]() |
b252bf73a2 | ||
![]() |
7ed54fc123 | ||
![]() |
48b66b3034 | ||
![]() |
2bb29f37e3 | ||
![]() |
b67ce482bf | ||
![]() |
b98ae9d629 | ||
![]() |
615289b57e | ||
![]() |
02054433b4 | ||
![]() |
5723a754a8 | ||
![]() |
7e591fc958 | ||
![]() |
3bda7ea69b | ||
![]() |
a1b0ffdabb | ||
![]() |
16e1d7707a | ||
![]() |
716345e270 | ||
![]() |
a1df488c58 | ||
![]() |
9f129f64d9 |
@ -175,9 +175,10 @@ XXX\index{XXX}
|
|||||||
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
|
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
|
||||||
comme quand on déroule une bande 6250bpi. Ces unités peuvent être
|
comme quand on déroule une bande 6250bpi. Ces unités peuvent être
|
||||||
(restons simple pour commencer) des lignes entières de texte.
|
(restons simple pour commencer) des lignes entières de texte.
|
||||||
Dans l'ancien temps\footnote{F77 rulz the world}, le format de ces
|
Dans l'ancien temps\footnote{F66 rulz the world} des cartes
|
||||||
lignes devait être précisement structure, avec des largeurs de champs
|
à trous, le format de ces
|
||||||
fixés.
|
lignes devait être précisement structurées, avec des largeurs de champs
|
||||||
|
dans la ligne fixés.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@ -186,7 +187,51 @@ fixés.
|
|||||||
XXX\index{XXX}
|
XXX\index{XXX}
|
||||||
|
|
||||||
C'est pas pareil : d'abord les enregistrements sont tous de la même
|
C'est pas pareil : d'abord les enregistrements sont tous de la même
|
||||||
taille
|
taille. Ensuite, on y accède par son rang, son numéro d'ordre dans le
|
||||||
|
fichier. Dès que j'ai fini de planter les deux arbres en attente,
|
||||||
|
je vous propose un exemple simple et aussi artificiel que les
|
||||||
|
autres exemples de ce ouvrage.
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
|
||||||
|
\section{Read et Write}
|
||||||
|
|
||||||
|
Ces deux opérations (la lecture et l'écriture) sont contrôlables
|
||||||
|
par plusieurs choses~: les paramètres à l'ouverture,
|
||||||
|
du fichier, à XXX\index{XXX},
|
||||||
|
et surtout les chaines de format.
|
||||||
|
Bienvenue dans le monde du légendaire champ "Hollerith".
|
||||||
|
|
||||||
|
\subsection{Les chaines de format}
|
||||||
|
|
||||||
|
%
|
||||||
|
% attention, il y a un hack pour l'affichage du mot "format" !
|
||||||
|
% Attention, dans "{\small{\textsc{format}}}", les accolades
|
||||||
|
% exterieures sont indispensables. Affaire à suivre...
|
||||||
|
%
|
||||||
|
La chaine de {\small{\textsc{format}}} contrôle la façon dont les
|
||||||
|
données (nombres, textes ou booleans)
|
||||||
|
seront présentées à l'affiche ou à l'impression.
|
||||||
|
Une bonne connaissance, et une longue pratique des chaines de
|
||||||
|
{\small{\textsc{format}}} est
|
||||||
|
indispendable pour arriver à l'harmonie ultime bien que rigoureuse,
|
||||||
|
de vos interminables listings de chiffres abscons.
|
||||||
|
Nous verrons ensuite comment les utiliser pour faire de la saisie
|
||||||
|
presque (mais pas complètement) utilisable en milieu
|
||||||
|
\textsl{enduser}\index{enduser}.
|
||||||
|
|
||||||
|
Il y a deux manières de les utiliser~: en ligne de l'instruction
|
||||||
|
d'écriture/lecture, ou séparément en tant que chaine de caractères.
|
||||||
|
Pour la clarté de lecture, c'est la seconde que je vais utiliser.
|
||||||
|
|
||||||
|
%
|
||||||
|
%
|
||||||
|
%
|
||||||
|
% INSERT BIG "TODO" HERE.
|
||||||
|
%
|
||||||
|
%
|
||||||
|
\lstinputlisting{code/fortran/printty.f90}
|
||||||
|
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@ -216,7 +261,7 @@ end module
|
|||||||
|
|
||||||
Rien de bien compliqué~:
|
Rien de bien compliqué~:
|
||||||
Un module peut être vu comme une boite qui contient (\texttt{contains})
|
Un module peut être vu comme une boite qui contient (\texttt{contains})
|
||||||
des procédures (\texttt{function} ou \texttt{subroutine},
|
des procédures (\texttt{function} ou \texttt{subroutine}),
|
||||||
et qui sera utilisé avec ce genre de petit programme~:
|
et qui sera utilisé avec ce genre de petit programme~:
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
@ -228,9 +273,17 @@ program t
|
|||||||
end program
|
end program
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
La première ligne, \texttt{use dummy}, permet d'accéder aux fonctions disponibles
|
||||||
|
dans le module dummy.
|
||||||
|
Elle doit être suivie d'un \texttt{implicit none}, pour une raison à éclaircir.
|
||||||
|
Et ensuite nous pouvons appeler notre procédure.
|
||||||
|
|
||||||
|
Mais les modules permettent de faire bien d'autre choses.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
\section{Random et Aléa}
|
\section{Random et Aléa}
|
||||||
|
|
||||||
|
Tentative de sranding faite à la rache.
|
||||||
La dernière ligne va vous étonner.
|
La dernière ligne va vous étonner.
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
@ -246,15 +299,22 @@ La dernière ligne va vous étonner.
|
|||||||
dummy = rand()
|
dummy = rand()
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Mais il y a d'autres manières plus rigoureuses d'utiliser les nombres
|
||||||
|
pseudo-aléàtoires avec le fortan moderne.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
% new Thu 24 Nov 2022 02:27:05 AM CET
|
% new Thu 24 Nov 2022 02:27:05 AM CET
|
||||||
|
|
||||||
\section{Options de gfortran} \index{gfortran}
|
\section{Options de gfortran} \index{gfortran}
|
||||||
|
|
||||||
Comme d'habitude avec gcc\footnote{The Gnu Compiler Collection}, les
|
Comme d'habitude avec gcc\footnote{Giant Complicated Compilords}, les
|
||||||
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
|
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
|
||||||
mais ce ne sont probablement pas les seules.
|
mais ce ne sont probablement pas les seules.
|
||||||
|
|
||||||
|
Pour commencer, la plus obligatoire de toutes ces options est sans contexte
|
||||||
|
le protecteur de base \texttt{-Wall} qui vous protégera de nombreux
|
||||||
|
maléfices.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
\section{Images}
|
\section{Images}
|
||||||
@ -339,7 +399,7 @@ immédiatement garnir de données pertinentes~:
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Une fois en possession de ces données conceptuelles, que l'on peut
|
Une fois en possession de ces données conceptuelles, que l'on peut
|
||||||
aisément voire comme un cheminement, nous allons demander
|
aisément voir comme un cheminement, nous allons demander
|
||||||
au crayon de se promener sur notre feuille virtuelle en suivant
|
au crayon de se promener sur notre feuille virtuelle en suivant
|
||||||
ce chemin, et enfin de s'arreter de dessiner~:
|
ce chemin, et enfin de s'arreter de dessiner~:
|
||||||
|
|
||||||
|
@ -63,6 +63,10 @@ Vous voilà prévenus, la suite bientôt\dots
|
|||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
|
\section{Les sockets Unix} \index{socket}
|
||||||
|
|
||||||
|
Les sockets de la famille AF\_UNIX sont utilisés pour
|
||||||
|
les communications locales entre applications sur une même machine.
|
||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
|
@ -129,14 +129,16 @@ C'est simple, non ?
|
|||||||
|
|
||||||
%-------------------------------------------------------------------
|
%-------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Le Windowmanager}
|
\section{Le WindowManager}
|
||||||
|
|
||||||
Aka \textbf{WM}.
|
Aka \textbf{WM}\index{WM}.
|
||||||
|
|
||||||
%
|
%
|
||||||
% https://jichu4n.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i/
|
% https://jichu4n.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i/
|
||||||
%
|
%
|
||||||
|
|
||||||
|
Twm, Fvwm, Mwm... nous avons le choix.
|
||||||
|
|
||||||
%-------------------------------------------------------------------
|
%-------------------------------------------------------------------
|
||||||
|
|
||||||
\section{XCB}\index{XCB}
|
\section{XCB}\index{XCB}
|
||||||
|
@ -7,6 +7,6 @@
|
|||||||
|
|
||||||
% =======================================================================
|
% =======================================================================
|
||||||
|
|
||||||
\section{xpaint} \index{xpaint }
|
\section{xpaint} \index{xpaint}
|
||||||
|
|
||||||
% =======================================================================
|
% =======================================================================
|
||||||
|
@ -19,7 +19,7 @@ gnuplot> splot "cam.indoor" using 2:4:3, "cam.indoor" using 5:7:6
|
|||||||
|
|
||||||
Un exemple réel, issu d'un projet d'élevage d'algues
|
Un exemple réel, issu d'un projet d'élevage d'algues
|
||||||
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
|
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
|
||||||
fort sympathique.
|
fort sympathique avec l'aide du Tetalab\index{tetalab}.
|
||||||
|
|
||||||
Le fichier des données contient cinq champs séparés par des espaces
|
Le fichier des données contient cinq champs séparés par des espaces
|
||||||
ou des tabulations.
|
ou des tabulations.
|
||||||
|
@ -1,7 +1,28 @@
|
|||||||
\chapter{scripting}
|
\chapter{scripting}
|
||||||
|
|
||||||
XXX
|
Qu'est-ce que le \textsl{scripting} ?
|
||||||
|
C'est l'art de coller entre eux divers outils logiciels
|
||||||
|
afin de réaliser une tache donnée.
|
||||||
|
Le "collage" est fait par un \textbf{script},
|
||||||
|
lequel est un fichier texte, écrit dans divers
|
||||||
|
langages (plus ou moins spécifiques) et qui sera lu et exécuté
|
||||||
|
par un interpréteur.
|
||||||
|
|
||||||
|
Je ne vais pas revenir sur l'art du shebang, si vous ne
|
||||||
|
le connaissez pas, c'est expliqué page \pageref{shebang}.
|
||||||
|
En bref, c'est la manière dont le script sélectionne
|
||||||
|
le bon interpréteur lors de son lancement.
|
||||||
|
|
||||||
|
Quels sont les langages courrament utilisés pour faire du
|
||||||
|
script ? Il y a une bonne poignée de réponses à ça.
|
||||||
|
La première étant souvent « Use The Shell ! »,
|
||||||
|
et la seconde « tu as songé à awk ? »,
|
||||||
|
ce qui est tout aussi sensé.
|
||||||
|
Le shell étant dégrossi page \pageref{chap:shell},
|
||||||
|
passons directement au langage Awk.
|
||||||
|
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
\section{Awk} \index{Awk}
|
\section{Awk} \index{Awk}
|
||||||
|
|
||||||
Awk est un langage de programmation crée
|
Awk est un langage de programmation crée
|
||||||
@ -45,7 +66,7 @@ des espaces et/ou des tabulations.
|
|||||||
|
|
||||||
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
|
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
|
||||||
petite collection de bubulles. Pratiquement, une représentation
|
petite collection de bubulles. Pratiquement, une représentation
|
||||||
sommaire d'une sphère de povray\footnote{SDL keyword: \texttt{sphere}}.
|
sommaire d'une sphère de povray.
|
||||||
|
|
||||||
Le fichier à générer est en trois partie : l'en-tête, la liste
|
Le fichier à générer est en trois partie : l'en-tête, la liste
|
||||||
des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord
|
des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord
|
||||||
@ -63,21 +84,26 @@ deux d'entre eux étant précédés d'une « instruction ».
|
|||||||
|
|
||||||
Le premier bloc, avec le mot-clef \textsc{BEGIN}, est exécuté
|
Le premier bloc, avec le mot-clef \textsc{BEGIN}, est exécuté
|
||||||
avant la lecture de la première ligne des données en entrée.
|
avant la lecture de la première ligne des données en entrée.
|
||||||
|
Ce qui est le bon moment pour initialiser des variables.
|
||||||
Nous l'utilisons pour créer l'en-tête d'un descripteur
|
Nous l'utilisons pour créer l'en-tête d'un descripteur
|
||||||
d'objet pour Povray.
|
d'objet pour Povray.
|
||||||
|
|
||||||
Le second bloc (sans label) est exécuté pour chaque ligne lue.
|
Le second bloc (sans label) est exécuté pour chaque ligne lue.
|
||||||
Et c'est ici que nous trouverons la magie.
|
Et c'est ici que nous trouverons la magie.
|
||||||
|
La ligne lue depuis l'entrée a été découpée selon le
|
||||||
|
séparateur FS, et les tranches sont connues sous les noms
|
||||||
|
de \$1, \$2, ... \$N (la ligne entière étant \$0)
|
||||||
|
que nous utilisons dans la génération de la bubulle.
|
||||||
|
|
||||||
Et le troisième bloc (\textsc{END}) sera exécuté à la fin, après
|
Et le troisième bloc (\textsc{END}) sera exécuté à la fin, après
|
||||||
la lecture et le traitement du dernier enregistrement,
|
la lecture et le traitement du dernier enregistrement,
|
||||||
qui sera dans notre cas la dernière ligne.
|
qui est dans notre cas la dernière ligne.
|
||||||
|
|
||||||
Et à l'exécution~:
|
Et à l'exécution~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@redlady:~/Devel/TetaTricks/code/awk$ ./mkunion.awk < dataset
|
tth@redlady:~/Devel/TetaTricks/code/awk$ ./mkunion.awk < dataset
|
||||||
#declare Bubules = object
|
#declare Bubulles = object
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
sphere { <17.000000, 9.000000, 4.000000>, 1.500000 }
|
sphere { <17.000000, 9.000000, 4.000000>, 1.500000 }
|
||||||
@ -85,14 +111,93 @@ union {
|
|||||||
sphere { <0.000000, 0.000000, 0.000000>, 1.000000 }
|
sphere { <0.000000, 0.000000, 0.000000>, 1.000000 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 3 bubulles
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
|
\subsection{Mais ce n'est pas tout !}
|
||||||
|
|
||||||
% XXX to be continued XXX
|
Ce premier exemple nous a montré comment, avec quelques
|
||||||
|
lignes de code facile à comprendre, transformer des
|
||||||
|
données et faire quelques calculs avec ces données.
|
||||||
|
Nous avons vu le découpage de la ligne d'entrée, mais
|
||||||
|
ce n'est pas tout, je suis passé très vite sur ce sont
|
||||||
|
ces "labels" dont j'ai parlé.
|
||||||
|
|
||||||
|
Ce ne sont absolument pas des labels, ni des mot-clefs,
|
||||||
|
mais quelque chose de bien plus puissant.
|
||||||
|
C'est le mécanisme qui permet de sélectionner les lignes
|
||||||
|
sur lesquelles nous voulons appliquer un traitement.
|
||||||
|
|
||||||
|
Nous avons déja vu \textsc{BEGIN} et \textsc{END},
|
||||||
|
pour lancer du code avant-le-début et/ou après-la-fin.
|
||||||
|
Mais nous pouvons mettre des bouts de code donnant un résultat
|
||||||
|
booléen, oui/non, qui conditionnera l'exécution du
|
||||||
|
bloc de code ainsi
|
||||||
|
préfixé\footnote{J'ai l'impression de pas être très clair ?},
|
||||||
|
ce qui nous donnera des possibilités de filtrage
|
||||||
|
surpuissantes.
|
||||||
|
|
||||||
|
Par exemple, nous ne voulons pas de bubulle trop
|
||||||
|
petite, il suffit de précéder le second bloc de l'exemple
|
||||||
|
déja vu par un test sur la taille qui est dans
|
||||||
|
le quatrième champ du fichier d'entrée~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
$4 > 0.999 {
|
||||||
|
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
||||||
|
$1, $2, $3, $4 )
|
||||||
|
}
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Vous comprenez maintenant les deux plus importantes choses
|
||||||
|
que l'on peut trouver dans Awk (/me fan).
|
||||||
|
|
||||||
|
XXX to be continued \index{XXX}
|
||||||
|
|
||||||
% ===============================================================
|
% ===============================================================
|
||||||
\subsection{Définir une fonction}
|
\subsection{Définir une fonction}
|
||||||
|
|
||||||
|
Bien, nous savons maintenant générer des bubulles avec un
|
||||||
|
filtrage sur la taille, mais nous voudrions maintenant procéder
|
||||||
|
à des calculs sur les données que nous lisons.
|
||||||
|
Deux choix s'offrent à nous, soit faire ça directement dans
|
||||||
|
le deuxième bloc, soit utiliser un sous-programme dédié.
|
||||||
|
Pour des raisons aussi bien didactiques que de bon sens,
|
||||||
|
nous allons opter pour la seconde solution.
|
||||||
|
|
||||||
|
Mais voyons d'abord la syntaxe d'une fonction, avec en prime
|
||||||
|
une petite astuce: si vous voulez utiliser Awk dans devoir
|
||||||
|
lui fournir de données en entrée, c'est simple, mettez tout
|
||||||
|
dans le bloc \textsc{BEGIN}.
|
||||||
|
|
||||||
|
\lstinputlisting[]{code/awk/demo-func.awk}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Devel/TetaTricks/code/awk$ ./demo-func.awk
|
||||||
|
---- demo fonction ----
|
||||||
|
sin(1.000000) = 0.841471
|
||||||
|
distance from center = 0.707107
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
|
La deuxième fonction demande quelques explications, puisqu'elle
|
||||||
|
met en œuvre un « awkisme » de bon aloi.
|
||||||
|
En effet, Awk ne connait pas les variables locales à une fonction,
|
||||||
|
c'est-à-dire connues seulement à l'intérieur de celle-ci.
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
|
|
||||||
|
\subsection{Les variables}
|
||||||
|
|
||||||
|
Et puisque on en parle...
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
|
|
||||||
|
\subsection{Pattern filtering} \index{pattern}
|
||||||
|
|
||||||
|
Wesh, regexp.
|
||||||
|
|
||||||
% ===============================================================
|
% ===============================================================
|
||||||
|
|
||||||
|
|
||||||
|
103
chap/shell.tex
103
chap/shell.tex
@ -74,7 +74,7 @@ tests et les boucles.
|
|||||||
|
|
||||||
% --------------------------------------------------------------
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
\subsection{Le shebang} \index{shebang}
|
\subsection{Le shebang} \index{shebang} \label{shebang}
|
||||||
|
|
||||||
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
|
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
|
||||||
au tout début d'un script shell.
|
au tout début d'un script shell.
|
||||||
@ -99,7 +99,7 @@ l'usage à l'instant, avec la création d'un script complet~:
|
|||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@redlady:~$ echo '#!/bin/bash' > foo.sh
|
tth@redlady:~$ echo '#!/bin/bash' > foo.sh
|
||||||
tth@redlady:~$ echo 'printf "%d" 85 >> foo.sh
|
tth@redlady:~$ echo 'printf "%x" 85 >> foo.sh
|
||||||
tth@redlady:~$ chmod u+x ./foo.sh
|
tth@redlady:~$ chmod u+x ./foo.sh
|
||||||
tth@redlady:~$ ./foo.sh
|
tth@redlady:~$ ./foo.sh
|
||||||
55
|
55
|
||||||
@ -145,12 +145,31 @@ Les plus importantes sont là : le choix, la boucle, l'attente.
|
|||||||
|
|
||||||
\subsection {Les tests}
|
\subsection {Les tests}
|
||||||
|
|
||||||
Deux éléments sont ils-égaux ?
|
Deux éléments sont ils égaux ? Et d'abord, ces deux éléments
|
||||||
|
sont-ils comparables ?
|
||||||
|
|
||||||
% --------------------------------------------------------------
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
\subsection {Les boucles}
|
\subsection {Les boucles}
|
||||||
|
|
||||||
|
Exemple très simple~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
for foo in A B C D
|
||||||
|
do
|
||||||
|
echo ${foo}
|
||||||
|
done
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Autre exemple, un peu moins simple~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
for foo in $(seq 0 37 133)
|
||||||
|
do
|
||||||
|
printf "foo = %3d\n" ${foo}
|
||||||
|
done
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
\section{Les fonctions}
|
\section{Les fonctions}
|
||||||
@ -173,37 +192,48 @@ Et comment les utiliser~:
|
|||||||
\section{Heredoc}
|
\section{Heredoc}
|
||||||
|
|
||||||
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
||||||
|
C'est un moyen simple et efficace de mettre des données textuelles
|
||||||
|
dans un script afin de les envoyer dans le \textsl{stdin} d'un
|
||||||
|
logiciel. Par exemple, quelques commandes pour générer un
|
||||||
|
graphique avec Gnuplot\index{gnuplot} sur la console \textsl{dumb}.
|
||||||
|
|
||||||
\lstinputlisting{code/shell/heredoc.sh}
|
\lstinputlisting{code/shell/heredoc.sh}
|
||||||
|
|
||||||
|
Après le \textsl{shebang}, nous avons la création de la variable
|
||||||
|
pour le titre,
|
||||||
|
et ensuite l'appel à Gnuplot avec la redirection
|
||||||
|
\texttt{$<<$ \_\_EOC\_\_} % bug affichage "<<"
|
||||||
|
qui va envoyer sur le stdin de Gnuplot la suite du
|
||||||
|
script shell (des commandes gnuplot), jusque au marqueur de fin,
|
||||||
|
qui est \texttt{\_\_EOC\_\_} dans notre cas.
|
||||||
|
|
||||||
|
... et la démonstration~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@redlady:~/Devel/TetaTricks$ code/shell/heredoc.sh
|
tth@redlady:~/Devel/TetaTricks/code/shell$ ./heredoc.sh
|
||||||
|
|
||||||
Here Doc
|
Here Doc (9946)
|
||||||
|
|
||||||
1 +--------------------------------------------------------------------+
|
1 +-------------------------------------------------------------+
|
||||||
| +** *** + + + + |
|
| + + + + + + + + + |
|
||||||
0.8 |-+.......**..........:.**.......:..........:.........sin(x).*******-|
|
| 0.7*sin(x) ******* |
|
||||||
| ** : : * : : : : |
|
| ****** ****** |
|
||||||
0.6 |-+....**..:..........:....**....:..........:..........:..........:+-|
|
0.5 |-+ ** ** ** ** +-|
|
||||||
| * : : * : : : : |
|
| ** * * ** |
|
||||||
0.4 |-+.**.....:..........:.......*..:..........:..........:..........:+-|
|
| ** ** ** ** |
|
||||||
| * : : * : : : : |
|
| ** ** ** ** |
|
||||||
0.2 |-*........:..........:.........**..........:..........:..........:+-|
|
|* ** ** *|
|
||||||
|* : : * : : : |
|
0 |-+ * * +-|
|
||||||
0 |-+........:..........:..........:**........:..........:..........:+-|
|
| ** ** |
|
||||||
| : : : * : : : *|
|
| * * |
|
||||||
-0.2 |-+........:..........:..........:..**......:..........:..........:*-|
|
| * * |
|
||||||
| : : : * : : * |
|
-0.5 |-+ ** ** +-|
|
||||||
-0.4 |-+........:..........:..........:.....*....:..........:........**:+-|
|
| *** *** |
|
||||||
| : : : * : : * : |
|
| ******* |
|
||||||
-0.6 |-+........:..........:..........:.......**.:..........:.....**...:+-|
|
| |
|
||||||
| : : : *: : ** : |
|
| + + + + + + + + + |
|
||||||
-0.8 |-+........:..........:..........:..........**.........:..**......:+-|
|
-1 +-------------------------------------------------------------+
|
||||||
| + + + + *** +** + |
|
0 1 2 3 4 5 6 7 8 9
|
||||||
-1 +--------------------------------------------------------------------+
|
|
||||||
0 1 2 3 4 5 6
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Je pense que l'exemple est assez parlant.
|
Je pense que l'exemple est assez parlant.
|
||||||
@ -220,6 +250,23 @@ Quelle sont les différences entre \texttt{en\_US.UTF-8} et
|
|||||||
\texttt{C.UTF-8} ?
|
\texttt{C.UTF-8} ?
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
% https://wiki.fiat-tux.fr/books/d%C3%A9veloppement/page/ajouter-des-couleurs-a-ses-scripts-shell
|
||||||
|
|
||||||
|
\section{Écrire en couleur} \index{ANSI} \index{escape}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
BLACK='\033[0;30m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[0;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
PURPLE='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
WHITE='\033[0;37m'
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
\section{Questions à voir}
|
\section{Questions à voir}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
|
28
chap/son.tex
28
chap/son.tex
@ -2,10 +2,19 @@
|
|||||||
\label{chap:son}
|
\label{chap:son}
|
||||||
|
|
||||||
Abordons maintenant un sujet complexe :
|
Abordons maintenant un sujet complexe :
|
||||||
le son en général,
|
le son en général, et en particulier avec Linux.
|
||||||
|
Vous pouvez aussi regarder
|
||||||
la musique (p. \pageref{chap:musique}) et la
|
la musique (p. \pageref{chap:musique}) et la
|
||||||
synthèse de sons (p. \pageref{chap:modular}).
|
synthèse de sons (p. \pageref{chap:modular}).
|
||||||
|
|
||||||
|
Complexe, parce que, il faut bien se le dire
|
||||||
|
entre nous, je me permet d'affirmer avec vigueur que la gestion du son
|
||||||
|
dans Linux est horriblement compliquée, pour ne pas dire
|
||||||
|
totalement bordélique.
|
||||||
|
C'est un empilement de couches logicielles, chacune destinée à
|
||||||
|
un usage particulier, et qui passent leur temps à se marcher
|
||||||
|
sur les pieds.
|
||||||
|
|
||||||
%------------------------------------------------------------------
|
%------------------------------------------------------------------
|
||||||
|
|
||||||
\section{ALSA}
|
\section{ALSA}
|
||||||
@ -33,6 +42,8 @@ Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
|
|||||||
qui permettent d'écouter et d'enregistrer les sets de
|
qui permettent d'écouter et d'enregistrer les sets de
|
||||||
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
||||||
|
|
||||||
|
Ils partagent beaucoup d'options communes.
|
||||||
|
|
||||||
\subsection{arecord}
|
\subsection{arecord}
|
||||||
|
|
||||||
Si vous avez plusieurs cartes son, la sélection du
|
Si vous avez plusieurs cartes son, la sélection du
|
||||||
@ -48,6 +59,13 @@ arecord -D plughw:CARD=Snowball,DEV=0 -v -r 22050 foo.wav
|
|||||||
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
|
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
\subsection{aplay} \index{aplay}
|
||||||
|
|
||||||
|
C'est le pendant de arecord pour écouter des fichiers sonores.
|
||||||
|
Avec pas mal d'options communes.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Du code...}
|
\subsection{Du code...}
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -129,8 +147,8 @@ serveur de stream comme Icecast\index{icecast}
|
|||||||
Libsndfile est essentiellement une très complète bibliothèque
|
Libsndfile est essentiellement une très complète bibliothèque
|
||||||
de lecture et écriture de fichiers sons.
|
de lecture et écriture de fichiers sons.
|
||||||
Elle permet de gérer facilement un nombre
|
Elle permet de gérer facilement un nombre
|
||||||
considérable de formats de fichiers\footnote{Mais ceci est une autre
|
considérable de formats de fichiers,
|
||||||
histoire, que nous verrons peut-être un de ces jours\dots}.
|
que nous verrons peut-être un de ces jours\dots.
|
||||||
|
|
||||||
Elle arrive avec une floppée d'outils en ligne de
|
Elle arrive avec une floppée d'outils en ligne de
|
||||||
commande, dont certains sont assez performants.
|
commande, dont certains sont assez performants.
|
||||||
@ -164,11 +182,11 @@ https://www.xiph.org/ao/doc/drivers.html
|
|||||||
Pour choisr comment et vers quelle prise physique libao va envoyer
|
Pour choisr comment et vers quelle prise physique libao va envoyer
|
||||||
le son, il y a deux choix à faire. La partie logicielle d'une part
|
le son, il y a deux choix à faire. La partie logicielle d'une part
|
||||||
(aixs, oss, alsa, jack, sndio\dots)
|
(aixs, oss, alsa, jack, sndio\dots)
|
||||||
et la partie matérielle (jack standard, casque audio USB\dots).
|
et la partie matérielle (jack 3.5 standard, casque audio USB\dots).
|
||||||
|
|
||||||
%------------------------------------------------------------------
|
%------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Portaudio} \label{Portaudio} \index{Portaudio}
|
\section{Portaudio} \label{Portaudio} \index{portaudio}
|
||||||
|
|
||||||
Une suggestion de Wargreen pour avancer un peu dans la construction
|
Une suggestion de Wargreen pour avancer un peu dans la construction
|
||||||
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
|
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
|
||||||
|
@ -21,6 +21,10 @@ image.
|
|||||||
|
|
||||||
\textsl{Video For Linux, second edition.}
|
\textsl{Video For Linux, second edition.}
|
||||||
|
|
||||||
|
%
|
||||||
|
% PLEASE EXPLAIN !
|
||||||
|
%
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@delirium:~$ v4l2-ctl --list-formats-ext
|
tth@delirium:~$ v4l2-ctl --list-formats-ext
|
||||||
ioctl: VIDIOC_ENUM_FMT
|
ioctl: VIDIOC_ENUM_FMT
|
||||||
@ -58,6 +62,29 @@ that shields its users from many of the difficulties and problems
|
|||||||
of using the V4L2 API directly.
|
of using the V4L2 API directly.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
% nouveau du Tue Sep 17 08:03:49 UTC 2024
|
||||||
|
|
||||||
|
\section{UVC} \index{UVC}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
L'USB video device class (aussi appelé USB video class abrégé en UVC)
|
||||||
|
est un protocole de gestion de périphériques électroniques vidéo via
|
||||||
|
les ports de type USB\index{USB}.
|
||||||
|
Il permet de gérer les flux vidéo dans différents encodages, les images fixes,
|
||||||
|
ainsi que le contrôle des appareils qui le permettent.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
|
||||||
|
Le jour\footnote{Lundi 17 septembre 2024}* où je me penche sur cette techno, premier souci~:
|
||||||
|
\textsl{Le pilote pour les WebCams UVC
|
||||||
|
– standard utilisé pour les caméras USB modernes –
|
||||||
|
n’est pas encore au point et n’est pas inclus dans les
|
||||||
|
versions publiées de Haiku.}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% --------------------------------------------------------------------
|
% --------------------------------------------------------------------
|
||||||
|
|
||||||
\section{GameBoy camera}
|
\section{GameBoy camera}
|
||||||
@ -97,13 +124,14 @@ fonctionne et le rendu ressemble.
|
|||||||
|
|
||||||
|
|
||||||
D'après la manpage :
|
D'après la manpage :
|
||||||
« \textit{
|
« \textit{%
|
||||||
vgrabbj is a program that will grab images from any v4l-capable device
|
vgrabbj is a program that will grab images from any v4l-capable device
|
||||||
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
|
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
|
||||||
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
|
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
|
||||||
} »
|
} »
|
||||||
|
|
||||||
Quelques options à connaitre : \texttt{-S} échange des
|
Quelques options à connaitre :
|
||||||
|
\texttt{-S} échange des
|
||||||
deux composantes R et B; \texttt{-s <device>} affiche
|
deux composantes R et B; \texttt{-s <device>} affiche
|
||||||
les capacités du périphérique v4l\index{v4l}.
|
les capacités du périphérique v4l\index{v4l}.
|
||||||
|
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
* afficher les arguments.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int foo;
|
|
||||||
|
|
||||||
for (foo=0; foo<argc; foo++) {
|
|
||||||
printf(" %3d %s\n", foo, argv[foo]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
0
code/awk/README.md
Normal file
0
code/awk/README.md
Normal file
20
code/awk/demo-func.awk
Executable file
20
code/awk/demo-func.awk
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/awk -f
|
||||||
|
BEGIN {
|
||||||
|
print "---- demo fonction ----"
|
||||||
|
print_sinus(1.0)
|
||||||
|
print_dist(0.5, 0.5, 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
# the simple version
|
||||||
|
function print_sinus ( value )
|
||||||
|
{
|
||||||
|
printf "sin(%f) = %f\n", value, sin(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
# version with local variables.
|
||||||
|
function print_dist(x, y, z, dist)
|
||||||
|
{
|
||||||
|
dist = sqrt(x*x + y*y + z*z)
|
||||||
|
printf "distance from center = %f\n", dist
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
# create the sdl object: an union of sphere
|
# create the sdl object: an union of sphere
|
||||||
BEGIN {
|
BEGIN {
|
||||||
print "#declare Bubules = object"
|
nbre = 0
|
||||||
|
print "#declare Bubulles = object"
|
||||||
print "{ \nunion { "
|
print "{ \nunion { "
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10,9 +11,11 @@ BEGIN {
|
|||||||
{
|
{
|
||||||
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
||||||
$1, $2, $3, $4 )
|
$1, $2, $3, $4 )
|
||||||
|
nbre++
|
||||||
}
|
}
|
||||||
|
|
||||||
# closing sdl structure
|
# closing sdl structure
|
||||||
END {
|
END {
|
||||||
print " }\n}\n"
|
print " }\n}"
|
||||||
|
printf "// %d bubulles\n", nbre
|
||||||
}
|
}
|
||||||
|
@ -3,3 +3,8 @@
|
|||||||
Pour les explications, il faut aller lire le livre ou
|
Pour les explications, il faut aller lire le livre ou
|
||||||
les codes source.
|
les codes source.
|
||||||
|
|
||||||
|
## Dessiner...
|
||||||
|
|
||||||
|
Je pense qe l'on devrait parler ici de plplot.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
puts("hello world.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
/* LISTEN OSC */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <lo/lo.h>
|
|
||||||
|
|
||||||
#define LOCAL_PORT "9000"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
lo_server_thread st;
|
|
||||||
|
|
||||||
st = lo_server_thread_new(LOCAL_PORT, NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
/* SEND OSC */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <lo/lo.h>
|
|
||||||
|
|
||||||
#define REMOTE_HOST "localhost"
|
|
||||||
#define REMOTE_PORT "9000"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
lo_address loana;
|
|
||||||
int foo;
|
|
||||||
|
|
||||||
loana = lo_address_new(REMOTE_HOST, REMOTE_PORT);
|
|
||||||
foo = lo_send(loana, "/dev/kmem", "is", 61, "meg, efface !");
|
|
||||||
fprintf(stderr, "foo %d\n", foo);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,10 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
TITLE="Here Doc"
|
TITLE="Here Doc ($$)"
|
||||||
|
|
||||||
gnuplot << __EOC__
|
gnuplot << __EOC__
|
||||||
set term dumb
|
set term dumb size 72,24
|
||||||
set grid
|
# set grid
|
||||||
set title "$TITLE"
|
set title "$TITLE"
|
||||||
plot [x=0:pi*2] sin(x)
|
plot [x=0:pi*3] [-1:1] 0.7*sin(x)
|
||||||
__EOC__
|
__EOC__
|
@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/awk -f
|
|
||||||
|
|
||||||
{ printf "%5d\t%s\n", NR, $0; }
|
|
||||||
|
|
@ -28,7 +28,8 @@
|
|||||||
\setlength \parskip {0.30em} % XXX
|
\setlength \parskip {0.30em} % XXX
|
||||||
|
|
||||||
%------ reglages des 'listings'
|
%------ reglages des 'listings'
|
||||||
\lstset{frame=single} % dessin d'un cadre autour du listing
|
\lstset{frame=none} % éventuel dessin d'un cadre autour du listing
|
||||||
|
|
||||||
\lstset{basicstyle=\ttfamily\small}
|
\lstset{basicstyle=\ttfamily\small}
|
||||||
\lstset{aboveskip=0.7em,belowskip=0.7em}
|
\lstset{aboveskip=0.7em,belowskip=0.7em}
|
||||||
|
|
||||||
@ -126,16 +127,16 @@ Your mileage may vary, film at 11\dots
|
|||||||
|
|
||||||
\input{chap/video}
|
\input{chap/video}
|
||||||
\input{chap/graphisme}
|
\input{chap/graphisme}
|
||||||
\input{chap/dessin} % nouveau 5 septembre 2024
|
% \input{chap/dessin} % nouveau 5 septembre 2024
|
||||||
\input{chap/gnuplot}
|
\input{chap/gnuplot}
|
||||||
\input{chap/print}
|
\input{chap/print}
|
||||||
\input{chap/webcam}
|
\input{chap/webcam}
|
||||||
% \input{chap/SCSI}
|
% \input{chap/SCSI}
|
||||||
\input{chap/X11}
|
\input{chap/X11}
|
||||||
\input{chap/wayland} % nouveau septembre 2023
|
% \input{chap/wayland} % nouveau septembre 2023
|
||||||
\input{chap/Fortran}
|
\input{chap/Fortran}
|
||||||
\input{chap/scripting}
|
\input{chap/scripting}
|
||||||
\input{chap/Arduino}
|
% \input{chap/Arduino}
|
||||||
\input{chap/Basic}
|
\input{chap/Basic}
|
||||||
\input{chap/R} % new octobre 2023
|
\input{chap/R} % new octobre 2023
|
||||||
% \input{chap/GMP}
|
% \input{chap/GMP}
|
||||||
@ -153,10 +154,10 @@ Your mileage may vary, film at 11\dots
|
|||||||
\input{chap/IPC}
|
\input{chap/IPC}
|
||||||
\input{chap/dosbox}
|
\input{chap/dosbox}
|
||||||
\input{chap/manpages}
|
\input{chap/manpages}
|
||||||
\input{chap/grub}
|
% \input{chap/grub}
|
||||||
\input{chap/photos}
|
\input{chap/photos}
|
||||||
\input{chap/plugins}
|
\input{chap/plugins}
|
||||||
\input{chap/Bonjour}
|
% \input{chap/Bonjour}
|
||||||
\input{chap/ioctl}
|
\input{chap/ioctl}
|
||||||
\input{chap/debug}
|
\input{chap/debug}
|
||||||
% \input{chap/buzybox}
|
% \input{chap/buzybox}
|
||||||
@ -169,9 +170,9 @@ Your mileage may vary, film at 11\dots
|
|||||||
\input{chap/webserver}
|
\input{chap/webserver}
|
||||||
\input{chap/hardware}
|
\input{chap/hardware}
|
||||||
\input{chap/gadgets}
|
\input{chap/gadgets}
|
||||||
\input{chap/sdr}
|
% \input{chap/sdr}
|
||||||
\input{chap/bdd} % nouveau 26 octobre 2022
|
\input{chap/bdd} % nouveau 26 octobre 2022
|
||||||
\input{chap/slang}
|
% \input{chap/slang}
|
||||||
\input{chap/curses}
|
\input{chap/curses}
|
||||||
% \input{chap/openwrt}
|
% \input{chap/openwrt}
|
||||||
\input{chap/WiFi}
|
\input{chap/WiFi}
|
||||||
|
Loading…
Reference in New Issue
Block a user