Compare commits
No commits in common. "a1f7d1e0f2e512155e5b545fbbb2e8bfd86d3fbf" and "d96238bca40aaac5cb12629e9c0766550e8e1b91" have entirely different histories.
a1f7d1e0f2
...
d96238bca4
@ -175,10 +175,9 @@ 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{F66 rulz the world} des cartes
|
Dans l'ancien temps\footnote{F77 rulz the world}, le format de ces
|
||||||
à trous, le format de ces
|
lignes devait être précisement structure, avec des largeurs de champs
|
||||||
lignes devait être précisement structurées, avec des largeurs de champs
|
fixés.
|
||||||
dans la ligne fixés.
|
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@ -187,51 +186,7 @@ dans la ligne 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. Ensuite, on y accède par son rang, son numéro d'ordre dans le
|
taille
|
||||||
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}
|
|
||||||
|
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@ -261,7 +216,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}
|
||||||
@ -273,17 +228,9 @@ 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}
|
||||||
@ -299,22 +246,15 @@ 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{Giant Complicated Compilords}, les
|
Comme d'habitude avec gcc\footnote{The Gnu Compiler Collection}, 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}
|
||||||
@ -399,7 +339,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 voir comme un cheminement, nous allons demander
|
aisément voire 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,10 +63,6 @@ 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,16 +129,14 @@ C'est simple, non ?
|
|||||||
|
|
||||||
%-------------------------------------------------------------------
|
%-------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Le WindowManager}
|
\section{Le Windowmanager}
|
||||||
|
|
||||||
Aka \textbf{WM}\index{WM}.
|
Aka \textbf{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 avec l'aide du Tetalab\index{tetalab}.
|
fort sympathique.
|
||||||
|
|
||||||
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,28 +1,7 @@
|
|||||||
\chapter{scripting}
|
\chapter{scripting}
|
||||||
|
|
||||||
Qu'est-ce que le \textsl{scripting} ?
|
XXX
|
||||||
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
|
||||||
@ -66,7 +45,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.
|
sommaire d'une sphère de povray\footnote{SDL keyword: \texttt{sphere}}.
|
||||||
|
|
||||||
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
|
||||||
@ -84,26 +63,21 @@ 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 est dans notre cas la dernière ligne.
|
qui sera 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 Bubulles = object
|
#declare Bubules = object
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
sphere { <17.000000, 9.000000, 4.000000>, 1.500000 }
|
sphere { <17.000000, 9.000000, 4.000000>, 1.500000 }
|
||||||
@ -111,93 +85,14 @@ 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 !}
|
|
||||||
|
|
||||||
Ce premier exemple nous a montré comment, avec quelques
|
% XXX to be continued XXX
|
||||||
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.
|
|
||||||
|
|
||||||
% ===============================================================
|
% ===============================================================
|
||||||
|
|
||||||
|
|
||||||
|
107
chap/shell.tex
107
chap/shell.tex
@ -74,7 +74,7 @@ tests et les boucles.
|
|||||||
|
|
||||||
% --------------------------------------------------------------
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
\subsection{Le shebang} \index{shebang} \label{shebang}
|
\subsection{Le shebang} \index{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 "%x" 85 >> foo.sh
|
tth@redlady:~$ echo 'printf "%d" 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,31 +145,12 @@ Les plus importantes sont là : le choix, la boucle, l'attente.
|
|||||||
|
|
||||||
\subsection {Les tests}
|
\subsection {Les tests}
|
||||||
|
|
||||||
Deux éléments sont ils égaux ? Et d'abord, ces deux éléments
|
Deux éléments sont ils-égaux ?
|
||||||
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}
|
||||||
@ -192,48 +173,37 @@ 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 (9946)
|
Here Doc
|
||||||
|
|
||||||
1 +-------------------------------------------------------------+
|
1 +--------------------------------------------------------------------+
|
||||||
| + + + + + + + + + |
|
| +** *** + + + + |
|
||||||
| 0.7*sin(x) ******* |
|
0.8 |-+.......**..........:.**.......:..........:.........sin(x).*******-|
|
||||||
| ****** ****** |
|
| ** : : * : : : : |
|
||||||
0.5 |-+ ** ** ** ** +-|
|
0.6 |-+....**..:..........:....**....:..........:..........:..........:+-|
|
||||||
| ** * * ** |
|
| * : : * : : : : |
|
||||||
| ** ** ** ** |
|
0.4 |-+.**.....:..........:.......*..:..........:..........:..........:+-|
|
||||||
| ** ** ** ** |
|
| * : : * : : : : |
|
||||||
|* ** ** *|
|
0.2 |-*........:..........:.........**..........:..........:..........:+-|
|
||||||
0 |-+ * * +-|
|
|* : : * : : : |
|
||||||
| ** ** |
|
0 |-+........:..........:..........:**........:..........:..........:+-|
|
||||||
| * * |
|
| : : : * : : : *|
|
||||||
| * * |
|
-0.2 |-+........:..........:..........:..**......:..........:..........:*-|
|
||||||
-0.5 |-+ ** ** +-|
|
| : : : * : : * |
|
||||||
| *** *** |
|
-0.4 |-+........:..........:..........:.....*....:..........:........**:+-|
|
||||||
| ******* |
|
| : : : * : : * : |
|
||||||
| |
|
-0.6 |-+........:..........:..........:.......**.:..........:.....**...:+-|
|
||||||
| + + + + + + + + + |
|
| : : : *: : ** : |
|
||||||
-1 +-------------------------------------------------------------+
|
-0.8 |-+........:..........:..........:..........**.........:..**......:+-|
|
||||||
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.
|
||||||
@ -250,23 +220,6 @@ 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,19 +2,10 @@
|
|||||||
\label{chap:son}
|
\label{chap:son}
|
||||||
|
|
||||||
Abordons maintenant un sujet complexe :
|
Abordons maintenant un sujet complexe :
|
||||||
le son en général, et en particulier avec Linux.
|
le son en général,
|
||||||
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}
|
||||||
@ -42,8 +33,6 @@ 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
|
||||||
@ -59,13 +48,6 @@ 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}
|
||||||
@ -147,8 +129,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,
|
considérable de formats de fichiers\footnote{Mais ceci est une autre
|
||||||
que nous verrons peut-être un de ces jours\dots.
|
histoire, 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.
|
||||||
@ -182,11 +164,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 3.5 standard, casque audio USB\dots).
|
et la partie matérielle (jack 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,10 +21,6 @@ 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
|
||||||
@ -62,29 +58,6 @@ 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}
|
||||||
@ -124,14 +97,13 @@ 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 :
|
Quelques options à connaitre : \texttt{-S} échange des
|
||||||
\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}.
|
||||||
|
|
||||||
|
16
code/arguments.c
Normal file
16
code/arguments.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
@ -1,20 +0,0 @@
|
|||||||
#!/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,8 +2,7 @@
|
|||||||
|
|
||||||
# create the sdl object: an union of sphere
|
# create the sdl object: an union of sphere
|
||||||
BEGIN {
|
BEGIN {
|
||||||
nbre = 0
|
print "#declare Bubules = object"
|
||||||
print "#declare Bubulles = object"
|
|
||||||
print "{ \nunion { "
|
print "{ \nunion { "
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11,11 +10,9 @@ 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}"
|
print " }\n}\n"
|
||||||
printf "// %d bubulles\n", nbre
|
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,3 @@
|
|||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
|
7
code/hello.c
Normal file
7
code/hello.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
puts("hello world.");
|
||||||
|
return 0;
|
||||||
|
}
|
15
code/listen-osc.c
Normal file
15
code/listen-osc.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/* 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;
|
||||||
|
}
|
18
code/send-osc.c
Normal file
18
code/send-osc.c
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/* 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 size 72,24
|
set term dumb
|
||||||
# set grid
|
set grid
|
||||||
set title "$TITLE"
|
set title "$TITLE"
|
||||||
plot [x=0:pi*3] [-1:1] 0.7*sin(x)
|
plot [x=0:pi*2] sin(x)
|
||||||
__EOC__
|
__EOC__
|
4
numberlines.awk
Executable file
4
numberlines.awk
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/awk -f
|
||||||
|
|
||||||
|
{ printf "%5d\t%s\n", NR, $0; }
|
||||||
|
|
@ -28,8 +28,7 @@
|
|||||||
\setlength \parskip {0.30em} % XXX
|
\setlength \parskip {0.30em} % XXX
|
||||||
|
|
||||||
%------ reglages des 'listings'
|
%------ reglages des 'listings'
|
||||||
\lstset{frame=none} % éventuel dessin d'un cadre autour du listing
|
\lstset{frame=single} % 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}
|
||||||
|
|
||||||
@ -127,16 +126,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}
|
||||||
@ -154,10 +153,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}
|
||||||
@ -170,9 +169,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