Compare commits
75 Commits
66bc3d19c4
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e823f5d883 | ||
|
|
00db540bbc | ||
|
|
470327b596 | ||
|
|
6790bb95ab | ||
|
|
e27ac13e68 | ||
|
|
e298d6ca5d | ||
|
|
b776f3de8d | ||
|
|
ac1afb5a88 | ||
|
|
a1c0fddd17 | ||
|
|
dfede4a816 | ||
|
|
784b2d04aa | ||
|
|
435b3195d2 | ||
|
|
dfdfa7926e | ||
|
|
6fad79d67c | ||
|
|
9c602777aa | ||
|
|
a1f7d1e0f2 | ||
|
|
2dd4896b6c | ||
|
|
b252bf73a2 | ||
|
|
7ed54fc123 | ||
|
|
48b66b3034 | ||
|
|
2bb29f37e3 | ||
|
|
b67ce482bf | ||
|
|
b98ae9d629 | ||
|
|
615289b57e | ||
|
|
02054433b4 | ||
|
|
5723a754a8 | ||
|
|
7e591fc958 | ||
|
|
3bda7ea69b | ||
|
|
a1b0ffdabb | ||
|
|
16e1d7707a | ||
|
|
716345e270 | ||
|
|
a1df488c58 | ||
|
|
9f129f64d9 | ||
|
|
d96238bca4 | ||
|
|
3ea16fbbc8 | ||
|
|
f7d11b4178 | ||
|
|
28933d542c | ||
|
|
0ee9005885 | ||
|
|
eda5044c35 | ||
|
|
0b3e6d1517 | ||
|
|
7ee4eb0930 | ||
|
|
57973a0bc7 | ||
|
|
f35170113d | ||
|
|
61286736e3 | ||
|
|
19e3db36ed | ||
|
|
3fc33f10ea | ||
|
|
f15aad0c2e | ||
|
|
3bd50b2ab5 | ||
|
|
a83761fea8 | ||
|
|
7abf55e44b | ||
|
|
1e175bc6ef | ||
|
|
0707c0192c | ||
|
|
13e00baba5 | ||
|
|
6aaf9de226 | ||
|
|
078d3d6b3a | ||
|
|
97f3cb336d | ||
|
|
ae2f0d965e | ||
|
|
0480a7a73f | ||
|
|
4b438e7f7a | ||
|
|
98334bd25e | ||
|
|
f00a06b0c7 | ||
|
|
f3289fc23c | ||
|
|
f08879204f | ||
|
|
717006e34a | ||
|
|
1541deeff0 | ||
|
|
48beb52b14 | ||
|
|
fd3a4b8336 | ||
|
|
3f76689640 | ||
|
|
055a470a2b | ||
|
|
e9acd130ea | ||
|
|
6a025f9503 | ||
|
|
352ab26ba7 | ||
|
|
f7b5af5a9b | ||
|
|
326926aa16 | ||
|
|
58ba52762c |
@@ -4,4 +4,4 @@ Astuces diverses pour utiliser un ordinateur sous Linux...
|
||||
|
||||
Un travail à l'évolution (trop) lente.
|
||||
|
||||
* http://la.buvette.org/devel/docs/tetatricks.pdf
|
||||
`pdfbook2 tetatricks.pdf --paper=a4paper --short-edge --no-crop`
|
||||
|
||||
@@ -57,11 +57,35 @@ mais canonique~:
|
||||
|
||||
\lstinputlisting{code/Basic/bywater-1.bas}
|
||||
|
||||
Ce qui nous donne à l'exécution~:
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Devel/TetaTricks$ bwbasic code/Basic/bywater-1.bas
|
||||
Bywater BASIC Interpreter/Shell, version 2.20 patch level 2
|
||||
Copyright (c) 1993, Ted A. Campbell
|
||||
Copyright (c) 1995-1997, Jon B. Volkoff
|
||||
|
||||
2 4
|
||||
3 9
|
||||
4 16
|
||||
5 25
|
||||
|
||||
tth@redlady:~/Devel/TetaTricks$
|
||||
\end{verbatim}
|
||||
|
||||
Première conclusion : affaire à suivre.
|
||||
|
||||
% ====================================================================
|
||||
\section{Yabasic} \index{yabasic}
|
||||
|
||||
\begin{quote}
|
||||
Yabasic implements the most common and simple elements of the BASIC
|
||||
language; it comes with for-loops and goto with while-loops and
|
||||
procedures. yabasic does monochrome line graphics, and printing
|
||||
comes with no extra effort. yabasic runs under Unix and Windows;
|
||||
it is small (less than 200 KB) and free.
|
||||
\end{quote}
|
||||
|
||||
Première innovation, les numéros de ligne ne sont plus obligatoires.
|
||||
|
||||
\lstinputlisting{code/Basic/yabasic-1.bas}
|
||||
|
||||
102
chap/C.tex
102
chap/C.tex
@@ -26,7 +26,7 @@ Ces paramètres sont fournis par des mécanismes planquées
|
||||
dans la soute du système d'exploitation, et n'ont pas
|
||||
d'importance pour le moment..
|
||||
|
||||
\lstinputlisting[language=c]{code/hello.c}
|
||||
\lstinputlisting[language=c]{code/C/hello.c}
|
||||
|
||||
Un fois passé l'entrée, nous sommes dans la partie active.
|
||||
Nous appelons à ce moment une fonction de la bibliothèque
|
||||
@@ -53,7 +53,7 @@ un tableau de chaines de caractères contenant ces différents mots.
|
||||
|
||||
Ce petit bout de code va nous afficher tout ça~:
|
||||
|
||||
\lstinputlisting[language=c]{code/arguments.c}
|
||||
\lstinputlisting[language=c]{code/C/arguments.c}
|
||||
|
||||
Et voici un exemple d'exécution depuis un shell~:\index{shell}
|
||||
|
||||
@@ -75,6 +75,14 @@ En C, les tableaux commencent toujours à l'indice 0.
|
||||
Pour le traitement des options, il faut sauter à
|
||||
la page \pageref{getopt}.
|
||||
|
||||
. . .
|
||||
|
||||
\begin{verbatim}
|
||||
if (config->optind < config->argc)
|
||||
for (int i = config->optind; i < config.argc; ++i)
|
||||
process(config->argv[i]);
|
||||
\end{verbatim}
|
||||
|
||||
% =========================================================
|
||||
|
||||
\section{Les variables}
|
||||
@@ -103,7 +111,7 @@ Il est temps de préciser les détails.
|
||||
Une fonction a un unique point d'entrée\footnote{Qui a déja joué
|
||||
avec le ENTRY du Fortran ?}, avec une éventuelle liste
|
||||
de paramètres,
|
||||
et une tout aussi éventuelel unique valeur de retour.
|
||||
et une tout aussi éventuelle unique valeur de retour.
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
@@ -114,8 +122,11 @@ XXX\index{XXX}
|
||||
|
||||
Il est évident qu'un logiciel qui n'a aucun moyen de communiquer
|
||||
avec le monde extérieur a bien moins d'utilité qu'un bon ed.
|
||||
Dans le schéma «~classique~», ces échanges ont lieu par
|
||||
le truchement d'un terminal.
|
||||
Dans le schéma «~classique~» d'une utilisation interactive,
|
||||
ces échanges ont lieu par
|
||||
le truchement d'un terminal, qui peut tout aussi bien
|
||||
être une \textsl{real glasstty} ou une fenêtre d'un émulateur
|
||||
graphique de terminal, comme \texttt{xterm}.
|
||||
|
||||
\subsection{Les trois flux canoniques}
|
||||
|
||||
@@ -268,6 +279,55 @@ Avez-vous bien révisé la section qui cause des pointeurs ?
|
||||
À ne plus savoir où peut être la tête de lecture ?
|
||||
Alors les subtilités de \texttt{scanf} vont vous plaire.
|
||||
|
||||
Nous allons commencer par un exemple simple~: la lecture
|
||||
de deux nombres entiers depuis l'entrée standard.
|
||||
Les valeurs lues seront stockée dans deux variables
|
||||
de type \texttt{int}.
|
||||
|
||||
\begin{verbatim}
|
||||
#include <stdio.h>
|
||||
...
|
||||
int foo, bar, nbread;
|
||||
nbread = scanf("%d %d", &foo, &bar);
|
||||
\end{verbatim}
|
||||
|
||||
Le premier argument est une chaine de caractères contenant
|
||||
des directives de conversion, semblables à celles
|
||||
du printf.
|
||||
Dans cette exemple, nous avons deux fois \texttt{"\%d"}
|
||||
séparées par une espace. Cette directive veut dire
|
||||
« lire les chiffres qui arrivent et les convertir
|
||||
en nombre entier quand il n'y en a plus », une
|
||||
simple règle de conversion.
|
||||
|
||||
Les deux arguments suivants sont les adresses des deux variables
|
||||
destinées à recevoir les valeurs lues,
|
||||
ou, en langage commun « faut mettre ÇA LÀ ».
|
||||
Ce sont donc des pointeurs, on les reconnait au
|
||||
caractère \& qui précède leur nom.
|
||||
|
||||
Quand à la valeur retournée par la fonction scanf, elle
|
||||
présente un grand intérêt car elle contient le nombre
|
||||
de lectures élémentaires qui se sont bien passées.
|
||||
Tous les cas d'erreur ne sont pas couvert, mais c'est
|
||||
suffisant pour traiter les cas simples de la discipline.
|
||||
|
||||
Donc, en toute rigueur, le code que nous venons de voir
|
||||
devrait s'écrire, en utilisant comme il se doit
|
||||
le \textsl{yoda coding} pour le test de cette valeur
|
||||
de retour~:
|
||||
|
||||
\begin{verbatim}
|
||||
...
|
||||
int foo, bard;
|
||||
if (2 != scanf("%d %d", &foo, &bar)) {
|
||||
fputs("FAIL\n", stderr)
|
||||
abort();
|
||||
}
|
||||
...
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
\textit{To be continued...}
|
||||
|
||||
% ---------------------------------------------------------
|
||||
@@ -362,12 +422,14 @@ page \pageref{pipeline}.
|
||||
|
||||
\textbf{Ah, enfin, on a failli attendre !}
|
||||
|
||||
Qu'est-ce qu'un pointeur ? La réponse est multiple, et c'est
|
||||
Qu'est-ce qu'un pointeur ?
|
||||
La réponse est multiple et parfois obscure, et c'est
|
||||
le pointeur qui fait à la fois la force et la faiblesse du C.
|
||||
Pour faire simple, un pointeur est une variable qui contient
|
||||
l'adresse dans la mémoire d'une autre variable.
|
||||
|
||||
Mais en fait c'est un peu plus subtil : un pointeur « connait » la taille
|
||||
Mais en fait c'est un peu plus subtil :
|
||||
un pointeur « connait » le type (donc la taille)
|
||||
de l'objet pointé, et peut donc « parcourir » un tableau de ces objets.
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -377,14 +439,31 @@ ptr = tableau; // *ptr désigne tableau[0];
|
||||
ptr++; // *ptr désigne tableau[1];
|
||||
\end{verbatim}
|
||||
|
||||
XXX il y a beaucoup à dire, et de quoi bien rire \textsl{:)}
|
||||
\index{XXX}
|
||||
XXX il y a encore beaucoup à dire, et de quoi bien rire \textsl{:)}
|
||||
|
||||
% https://hackthedeveloper.com/function-pointer-in-c/
|
||||
|
||||
\subsection{Pointeurs et chaines}
|
||||
|
||||
\begin{verbatim}
|
||||
char *text = "this is a text";
|
||||
char text[] = "this is a text";
|
||||
\end{verbatim}
|
||||
|
||||
Vous le voyez, le piège ?
|
||||
|
||||
\subsection{Pointeurs et fonctions}
|
||||
|
||||
Exemple classique : qsort.
|
||||
|
||||
% =========================================================
|
||||
|
||||
\section{Le préprocesseur}\index{cpp}
|
||||
|
||||
\textbf{Attention !} L'utilisation abusive du préprocesseur
|
||||
peut générer des trolls de plusieurs centaines de posts.
|
||||
|
||||
Nous avons déja abordé de loin la directive \texttt{\#include},
|
||||
qui fait partie du préprocesseur, comme toutes les lignes
|
||||
de code commençant par le caractère \textbf{\#}.
|
||||
@@ -411,7 +490,10 @@ pour être traduite en codes opératoires, dont l'exécution
|
||||
affichera une maxime dont la véracité demande à être vérifiée
|
||||
par l'expérimentation. Mais ça n'est pas fini.
|
||||
|
||||
Ce sympathique \textsf{préproc'} nous permet aussi de faire
|
||||
Ce sympathique \textsf{préproc'}%
|
||||
\footnote{Certains l'appellent même tendrement « mon cépépé »
|
||||
avec un regard de guimauve mal grillée.}
|
||||
nous permet aussi de faire
|
||||
de la compilation conditinnelle, et ça, c'est cool parce que
|
||||
ça ouvre la porte à plein de choses.
|
||||
Par exemple, l'instrumentation du code afin de faciliter
|
||||
@@ -550,7 +632,7 @@ et un exemple simple d'utilisation.
|
||||
\section{Analyser une ligne de texte} \index{parser}
|
||||
|
||||
Nous désirons implémenter une interface en ligne de commande
|
||||
(aka CLI\index{CLI}) pour un enchainement simple d'intructions
|
||||
(aka CLI\index{cli}) pour un enchainement simple d'intructions
|
||||
assez semblables. On peut aussi voir ça comme la création
|
||||
d'un \textsl{domain specific language} (aka DSL\index{DSL}).
|
||||
|
||||
|
||||
69
chap/DMX512.tex
Normal file
69
chap/DMX512.tex
Normal file
@@ -0,0 +1,69 @@
|
||||
\chapter{DMX512}
|
||||
\index{DMX} \label{chap:DMX}
|
||||
|
||||
% -----------------------------------------------------
|
||||
|
||||
D'après Wikipédia :
|
||||
|
||||
\begin{quote}
|
||||
Le DMX512 (Digital Multiplexing) est une norme de transmission de données
|
||||
utilisée pour le contrôle de l'éclairage et des effets de scène dans le
|
||||
spectacle vivant.
|
||||
|
||||
Le protocole DMX512 (qui utilise généralement une liaison
|
||||
suivant la norme EIA RS 485 et cadencée à 250 kb/s) permet
|
||||
de contrôler 512 canaux (9 bits d'adressage) en affectant à
|
||||
chacun une valeur comprise entre 0 et 255 (8 bits de données par
|
||||
canal). La transmission numérique unidirectionnelle se fait de
|
||||
façon sérialisée par liaison symétrique, et chaque appareil
|
||||
reçoit en même temps l'ensemble des 512 valeurs (ce qui est
|
||||
appelée une « trame » DMX).
|
||||
\end{quote}
|
||||
|
||||
% -----------------------------------------------------
|
||||
\section{Open Light Architecture} \index{OLA}
|
||||
|
||||
https://ryderdamen.com/blog/enttec-open-dmx-on-linux/
|
||||
|
||||
% -----------------------------------------------------
|
||||
\section{Enttec OpenDMX} \index{OpenDMX} \label{OpenDMX}
|
||||
|
||||
D'après le constructeur :
|
||||
\textsl{
|
||||
The OPEN DMX USB is a DMX widget used to output
|
||||
DMX from a computer. Simply connect it using it’s
|
||||
USB 2.0 Type B port and launch your compatible
|
||||
software.
|
||||
The OPEN DMX USB is discovered as a USB Serial
|
||||
Device or virtual COM Port dependent on the FTDI
|
||||
driver installed on your system.
|
||||
The Open DMX USB’s output is processed directly on
|
||||
the computer’s processor.
|
||||
}
|
||||
|
||||
Nous allon voir ce qu'il en est exactement.
|
||||
Après branchement, essayons d'identifier cette interface.
|
||||
|
||||
\begin{verbatim}
|
||||
Bus 001 Device 027: ID 0403:6001
|
||||
Future Technology Devices International, Ltd FT232 Serial (UART) IC
|
||||
\end{verbatim}
|
||||
|
||||
\begin{verbatim}
|
||||
SUBSYSTEM=="tty" ATTRS{idVendor}=="0403"
|
||||
ATTRS{idProduct}=="6001" SYMLINK+="phytotron"
|
||||
\end{verbatim}
|
||||
|
||||
Le tout sur une ligne et dans le fichier
|
||||
\texttt{/etc/udev/rules.d/70-emttec-opendmx.rules}.
|
||||
En général une erreur de syntaxe apparait dans
|
||||
\textit{varlogmessage}.
|
||||
|
||||
look at \texttt{tcsendbreak} !
|
||||
|
||||
% -----------------------------------------------------
|
||||
|
||||
% -----------------------------------------------------
|
||||
|
||||
% -----------------------------------------------------
|
||||
|
||||
@@ -11,6 +11,10 @@ service à partir de son nom. Un énorme progrès comparé à la
|
||||
maintenance du fichier \texttt{/etc/hosts} qu'il fallait,
|
||||
à la vieille époque, télécharger toutes les nuits\dots
|
||||
|
||||
Par contre, « \textit{C'est encore de la faute du DNS} »
|
||||
est devenu, ces dernières années, une excuse crédible.
|
||||
Il y a de nombreuses raisons qui justifient cette remarque.
|
||||
|
||||
% ------------------------------------------------------------
|
||||
|
||||
\section{Outils de base}
|
||||
|
||||
@@ -175,9 +175,10 @@ XXX\index{XXX}
|
||||
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
|
||||
(restons simple pour commencer) des lignes entières de texte.
|
||||
Dans l'ancien temps\footnote{F77 rulz the world}, le format de ces
|
||||
lignes devait être précisement structure, avec des largeurs de champs
|
||||
fixés.
|
||||
Dans l'ancien temps\footnote{F66 rulz the world} des cartes
|
||||
à trous, le format de ces
|
||||
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}
|
||||
|
||||
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é~:
|
||||
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~:
|
||||
|
||||
\begin{lstlisting}
|
||||
@@ -228,9 +273,17 @@ program t
|
||||
end program
|
||||
\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}
|
||||
|
||||
Tentative de sranding faite à la rache.
|
||||
La dernière ligne va vous étonner.
|
||||
|
||||
\begin{lstlisting}
|
||||
@@ -246,15 +299,22 @@ La dernière ligne va vous étonner.
|
||||
dummy = rand()
|
||||
\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
|
||||
|
||||
\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,
|
||||
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}
|
||||
@@ -339,7 +399,7 @@ immédiatement garnir de données pertinentes~:
|
||||
\end{verbatim}
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
% ================================================================
|
||||
|
||||
|
||||
91
chap/OSC.tex
91
chap/OSC.tex
@@ -1,7 +1,15 @@
|
||||
\chapter{Open Sound Control}
|
||||
\index{OSC} \label{chap:OSC}
|
||||
|
||||
Wikipedia :
|
||||
Pour moi c'est une façon simple et élégante de faire discuter des
|
||||
ordinateurs et je ne dis pas ça parce que j'ai déja pas mal
|
||||
joué\footnote{https://git.tetalab.org/tTh/gadgets-OSC} avec,
|
||||
mais parce c'est probablement vrai\dots
|
||||
|
||||
% ================================================================
|
||||
\section{C'est quoi ?}
|
||||
|
||||
D'après Wikipedia :
|
||||
\textsl{OSC est un format de transmission de données entre ordinateurs,
|
||||
synthétiseurs, robots ou tout autre matériel ou logiciel compatible,
|
||||
conçu pour le contrôle en temps réel.
|
||||
@@ -10,11 +18,20 @@ des protocoles UDP\index{UDP} ou TCP\index{TCP} et apporte des
|
||||
améliorations en termes de rapidité et de flexibilité par rapport
|
||||
à l'ancienne norme MIDI\index{MIDI}\dots}
|
||||
|
||||
|
||||
% ================================================================
|
||||
\section{Programmation}
|
||||
|
||||
Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
|
||||
qui reste simple
|
||||
à utiliser tout en permettant de descendre à un bas niveau.
|
||||
Cette bibliothèque est livrée avec deux outils que nous
|
||||
allons voir maintenant.
|
||||
qui reste simple à utiliser
|
||||
tout en permettant de descendre à un bas niveau.
|
||||
Elle fonctionne sur un modèle asynchrone
|
||||
(ce qui peut poser des soucis selon le contexte d'utilisation)
|
||||
et de bonnes possibilités de filtrage selon certains critères.
|
||||
|
||||
|
||||
Cette bibliothèque est livrée avec deux outils de test/debug que nous
|
||||
allons voir maintenant, et que je vous encourage à apprivoiser.
|
||||
|
||||
% ================================================================
|
||||
|
||||
@@ -23,28 +40,51 @@ allons voir maintenant.
|
||||
|
||||
\textbf{Envoyer :}
|
||||
|
||||
Pour envoyer, il faut bien définir une destination. Une fois
|
||||
de plus, le couple IP adresse/port est utilisé. Ce sont les
|
||||
deux premiers paramètres.
|
||||
Pour envoyer des données, il faut bien définir une destination. Une fois
|
||||
de plus, le triplet IP adresse/port/chemin est utilisé.
|
||||
Ce sont les trois premiers paramètres de la commande~:
|
||||
\begin{verbatim}
|
||||
tth@debian:~$ oscsend localhost 1664 /tmp/kmem is 61 'meg, efface !'
|
||||
tth@debian:~$
|
||||
tth@debian:~$ oscsend localhost 1664 /tmp/kmem 'is' 61 'meg, efface !'
|
||||
\end{verbatim}
|
||||
|
||||
La chaine \texttt{is} que vous voyez dans la ligne de commande
|
||||
décrit le type des paramètres qui suivent~:
|
||||
\texttt{i} est pour un integer et \texttt{s} pour une
|
||||
chaine (notez les simples quotes pour passer les caractères
|
||||
speciaux du shell).
|
||||
chaine de caractères
|
||||
(notez les simples quotes autour du texte pour passer les
|
||||
caractères speciaux du shell, comme l'espace).
|
||||
Il existe d'autres types de paramètres que nous verrons plus loin.
|
||||
|
||||
\vspace{1em} \textbf{Écouter :}
|
||||
|
||||
C'est beaucoup plus simple, il suffit de donner le numéro
|
||||
de port UDP sur lequel nous allons écouter.
|
||||
L'option \texttt{-L} est utile si vous voulez exploiter
|
||||
la sortie de oscdump,
|
||||
par exemple avec "\texttt{oscdump 9000 | cat -n}" pour numéroter
|
||||
les évènements reçus.
|
||||
|
||||
\textbf{Ecouter :}
|
||||
\begin{verbatim}
|
||||
tth@debian:~$ oscdump 1664
|
||||
/tmp/kmem is 61 "meg, efface !"
|
||||
^C
|
||||
tth@debian:~$
|
||||
\end{verbatim}
|
||||
|
||||
Pour descendre plus bas dans la pile, on pourra efficacement utiliser
|
||||
un \textsl{dumper} de messages UDP qui nous montrera le cœur des trames.
|
||||
Voici ce que l'on voit de l'envoi décrit page \pageref{sendosc}~:
|
||||
|
||||
\begin{verbatim}
|
||||
udp_dumper: listen on port 9000
|
||||
---+ frame 0 32 bytes t= 6.179 sec.
|
||||
0 | 2f 64 65 6d 6f 00 00 00 2c 69 73 00 00 00 00 3d | /demo...,is....= |
|
||||
16 | 6d 65 67 2c 20 65 66 66 61 63 65 20 21 00 00 00 | meg, efface !... |
|
||||
32 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
|
||||
\end{verbatim}
|
||||
|
||||
On y retrouve certaines des choses le chemin, la liste des types,
|
||||
le contenu des messages, toutes choses qui seront
|
||||
décrites en détail dans la page \pageref{trameosc}.
|
||||
% ================================================================
|
||||
|
||||
\section{Exemple de code}
|
||||
@@ -58,19 +98,26 @@ utilise un thread d'écoute qui appelle des
|
||||
\textsl{callbacks} préalablement "accrochés",
|
||||
\textsl{hooked} en vrai langue.
|
||||
|
||||
\lstinputlisting[language=c]{code/listen-osc.c}
|
||||
\lstinputlisting[language=c]{code/OSC/listen-osc.c}
|
||||
|
||||
\textbf{Envoyer :}
|
||||
\textbf{Envoyer :} \label{sendosc}
|
||||
|
||||
Cette partie là est beaucoup plus simple.
|
||||
|
||||
\lstinputlisting[language=c]{code/send-osc.c}
|
||||
\lstinputlisting[language=c]{code/OSC/send-osc.c}
|
||||
|
||||
J'avoue ne pas encore savoir ce que veut bien dire la
|
||||
valeur de retour.
|
||||
|
||||
% ================================================================
|
||||
|
||||
\section{La trame OSC} \label{trameosc}
|
||||
|
||||
\textsf{Après tout, ce ne sont que quelques octets.}
|
||||
|
||||
% ================================================================
|
||||
|
||||
|
||||
\section{En Perl} \index{Perl}
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -86,9 +133,9 @@ $client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
|
||||
% ================================================================
|
||||
% nouveau: Sat Jul 15 07:14:10 UTC 2023
|
||||
|
||||
\section{Le routage}
|
||||
% \section{Le routage}
|
||||
|
||||
WIP...\index{XXX}
|
||||
% WIP...\index{XXX}
|
||||
|
||||
|
||||
% ================================================================
|
||||
@@ -97,8 +144,12 @@ WIP...\index{XXX}
|
||||
|
||||
Beaucoup d'autres logiciels peuvent être controlés par OSC, ou
|
||||
générer des trames OSC : on peut citer
|
||||
Processing\index{Processing},
|
||||
Processing\index{processing},
|
||||
Chuck\index{Chuck} (page \pageref{chuck-osc}),
|
||||
Puredata\index{puredata}.
|
||||
Certains prétendent même qu'un vieux néo-rural tente de
|
||||
faire un \textsl{binding} pour le
|
||||
Fortran\index{fortran} moderne.
|
||||
\dots
|
||||
|
||||
% ================================================================
|
||||
|
||||
@@ -11,18 +11,78 @@ Il est de ce fait très orienté vers la manipulation de
|
||||
données textuelles et contient d'énormes facilités d'utilisation
|
||||
des expressions régulières.
|
||||
|
||||
Il fut un temps, dans le siècle précédent, où il était le maitre
|
||||
Il fut un temps béni, dans le siècle précédent, où il était le maitre
|
||||
incontesté du Web\index{web} interactif, de par son intégration
|
||||
dans le serveur Apache\index{Apache},
|
||||
et de modules d'écriture de clients http\index{http}.
|
||||
dans le serveur Apache\index{Apache}
|
||||
(les fameux scripts \textsc{cgi}\index{cgi}),
|
||||
et de modules d'écriture de clients http\index{http}
|
||||
(page \pageref{perlhttp}).
|
||||
Mais ce temps est-il révolu ? Nous le verrons dans un
|
||||
prochain épisode.
|
||||
|
||||
Le débutant peut facilement n'utiliser qu'un sous-ensemble du langage,
|
||||
mais ce serait se priver de quelques \textit{patterns} assez
|
||||
mais ce serait se priver de quelques \textit{design patterns} assez
|
||||
efficients.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Le texte}
|
||||
\section{Perl, le départ}
|
||||
|
||||
La méthode shebang. Tout le monde connait maintenant le shebang,
|
||||
ce n'est pas la peine de radoter dessus.
|
||||
On va donc commencer par le premier exemple, puis enchainer
|
||||
sur les petits trucs à savoir, en mode « recette à la rache ».
|
||||
|
||||
\begin{verbatim}
|
||||
#!/usr/bin/perl
|
||||
print "hello world"
|
||||
\end{verbatim}
|
||||
|
||||
La méthode purecli.
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~ $ echo "print \"hello world\n\";" | perl
|
||||
hello world
|
||||
\end{verbatim}
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Modèle d'exécution}
|
||||
|
||||
|
||||
% ------------------------------------------------------
|
||||
\section{Les variables}
|
||||
|
||||
Auto-vivification.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Gestion des modules} \index{CPAN}
|
||||
|
||||
Tout comme pour le Fortan Moderne, c'est une notion essentielle.
|
||||
Un exemple très simple, le module Dummy\index{dummy}.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\label{perlhttp}
|
||||
\section{Le \texttt{http}} \index{http} \index{protocole}
|
||||
|
||||
HTTP (Hyper Text Transfert Protocole) est le protocole qui
|
||||
est à la base du bien connu
|
||||
\textsl{World Wide Web}
|
||||
la chose que les gens appelent faussement l'internet.
|
||||
\index{www}\index{gafam}
|
||||
L'écosystème Perl est bien équipé pour
|
||||
agir dans ce monde là.
|
||||
|
||||
|
||||
% Scrapping de la patate en vue !
|
||||
% https://al.smeuh.org/cgi-bin/express.pritz
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
|
||||
\section{Traiter du texte}
|
||||
|
||||
Un cas concret~: générer du code en langage \texttt{C} à partir
|
||||
d'un fichier traité ligne par ligne. Chacune de ces lignes est
|
||||
@@ -51,21 +111,10 @@ la ligne de commande feront l'affaire.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Gestion des modules} \index{CPAN}
|
||||
|
||||
Tout comme pour le Fortan Moderne, c'est une notion essentielle.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Le \texttt{http}}
|
||||
|
||||
Scrapping de la patate en vue !
|
||||
|
||||
https://al.smeuh.org/cgi-bin/express.pritz
|
||||
|
||||
% ------------------------------------------------------
|
||||
\section {Et en vrai ?}
|
||||
|
||||
Quels logiciels sont écrits en Perl ?
|
||||
|
||||
\texttt{exiftool - Read and write meta information in files} \index{exiftool}
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
@@ -9,13 +9,19 @@ gens faire du code en Python,
|
||||
certains même font de choses très avancées.
|
||||
Et beaucoup de ces gens essayent de me convaincre que c'est
|
||||
un langage vraiment trop bien, trop moderne, trop dans la
|
||||
\textit{vibe} du devops, battery included, toussa.
|
||||
\textit{vibe} du devops\index{devops}, battery included, toussa.
|
||||
Quelques uns d'entre eux vont même jusqu'à me parler d'un
|
||||
certain \textbf{canard} qui faciliterait bien la vie
|
||||
des preogrammeurs.
|
||||
|
||||
Je ne suis pas convaincu.
|
||||
|
||||
Parce qu'un langage où, si tu remplaces un caractère \textbf{invisible}
|
||||
par un autre caractère tout aussi \textbf{invisible}, le programme
|
||||
ne marche plus, je trouve ça un peu craignos.
|
||||
Bien entendu, certains vont te dire~: « configurer l'éditeur, gna, gna. »
|
||||
mais bon, être dépendant de la conf' d'un éditeur pour que les
|
||||
choses fonctionnent, c'est un peu limite.
|
||||
|
||||
|
||||
\section{Mais quand même...}
|
||||
@@ -28,3 +34,19 @@ Je ne suis pas convaincu.
|
||||
\end{figure}
|
||||
|
||||
|
||||
\section{Quelques trucs}
|
||||
|
||||
On souhaite parfois partager rapidement quelques fichiers sur
|
||||
le réseau local. Avec une de batteries incluses, c'est facile.
|
||||
|
||||
À l'ancienne :
|
||||
|
||||
\begin{verbatim}
|
||||
$ python -m SimpleHTTPServer 9000
|
||||
\end{verbatim}
|
||||
|
||||
Et maintenant :
|
||||
|
||||
\begin{verbatim}
|
||||
$ python3 -m http.server 9000
|
||||
\end{verbatim}
|
||||
|
||||
22
chap/R.tex
22
chap/R.tex
@@ -9,7 +9,7 @@
|
||||
|
||||
Je n'ai certainement pas la prétention de vous enseigner
|
||||
les arcanes du \textsl{R project},
|
||||
je suis (octobre 2023) en pleine périoe de découverte.
|
||||
je suis (octobre 2023) en pleine période de découverte.
|
||||
Mais j'ai déja un projet concret en tête, et ce chapitre sera,
|
||||
dans un premier temps, composé de mes notes de voyage.
|
||||
|
||||
@@ -29,16 +29,17 @@ Le caractère \texttt{>} est le prompt de R, il vous invite à taper
|
||||
des commandes afin qu'il vous explique le sens de la vie.
|
||||
On peut définir des variables, leur donner une valeur et faire des calculs
|
||||
avec ces variables,
|
||||
ce qui est bien suffisant pour commencer. Démonstration~:
|
||||
ce qui est bien suffisant pour commencer.
|
||||
Une rapide démonstration~:
|
||||
|
||||
\begin{verbatim}
|
||||
> a <- 22
|
||||
> b <- 7
|
||||
> a ; b
|
||||
[1] 22
|
||||
[1] 7
|
||||
> a / b
|
||||
[1] 3.142857
|
||||
> a <- 22
|
||||
> b <- 7
|
||||
> a ; b
|
||||
[1] 22
|
||||
[1] 7
|
||||
> a / b
|
||||
[1] 3.142857
|
||||
\end{verbatim}
|
||||
|
||||
Les choses semblent simples, nous avons approximé $\pi$.
|
||||
@@ -96,7 +97,7 @@ La magie du shebang\index{shebang}
|
||||
Nous disposons d'un fichier SSV
|
||||
(Space Separated Values)\footnote{C'est nouveau, ça vient de sortir.}
|
||||
provenant d'un système optico-numérique bi-dimensionnel multi-planaire
|
||||
(aka Webcam\index{Webcam}).
|
||||
(aka Webcam\index{webcam}).
|
||||
Et nous voulons en tirer quelques chiffres et graphiques bien
|
||||
clinquants,
|
||||
par exemple les éventuels rapports entre le rouge et le bleu.
|
||||
@@ -226,6 +227,7 @@ vers \LaTeX, peut-on faire de la 3D\index{3D}, \dots
|
||||
|
||||
hist(datas\$V3, breaks=50)
|
||||
|
||||
|
||||
% ======================================================================
|
||||
|
||||
\section{Interface avec l'OS}
|
||||
|
||||
@@ -47,7 +47,7 @@ Une machine connectée en wifi sur une friboite\footnote{ou le
|
||||
Cisco sauvage de la salle d'AG, hein, mais ça ne sera
|
||||
pas le même nameserver.} peut facilement
|
||||
faire translateur d'adresse pour un réseau branché sur
|
||||
son eth, à condition de connaitre les
|
||||
son \texttt{eth}, à condition de connaitre les
|
||||
incantations magiques
|
||||
(qui sont ici très linuxisantes) :
|
||||
|
||||
@@ -58,7 +58,7 @@ modprobe iptable_nat
|
||||
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
|
||||
\end{verbatim}
|
||||
|
||||
Ensuite sur les machines du lan, donc le coté ethernet,
|
||||
Ensuite sur les machines du lan, donc le coté Ethernet,
|
||||
il faut incanter ce genre de trucs :
|
||||
|
||||
\begin{verbatim}
|
||||
|
||||
@@ -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/
|
||||
%
|
||||
|
||||
Twm, Fvwm, Mwm... nous avons le choix.
|
||||
|
||||
%-------------------------------------------------------------------
|
||||
|
||||
\section{XCB}\index{XCB}
|
||||
|
||||
48
chap/bdd.tex
48
chap/bdd.tex
@@ -7,17 +7,22 @@
|
||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
\section{sqlite} \index{sqlite}
|
||||
|
||||
Avantages : un produit éprouvé depuis longtemps, toutes
|
||||
les données placées dans un fichier unique facilement
|
||||
transportable, vraiment multi-plateforme.
|
||||
|
||||
|
||||
% ----------------------------------------------------------------
|
||||
\subsection{CLI} \index{cli}
|
||||
|
||||
Commandes internes:
|
||||
Commandes internes (\textsl{meta-commands})~:
|
||||
|
||||
Utilisez \textbf{.help} en premier secours !
|
||||
|
||||
% ----------------------------------------------------------------
|
||||
\subsection{Libreoffice} \index{Libreoffice}
|
||||
|
||||
|
||||
Il peut utiliser des bases en SQLite.
|
||||
|
||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
@@ -31,33 +36,23 @@ Gnu DBM permet de stocker des paires clef/valeur dans un fichier
|
||||
de données. Chacune de ces clefs doit être unique, et doit être
|
||||
liée avec une seule valeur\footnote{Peut-on alors parler
|
||||
de bijection relationnelle ?}.
|
||||
On peut appeler ça une table associative,
|
||||
ou en anglais une \textsl{hashtable},
|
||||
un terme qui rappelle le principe sous-jacent.
|
||||
|
||||
% ----------------------------------------------------------------
|
||||
|
||||
\subsection{Exemple en Perl} \index{Perl}
|
||||
|
||||
\begin{verbatim}
|
||||
#!/usr/bin/perl -w
|
||||
Nous allons extraire une donnée du fichier \texttt{/etc/passwd}
|
||||
et la stocker en utilisant le nom du \textsl{yuser}
|
||||
comme clef d'accès.
|
||||
Une tâche pour laquelle Perl est optimal\footnote{krkrkr}
|
||||
grâce au mécanisme du \texttt{tie} que je songe à
|
||||
expliquer\footnote{un de ces jours...} dans le chapitre approprié
|
||||
vers la page \pageref{chap:Perl}.
|
||||
|
||||
use strict;
|
||||
use GDBM_File;
|
||||
my $nomdb = "exemple.gdbm";
|
||||
my (%DB, @champs);
|
||||
my ($user, $gecos);
|
||||
open(SOURCE, "< /etc/passwd") or die "source $!";
|
||||
tie(%DB, "GDBM_File", $nomdb, GDBM_WRCREAT, 0666) or die "gdbm $!";
|
||||
|
||||
while (<SOURCE>) {
|
||||
@champs = split ":", $_;
|
||||
$user = $champs[0]."\0";
|
||||
$gecos = $champs[4]."\0";
|
||||
$DB{$user} = $gecos;
|
||||
}
|
||||
|
||||
untie %DB;
|
||||
close SOURCE;
|
||||
0;
|
||||
\end{verbatim}
|
||||
\lstinputlisting[language=perl]{code/bdd/mkgdbm.pl}
|
||||
|
||||
Vous remarquerez que pour cet exemple, nous avons clef et valeur qui
|
||||
sont du texte. Alors que DBM est prévu pour stocker des blocs de
|
||||
@@ -65,6 +60,11 @@ binaire. Pour faciliter la récupération de ces chaines de caractères
|
||||
par un hypothétique\footnote{Oui, je vais l'écrire bientôt.} programme
|
||||
en C, le programme Perl rajoute un \texttt{'\textbackslash0'}
|
||||
(fin de chaine) aux deux champs concernés.
|
||||
% ----------------------------------------------------------------
|
||||
|
||||
\subsection{Exemple en C} \index{C}
|
||||
|
||||
XXX \index{XXX}
|
||||
|
||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
@@ -76,4 +76,6 @@ Le poids lourd du domaine.
|
||||
|
||||
\section{Et le "NoSQL" ?} \index{nosql} \index{troll}
|
||||
|
||||
Pour parler de ça, je préfère attendre Vendredi.
|
||||
|
||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
|
||||
Vous allez bien dire : « Encore un truc de vieux\dots ».
|
||||
Oui, peut-être, mais il y a quand même pas mal d'usages
|
||||
assez cools pour ces technologies du passé. Nous allons
|
||||
assez cools pour ces technologies du passé, l'auto-radio
|
||||
de votre vieille voiture, par exemple.
|
||||
Nous allons
|
||||
en explorer quelques uns.
|
||||
|
||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
@@ -12,14 +14,43 @@ en explorer quelques uns.
|
||||
|
||||
\section{CD Audio}
|
||||
|
||||
Un CD audio ne contient pas de système de fichier, il ne peut
|
||||
donc pas être lu de manière conventionnelle.
|
||||
Il faut donc passer par des logiciels adaptés, qui vont
|
||||
directement aller dire le contenu du disque, puis
|
||||
convertir les pistes en fichiers audio conventionnels.
|
||||
|
||||
\subsection {Riping}
|
||||
\index{abcde} \index{cdparanoia}
|
||||
|
||||
Le \textsl{ripage} est l'action d'extraire les pistes d'un
|
||||
cd audio pour les convertir en fichier numérique audio.
|
||||
cd audio pour les convertir en fichier numérique audio
|
||||
au format désiré.
|
||||
Il existe plusieurs méthodes, la première va vous satisfaire,
|
||||
et nous verrons (peut-être) les autres la semaine prochaine.
|
||||
|
||||
Un des outils utilisés est \texttt{cdparanoia}. Les nombreuses
|
||||
options décrites dans la manpage montrent à quel point ce logiciel
|
||||
est complet et compliqué.
|
||||
est complet et compliqué. Heureusement, il y a une surcouche,
|
||||
\texttt{abcde}\footnote{A better CD Encoder}, qui facilite
|
||||
bien les choses. Passons immédiatement à l'œuvre en tentant
|
||||
d'encoder un cd audio\footnote{Mylene Farmer, Ainsi soit je...}
|
||||
vers des fichiers encodées en Ogg\index{ogg}.
|
||||
|
||||
Voici la ligne de commande minimale que nous allons utiliser,
|
||||
pour ensuite y ajouter quelques autres options :
|
||||
|
||||
\begin{verbatim}
|
||||
$ abcde -o ogg
|
||||
\end{verbatim}
|
||||
|
||||
Oh, mais il y a une jolie animation en asciiart pour suivre
|
||||
le déroulement des opérations.
|
||||
|
||||
Parmi les (nombreuses) options possibles, on trouve
|
||||
\texttt{-p Pads track numbers with 0's}
|
||||
|
||||
\textsl{||}
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ Comme vous le savez tous, un appel système
|
||||
est \textbf{le} moyen de communication qu'utilise un process
|
||||
utilisateur pôur demander un service au noyau.
|
||||
|
||||
\lstinputlisting[language=C]{code/hello.c}
|
||||
\lstinputlisting[language=C]{code/C/hello.c}
|
||||
|
||||
Un exemple canonique, n'est-il pas ? Ce bout de code affichant
|
||||
quelque chose à l'écran, il doit bien y avoir un appel au noyau
|
||||
@@ -196,7 +196,14 @@ Tue Oct 17 08:55:01 CEST 2023
|
||||
tth@redlady:~$
|
||||
\end{verbatim}
|
||||
|
||||
Simple et efficace.
|
||||
Simple et efficace. \textbf{Mais\dots}
|
||||
|
||||
Mais ça ne marche pas à tous les coups comme vous le montre
|
||||
clairement cet exemple. L'utilisation de la fonction
|
||||
\texttt{getenv(3)} est très facilement contournable.
|
||||
|
||||
\lstinputlisting[language=C]{code/C/use_envp.c}
|
||||
|
||||
|
||||
% ==============================================================
|
||||
|
||||
|
||||
12
chap/dessin.tex
Normal file
12
chap/dessin.tex
Normal file
@@ -0,0 +1,12 @@
|
||||
\chapter{Dessiner}
|
||||
\label{chap:dessin}
|
||||
|
||||
%
|
||||
% new: Thu Sep 5 18:14:20 UTC 2024
|
||||
%
|
||||
|
||||
% =======================================================================
|
||||
|
||||
\section{xpaint} \index{xpaint}
|
||||
|
||||
% =======================================================================
|
||||
@@ -1,13 +1,13 @@
|
||||
% ==============================================================
|
||||
% TRUCS DE VIEUX
|
||||
|
||||
\chapter{trucs de dino}
|
||||
\chapter{Trucs de dino}
|
||||
\label{chap:dino}
|
||||
|
||||
Je vais, dans ce chapitre, parler de choses que les moins de vingt
|
||||
ans ne peuvent pas connaitre. Des choses qui existaient
|
||||
\textsl{bien avant} le Web\index{www}, et pour lesquelles on
|
||||
peur facilement imaginer des usages alternatifs et amusants !
|
||||
peut facilement imaginer des usages alternatifs et amusants !
|
||||
|
||||
% ==============================================================
|
||||
|
||||
@@ -17,12 +17,15 @@ peur facilement imaginer des usages alternatifs et amusants !
|
||||
Aussi connu sous le nom de « superserveur Internet », ce démon
|
||||
a fait ses premiers pas dans l'Unix 4.3BSD
|
||||
et depuis est maintenant remplacé par
|
||||
\texttt{xinetd}\index{xinetd}, décrit en page \pageref{xinetd}.
|
||||
\texttt{xinetd}\index{xinetd}, décrit en page \pageref{xinetd},
|
||||
lequel a peut-être été déja supplanté par un truc qui est
|
||||
\textit{plus nouveau}.
|
||||
% --> https://0pointer.de/blog/projects/inetd.html
|
||||
|
||||
Inetd a pour but de gérer l'accès à des services réseaux,
|
||||
qui peuvent être internes ou externes. Un service interne
|
||||
est entièrement géré par Inetd : on y trouve par exempme
|
||||
daytime qui permet de connaitre l'heure qu'il est à
|
||||
est entièrement géré par Inetd : on y trouve par exemple
|
||||
\textsl{daytime} qui permet de connaitre l'heure qu'il est à
|
||||
l'autre bout du monde :
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -43,25 +46,38 @@ Il ne reste plus qu'à le mettre en œuvre, en réutilisant
|
||||
un exemple très ancien\footnote{Août 1998, lors d'une
|
||||
réunion du CULTe, à Toulouse}, et très simple à
|
||||
comprendre.
|
||||
Dans notre cas, inetd sera à l'écoute sur un port tcp.
|
||||
Dès qu'une demande de connection arrive,
|
||||
il accepte la connection, lance le process configuré,
|
||||
puis
|
||||
connecte ce qui vient du socket au \textsl{stdin} de ce
|
||||
process, et le \textsl{stdout} de celui-ci à la sortie
|
||||
vers l'extérieur.
|
||||
|
||||
Voir aussi : tcpserver\index{tcpserver}\dots
|
||||
% Voir aussi : tcpserver\index{tcpserver}\dots
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
||||
\subsection{qotd}
|
||||
\index{qotd}
|
||||
\index{qotd} \label{qotd}
|
||||
|
||||
Le protocole « Quote Of The Day » (\texttt{qotd}) a été
|
||||
normalise dans le \texttt{rfc865}, écrit en 1983 par John Postel.
|
||||
Une rapide implémentation du moteur de quote peut être codée en Shell :
|
||||
Une rapide implémentation du moteur de quote peut être codée avec
|
||||
quelques lignes de shell~:
|
||||
|
||||
\index{fortune}
|
||||
\begin{lstlisting}[language=sh]
|
||||
#!/bin/sh
|
||||
/usr/games/fortune -a -n 500
|
||||
\end{lstlisting}
|
||||
\lstinputlisting[language=sh]{code/inet/qotd.sh}
|
||||
|
||||
Maintenant, il nous faut dire à Inetd d'appeler ce moteur
|
||||
chaque fois qu'une connection tcp entrante arrive sur le
|
||||
port 17.
|
||||
port 17 (ce numéro du service est défini dans le fichier
|
||||
\texttt{/etc/services}).
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
Et pour les modernistes qui utilisent \texttt{xinetd}\index{xinetd}
|
||||
les explications sont en page \pageref{xinetd:qotd}.
|
||||
|
||||
% ==============================================================
|
||||
%
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
\chapter{Gadgets}
|
||||
|
||||
|
||||
La rubrique des trucs inutiles, mais pas que.
|
||||
|
||||
% https://www.linuxtricks.fr/wiki/zenity-boites-de-dialogue-graphiques-aux-scripts-shell
|
||||
|
||||
% ===============================================================
|
||||
|
||||
\section{Fortune}
|
||||
@@ -17,10 +22,9 @@ You are deeply attached to your friends and acquaintances.
|
||||
tth@plop:~$
|
||||
\end{verbatim}
|
||||
|
||||
Bref, vous voyez le principe : c'est un machin à raconter des
|
||||
Bref, vous voyez le principe : c'est une machine à raconter des
|
||||
trucs plus ou
|
||||
moins aléatoires\footnote{et jamais revenus, il faut bien le
|
||||
préciser.}. Il y a tout un tas d'options intéressantes,
|
||||
moins aléatoires. Il y a tout un tas d'options intéressantes,
|
||||
la principale étant \texttt{-o} pour avoir les fortunes
|
||||
offensives\index{porn} qui peuvent choquer les âmes
|
||||
sensibles.
|
||||
|
||||
@@ -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
|
||||
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
|
||||
ou des tabulations.
|
||||
|
||||
@@ -1,56 +1,123 @@
|
||||
\chapter{Graphisme}
|
||||
\label{chap:graphisme}
|
||||
|
||||
Voici quelques notes en vrac sur divers logiciels
|
||||
ou bibliothèques de fonctions qui permettent
|
||||
de faire des dessins et des images\dots
|
||||
|
||||
Nous verrons ici (dans le désordre) SDL, Povray, Flydraw, Fortran,
|
||||
et peut-être d'autres dans un avenir incertain.
|
||||
Mais il en existe d'autres~:
|
||||
Gnuplot (page \pageref{chap:gnuplot}),
|
||||
\texttt{gif89a} (page \pageref{chap:gif89a}),
|
||||
le dessin (page \pageref{chap:dessin}),
|
||||
les images (page \pageref{chap:image}) et
|
||||
les photos (page \pageref{chap:photos})\dots
|
||||
|
||||
Le sujet est vaste, en fait.
|
||||
|
||||
% ------------------------------------------------
|
||||
% nouveau : Tue Sep 3 11:14:13 UTC 2024
|
||||
|
||||
\section{SDL2} \index{SDL} \label{sdl}
|
||||
|
||||
\begin{quote}
|
||||
Simple DirectMedia Layer est une bibliothèque de développement multiplateforme conçue pour fournir un accès de bas niveau à l'audio, au clavier, à la souris,
|
||||
aux joysticks et à la vidéo (via OpenGL/Direct3D/Metal/Vulkan).
|
||||
\end{quote}
|
||||
|
||||
\textbf{Attention}, à l'heure\footnote{Wed Sep 4 00:40:42 UTC 2024} qu'il est,
|
||||
j'utilise une version assez ancienne\footnote{Mais je vais me soigner\dots},
|
||||
donc
|
||||
ce que vous allez lire à propos de SDL doit être pris avec des pincettes.
|
||||
D'autre part, la version \textbf{3} est sortie depuis un certain temps,
|
||||
mais beaucoup de logiciels n'ont pas encore fait la transition.
|
||||
Nous allons rester pour le moment avec la version 2.
|
||||
|
||||
\subsection{Afficher la version}
|
||||
|
||||
Et puisque on parle de version, ils ont pris une approche vraiment
|
||||
interessante (dont je devrais d'ailleurs m'inspirer) dans le cas de
|
||||
l'édition de lien dynamique.
|
||||
|
||||
\begin{verbatim}
|
||||
SDL_version compiled;
|
||||
SDL_version linked;
|
||||
SDL_VERSION(&compiled);
|
||||
SDL_GetVersion(&linked);
|
||||
printf("We compiled against SDL version %d.%d.%d ...\n",
|
||||
compiled.major, compiled.minor, compiled.patch);
|
||||
printf("But we linked against SDL version %d.%d.%d.\n",
|
||||
linked.major, linked.minor, linked.patch);
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
Voici quelques notes en vrac sur divers logiciels qui permettent
|
||||
de faire des dessins et des images.\dots
|
||||
|
||||
% ------------------------------------------------
|
||||
|
||||
\section{Flydraw}\index{Flydraw}
|
||||
\subsection{Mon premier "bug"}
|
||||
|
||||
Comment faire des dessins en écrivant des lignes de codes ?
|
||||
C'est en essayant quelques fonctions de la SDL dans le but de faire
|
||||
un dégradé\footnote{On a toujours besoin de dégrader...} de couleurs
|
||||
que je suis tombé sur une anomalie que je n'arrive pas (encore)
|
||||
a m'expliquer.
|
||||
|
||||
\begin{quote}
|
||||
flydraw is a drawing tool based on an interpreter which parses a
|
||||
language featuring rich graphic primitives; it uses libgd to output
|
||||
GIF, JPEG, or PNG\index{PNG} files.
|
||||
\end{quote}
|
||||
\lstinputlisting[language=c]{code/SDL2/strangebug.c}
|
||||
|
||||
\lstinputlisting{code/dessiner.fly}
|
||||
C'est peut-être ma totale méconnaissance du sujet qui m'a
|
||||
fait faire une bêtise àlc, et je ne vois pas laquelle\dots
|
||||
Une enquête est en préparation.
|
||||
|
||||
Pour le moment, les résultats ne sont pas encourageants~:
|
||||
\begin{verbatim}
|
||||
tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly
|
||||
bad_parms -100000
|
||||
tth@fubar:~/Documents/TetaTricks/code$
|
||||
\end{verbatim}
|
||||
|
||||
Mais en s'obstinant un peu au \textsl{cargocult}, il
|
||||
s'avère que la documentation et le code semble ne sont
|
||||
pas d'accord. Et les messages d'erreur trop
|
||||
cryptiques pour moi. Donc, on y arrive.
|
||||
|
||||
\begin{figure}[h]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.75]{code/flydraw}
|
||||
\caption{Flydraw}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
Ceci dit, une lecture attentive du code source\footnote{UTSL!} permettra
|
||||
de contourner ces petits désagréments, et de rédiger quelques exemples
|
||||
d'utilisation amusants.
|
||||
|
||||
% package source
|
||||
% http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz
|
||||
% ------------------------------------------------
|
||||
%
|
||||
% Fri Sep 27 14:09:45 UTC 2024
|
||||
% la section sur flydram est partie dans les unused
|
||||
%
|
||||
|
||||
%====================================================================
|
||||
|
||||
\section{Povray}\index{Povray}
|
||||
\section{Povray}\index{Povray}\label{Povray}
|
||||
|
||||
\textbf{Persistence Of Vision} est un logiciel de raytracing qui
|
||||
existe depuis plus de trente ans. C'est un lointain descendant
|
||||
de DKBtrace. Mais le raytracing, c'est quoi ?
|
||||
|
||||
\vspace{2em}
|
||||
XXX\index{XXX} expliquer le raytracing.
|
||||
|
||||
% -----------------------------------------------------------------
|
||||
\subsection{Première scène}
|
||||
|
||||
Le "hello world" du raytracing, c'est la boule miroir au
|
||||
dessus d'un sol à carreaux, deux éléments.
|
||||
Mais nous aurons aussi besoin de lumière et d'une caméra
|
||||
pour y voir quelque chose.
|
||||
Respectons la tradition, et tentons un EMC\index{EMC}..
|
||||
|
||||
\lstinputlisting[]{code/POV/hello.pov}
|
||||
|
||||
Quelques explications~:
|
||||
|
||||
|
||||
% -----------------------------------------------------------------
|
||||
\subsection{Deux langages, \small{\textsl{WTF?}}} \index{wtf}
|
||||
|
||||
En fait, les grands fichiers que vous écrivez pour construire
|
||||
vos scènes contiennent \textbf{deux} langages différents.
|
||||
Le premier décrit le contenu de la scène : les objets, les
|
||||
textures, les lumières, la caméra\dots
|
||||
C'est pour ça qu'il est appelé SDL\index{SDL},
|
||||
\textsl{Scene Dscription Language}.
|
||||
Le second est plutôt un langage de
|
||||
programmation\footnote{Turing complet ?}
|
||||
avec des variables, des tests, des boucles, des \textsl{io},
|
||||
et tout ce genre de choses.
|
||||
Et les deux sont entrelacés, ce qui est une bonne chose,
|
||||
même si ça conduit à du code qui pique les yeux.
|
||||
|
||||
% -----------------------------------------------------------------
|
||||
% -----------------------------------------------------------------
|
||||
|
||||
\subsection{Caméra}
|
||||
|
||||
Vous avez des problèmes pour caler les mouvement de la caméra ?
|
||||
@@ -58,54 +125,81 @@ Vous avez deux trajectoires (mal) calculées pour la
|
||||
\texttt{location} et le \texttt{look\_at}, et rien ne tombe
|
||||
en face de l'objectif ? Voici une approche de solution.
|
||||
|
||||
La première étape est l'enregistrerement des paramètres de la caméra
|
||||
La première étape est l'enregistrement des paramètres de la caméra
|
||||
(préalablement calculés par de savantes mais mauvaises formules)
|
||||
lors du calcul de la séquence~:
|
||||
|
||||
\begin{verbatim}
|
||||
#if (0 = clock)
|
||||
#fopen CL "cam.log" create
|
||||
#fopen CL "WS/cam.log" write
|
||||
#else
|
||||
#fopen CL "cam.log" append
|
||||
#fopen CL "WS/cam.log" append
|
||||
#end
|
||||
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
|
||||
" ", LatX, " ", LatY, " ", LatZ,"\n")
|
||||
#fclose CL
|
||||
\end{verbatim}
|
||||
|
||||
Et la seconde étape, l'exploitation, ou plutôt la visualisation
|
||||
Et la seconde étape, l'exploitation avec \textsc{R},
|
||||
le logiciel de statistiques (que nous verrons bientôt),
|
||||
ou la visualisation
|
||||
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
|
||||
|
||||
\begin{verbatim}
|
||||
#!/bin/bash
|
||||
|
||||
FILE="cam.log"
|
||||
FILE="WS/cam.log"
|
||||
TMPF="/dev/shm/cam.data"
|
||||
IMAGE="graphe.png"
|
||||
tail -360 ${FILE} | sort -n > ${TMPF}
|
||||
gnuplot << __EOC__
|
||||
set term png size 720,720
|
||||
set output "${IMAGE}"
|
||||
set ytics 2
|
||||
set xtics 2
|
||||
set grid front
|
||||
set title "Rush Camera"
|
||||
plot "${TMPF}" using 2:4 title "Cam", \
|
||||
"${TMPF}" using 5:7 title "Lat" with dots
|
||||
set term png size 720,720
|
||||
set output "${IMAGE}"
|
||||
set ytics 2
|
||||
set xtics 2
|
||||
set grid front
|
||||
set title "Rush Camera"
|
||||
plot "${TMPF}" using 2:4 title "Cam", \
|
||||
"${TMPF}" using 5:7 title "Lat" with dots
|
||||
__EOC__
|
||||
display "${IMAGE}" &
|
||||
\end{verbatim}
|
||||
|
||||
Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique
|
||||
la commande\texttt{tail} au début du script. Ensuite les deux clauses
|
||||
la commande \texttt{tail} au début du script. Ensuite les deux clauses
|
||||
\textsl{using 2:4 / 5:7} permettent de sélectionner les deux
|
||||
coordonnées X et Z, dans le repère POVray, qui n'est pas le même que
|
||||
celui de Gnuplot.
|
||||
|
||||
|
||||
% ------------------------------------------------
|
||||
% updated Fri Sep 27 13:41:54 UTC 2024
|
||||
\subsection{image\_map}
|
||||
|
||||
XXX \index{XXX}
|
||||
Autre composante essentielle du raytracing, le collage d'une
|
||||
image sur quelque chose, comme quand vous recouvrez une
|
||||
boite de Camembert\index{Camenbert} avec du papier peint
|
||||
des années 50.
|
||||
Il suffit d'utiliser les pixels de l'image comme pigment.
|
||||
|
||||
\begin{verbatim}
|
||||
plane { -z,0 pigment { image_map {png "Eggs.png"} } }
|
||||
\end{verbatim}
|
||||
|
||||
\textsl{By default, the image is mapped onto the
|
||||
\textbf{x-y-plane}.
|
||||
The
|
||||
image is projected onto the object as though there were a
|
||||
slide projector somewhere in the -z-direction.
|
||||
The image
|
||||
exactly fills the square area from (x,y) coordinates
|
||||
(0,0) to (1,1) regardless of the image's original size in
|
||||
pixels.
|
||||
If you would like to change this default you may
|
||||
translate, rotate or scale the pigment or texture to map
|
||||
it onto the object's surface as desired.
|
||||
}%
|
||||
\footnote{https://wiki.povray.org/content/Reference:Image\_Map}
|
||||
|
||||
% ------------------------------------------------
|
||||
|
||||
@@ -206,7 +300,7 @@ material {
|
||||
|
||||
\section{Avec Fortran}
|
||||
|
||||
plplot\index{plplot} est la piste à explorer.
|
||||
plplot\index{plplot} est une des pistes à explorer.
|
||||
|
||||
|
||||
% ------------------------------------------------
|
||||
|
||||
@@ -20,8 +20,9 @@ foo = read(joy_fd, &js, sizeof(struct js_event));
|
||||
|
||||
Quand les choses ne se passent pas comme prévu, quand il
|
||||
y a des accrocs dans le plan, que le résultat n'est
|
||||
qu'une video totalement noire de 17 minutes.
|
||||
dmesg, lshw, lsusb, lspci\dots
|
||||
qu'une video totalement noire de 17 minutes, que des
|
||||
octets incongrus arrivent depuis l'Arduino.
|
||||
dmesg, lscpu, lshw, lsusb, lspci\dots
|
||||
|
||||
% -----------------------------------------------------------
|
||||
% new: Fri Sep 22 11:13:36 UTC 2023
|
||||
@@ -37,6 +38,20 @@ on some PowerPC machines (PowerMac G4 is known to work).
|
||||
\end{quote}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\subsection{lscpu} \index{lscpu}
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Desktop$ lscpu --all --extended
|
||||
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
|
||||
0 0 0 0 0:0:0:0 yes 3800.0000 1600.0000
|
||||
1 0 0 1 1:1:1:0 yes 3800.0000 1600.0000
|
||||
2 0 0 2 2:2:2:0 yes 3800.0000 1600.0000
|
||||
3 0 0 3 3:3:3:0 yes 3800.0000 1600.0000
|
||||
tth@redlady:~/Desktop$
|
||||
\end{verbatim}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
\section{Ports série}
|
||||
\index{rs232} \label{rs232}
|
||||
|
||||
@@ -50,7 +65,9 @@ ainsi que la norme ISO 2110 pour la connectique.
|
||||
\end{quote}
|
||||
|
||||
Comment détecter si un \textit{device} correspond bien
|
||||
à un port série ?
|
||||
à un port série ? Une fois de plus, la réponse passe
|
||||
par un \textsl{ioctl}\index{ioctl}.
|
||||
Même si il est bien caché.
|
||||
|
||||
\begin{lstlisting}[language=C]
|
||||
#include <stdio.h>
|
||||
@@ -76,6 +93,11 @@ return 0;
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
En effet, \texttt{tcgetattr(3)} va aller lire le paramétrage
|
||||
du port associé au descripteur de fichier \texttt{fd}
|
||||
par l'intermédiaire d'un ioctl (qui aurait pû prévoir ?)
|
||||
que nous détaillerons un de ces jours.
|
||||
|
||||
Et la question qui, je le sens, va venir~: « à quoi peut bien
|
||||
servir un port série ? » appelle un réponse presque évidente~:
|
||||
« à plusieurs choses ». Une petite liste~:
|
||||
@@ -83,13 +105,14 @@ Connecter un Minitel\index{MINITEL}
|
||||
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
|
||||
Sportster 14400 pour retrouver Fidonet\index{Fidonet} ?
|
||||
Discuter avec un équipement avionnique ? Rediriger
|
||||
l'impression d'un MSX\index{MSX} vers Cups\index{cups} ?
|
||||
l'impression d'un MSX\index{MSX} ou d'un Alice 32
|
||||
vers Cups\index{cups} ?
|
||||
|
||||
Les possibilités sont infinies. C'est votre imagination qui
|
||||
est la limite\footnote{Comme à peu près tout dans la vie.}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\section{Ports //} \label{portparallele}
|
||||
\section{Ports \textbf{//}} \label{portparallele}
|
||||
\index{port //}
|
||||
|
||||
% http://people.redhat.com/twaugh/parport/html/x623.html
|
||||
@@ -98,6 +121,23 @@ périphérique \texttt{/dev/parport}
|
||||
|
||||
Question: comment faire du \textsl{bitbanging} ?
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\section{USB} \index{USB} \label{USB}
|
||||
|
||||
Universal Serial Bus, existe en trois taille.
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Devel/TetaTricks$ lsusb
|
||||
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||||
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||||
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||||
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||||
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
|
||||
Bus 002 Device 006: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
|
||||
Bus 002 Device 002: ID 0461:4e6f Primax Electronics, Ltd
|
||||
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||||
\end{verbatim}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
\section{Disques durs}
|
||||
@@ -158,8 +198,8 @@ idéal, la prédiction des pannes.
|
||||
|
||||
\textsl{Check and repair a Linux filesystem}
|
||||
|
||||
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne la
|
||||
tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne
|
||||
la tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\subsection{tune2fs}\index{tune2fs}
|
||||
@@ -167,6 +207,26 @@ tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||
\textsl{Adjust tunable filesystem parameters on ext2/ext3/ext4
|
||||
filesystems}\footnote{You can tune a fs, but you can't tuna fish}.
|
||||
|
||||
% -----------------------------------------------------------
|
||||
% nouveau 2 juin 2024
|
||||
% basé sur mes tentatives pour faire marcher l'interface
|
||||
% Enttec OpenDMX USB
|
||||
|
||||
\section{udev} \index{udev} \label{udev}
|
||||
|
||||
\begin{quote}
|
||||
udev supplies the system software with device events, manages
|
||||
permissions of device nodes and may create additional symlinks in the
|
||||
/dev directory, or renames network interfaces. The kernel usually just
|
||||
assigns unpredictable device names based on the order of discovery.
|
||||
Meaningful symlinks or network device names provide a way to reliably
|
||||
identify devices based on their properties or current configuration.
|
||||
\end{quote}
|
||||
|
||||
Avant de rentre dans les détails, nous pouvons aller voir un exemple
|
||||
concret en page \pageref{OpenDMX} où nous atriburons un nom fixe
|
||||
à une interface USB.
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
\section{Sensors} \index{sensors}
|
||||
@@ -195,7 +255,7 @@ int retcode;
|
||||
struct ifreq req;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s \"%s\" to %p\n", \
|
||||
fprintf(stderr, ">>> %s ( \"%s\" to %p )\n", \
|
||||
__func__, ifname, p_flags);
|
||||
#endif
|
||||
|
||||
@@ -225,8 +285,7 @@ if (retcode < 0)
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
#if DEBUG_LEVEL
|
||||
/* display the result */
|
||||
#if DEBUG_LEVEL /* display the result */
|
||||
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
||||
#endif
|
||||
|
||||
@@ -241,7 +300,6 @@ Hélas, je n'ai pas pu trop tester ce truc sur beaucoup de systèmes,
|
||||
et je vous propose de ne pas trop lui faire confiance pour une
|
||||
application critique...
|
||||
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
|
||||
Le traitement des images est un art à part entière. Nous allons
|
||||
voir quelques grands classiques de la catégorie pas du tout
|
||||
interactif. Le genre de machin que l'on peut ranger au fond
|
||||
interactif.
|
||||
Le genre de machin que l'on peut ranger au fond
|
||||
d'un script shell pour le réutiliser la semaine prochaine.
|
||||
|
||||
\begin{itemize}
|
||||
@@ -27,7 +28,8 @@ et leurs interactions parfois troublantes\dots
|
||||
Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
|
||||
la plupart des traitements,
|
||||
\texttt{display} et \texttt{animate} pour visualiser des images,
|
||||
\texttt{identify} pour en lire les méta-données.
|
||||
\texttt{identify} pour en lire les méta-données,
|
||||
\texttt{montage} pour assembler plusieurs images.
|
||||
|
||||
Ils partagent un certain nombre d'options communes.
|
||||
Certains d'entre eux peuvent avoir un effet destructif%
|
||||
@@ -190,6 +192,10 @@ On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
|
||||
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
|
||||
\end{verbatim}
|
||||
|
||||
Un volontaire dans la salle pour faire des tests de performance ?
|
||||
Ma première hypothèse est que le résultat des mesures peut
|
||||
être assez surprenant.
|
||||
|
||||
% ------------------------------------------
|
||||
|
||||
\subsection{identify}\index{identify}
|
||||
@@ -311,7 +317,7 @@ for ((y=0; y<250; y++)) {
|
||||
|
||||
Comment faire un \textsl{resize} avec NetPBM ?
|
||||
Est-il nécessaire d'apprendre la bibliothèque de fonctions
|
||||
\texttt{libnetpbm}\footnote{Réponse: oui.} ?
|
||||
\texttt{libnetpbm}\footnote{Réponse: certainement oui.} ?
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
@@ -340,11 +346,11 @@ use it heavily.
|
||||
\end{quote}
|
||||
|
||||
\begin{verbatim}
|
||||
tiffcp combines one or more files created according to the Tag Image
|
||||
File Format, Revision 6.0 into a single TIFF file. Because the output
|
||||
file may be compressed using a different algorithm than the input
|
||||
files, tiffcp is most often used to convert between different compres‐
|
||||
sion schemes.
|
||||
tiffcp combines one or more files created according to the Tag Image
|
||||
File Format, Revision 6.0 into a single TIFF file. Because the output
|
||||
file may be compressed using a different algorithm than the input
|
||||
files, tiffcp is most often used to convert between different compres‐
|
||||
sion schemes.
|
||||
\end{verbatim}
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
@@ -21,13 +21,15 @@ fprintf(stderr, "Name: \"%s\"\n", joy_name);
|
||||
La macro \texttt{JSIOCGNAME} étant définie dans le fichier
|
||||
\texttt{/usr/include/linux/joystick.h} comme
|
||||
\texttt{\_IOC(\_IOC\_READ, 'j', 0x13, len)}.
|
||||
Bon, OK, j'aurais pu choisir un exemple plus simple,
|
||||
Bon, d'accord, j'aurais pu choisir un exemple plus simple,
|
||||
mais vous avez capté le principe\dots
|
||||
|
||||
% =========================================================
|
||||
|
||||
\vspace{5em}
|
||||
|
||||
Ailleurs dans ce document : Ports série (p. \pageref{rs232})
|
||||
Ailleurs dans ce document :
|
||||
la gestion des ports série (p. \pageref{rs232}) utilise beaucoup les ioctl,
|
||||
tout comme les webcams (p. \pageref{chap:webcam})
|
||||
|
||||
% =========================================================
|
||||
|
||||
20
chap/livres.tex
Normal file
20
chap/livres.tex
Normal file
@@ -0,0 +1,20 @@
|
||||
% ===============================================================
|
||||
% nouveau du Tue Sep 24 11:50:13 UTC 2024
|
||||
% ===============================================================
|
||||
\chapter{Mes livres} \label{chap:livres}
|
||||
|
||||
J'aime les livres, parce qu'ils sont bien plus durables que
|
||||
tout ce que nous propose l'informatique actuelle.
|
||||
Il faut dire que j'ai commencé l'informatique à la fin des
|
||||
années 1970, quand ni Altavista, ni Inktomy n'existaient.
|
||||
|
||||
Ceux qui avaient de la chance pouvaient parfois voir passer
|
||||
quelques exemplaires de \textsf{Byte} ou \textsf{Dr Dobbs},
|
||||
les électroniciens avaient \textsf{Le Haut-Parleur},
|
||||
et les vraiments chanceux achetaient leur documentation
|
||||
chez \textsf{Perlor Radio}.
|
||||
|
||||
|
||||
|
||||
% ===============================================================
|
||||
% ===============================================================
|
||||
@@ -2,8 +2,9 @@
|
||||
\index{man}
|
||||
\label{chap:manpages}
|
||||
|
||||
Guidelines for writing man pages can be found in \texttt{mdoc(7)}.
|
||||
|
||||
man is the system's manual pager. Each page argument given to man is
|
||||
\texttt{man} is the system's manual pager. Each page argument given to man is
|
||||
normally the name of a program, utility or function. The manual page
|
||||
associated with each of these arguments is then found and displayed. A
|
||||
section, if provided, will direct man to look only in that section of
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
\chapter{Photographie}
|
||||
\label{chap:photos}
|
||||
\index{Photo}
|
||||
|
||||
Le domaine de la photographie numérique est vaste.
|
||||
@@ -37,7 +38,7 @@ connexion possibles, la liste des appareils gérés, et l'éventuel
|
||||
appareil connecté, si il est sous tension, bien entendu :)
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Photos/Canon600D/2022-12$ gphoto2 --auto-detect
|
||||
tth@redlady:~/Photos$ gphoto2 --auto-detect
|
||||
Model Port
|
||||
----------------------------------------------------------
|
||||
Canon EOS 600D usb:002,005
|
||||
|
||||
@@ -1,20 +1,98 @@
|
||||
\chapter{\texttt{lp0 on fire!}}
|
||||
\chapter{\textbf{\textsl{lp0 on fire!}}}
|
||||
\label{chap:imprimer}
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
L'impression sour Linux semble avoir plusieurs personnalités.
|
||||
La chaine logicielle mise en œuvre est parfois étonnament
|
||||
complexe, et ls système par defaut, \texttt{CUPS}, se contrôle
|
||||
par une interface Web.
|
||||
Les aspects matériels sont vus dans le chapitré adéquat,
|
||||
en page \pageref{portparallele}.
|
||||
|
||||
\section{CUPS} \index{CUPS}
|
||||
|
||||
|
||||
complexe (il en existe même plusieurs) et ls système par défaut,
|
||||
\texttt{CUPS} (page \pageref{CUPS}), se contrôle
|
||||
avec une interface Web et/ou des outils en cli..
|
||||
|
||||
Les aspects matériels de la connexion seront vus dans un chapitre adéquat,
|
||||
en page \pageref{portparallele} pour le port \texttt{//},
|
||||
et \pageref{rs232} pour le serial.
|
||||
L'omniprésente connectivité USB\index{USB} demande peut-être
|
||||
un chapitre à part entière.
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
\section{Historique}
|
||||
|
||||
Line Printer Daemon Protocol
|
||||
|
||||
LPR Ng
|
||||
|
||||
Cf le bouquin de Bellanger.
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
% https://fr.wikipedia.org/wiki/Internet_Printing_Protocol
|
||||
|
||||
\section{IPP : Internet Printing Protocole} \index{IPP} \label{IPP}
|
||||
|
||||
\begin{quote}
|
||||
\textbf{wikipedia:}
|
||||
« IPP Everywhere » est une évolution du protocole, publiée en 2013.
|
||||
Il fournit une base de référence commune pour les imprimantes afin de
|
||||
prendre en charge l'impression dite "sans pilote" à partir de périphériques
|
||||
clients. Elle s'appuie sur IPP et précise des règles supplémentaires
|
||||
d'interopérabilité, telles qu'une liste des
|
||||
formats de documents que les imprimantes doivent prendre en charge.
|
||||
\end{quote}
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
%
|
||||
% https://www.evilsocket.net/2024/09/26/Attacking-UNIX-systems-via-CUPS-Part-I/
|
||||
%
|
||||
|
||||
\section{CUPS} \index{CUPS} \label{CUPS}
|
||||
|
||||
\begin{quote}
|
||||
\textbf{wikipedia:}
|
||||
Common Unix Printing System (CUPS) est un système modulaire d'impression
|
||||
numérique pour les systèmes d'exploitation Unix et assimilés.
|
||||
Tout ordinateur qui utilise CUPS peut se comporter comme un serveur d'impression ;
|
||||
il peut accepter des documents envoyés par d'autres machines (ordinateurs clients),
|
||||
les traiter, et les envoyer à l'imprimante qui convient.
|
||||
\end{quote}
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
\section{Pretty printers}.
|
||||
|
||||
\subsection{enscript} \index{enscript}
|
||||
\begin{verbatim}
|
||||
DESCRIPTION
|
||||
Enscript converts text files to PostScript or to other output
|
||||
languages. Enscript can spool the generated output directly
|
||||
to a specified printer or leave it to a file. If no input
|
||||
files are given, enscript processes the standard input stdin.
|
||||
Enscript can be extended to handle different output media and
|
||||
it has many options which can be used to customize the print‐
|
||||
outs.
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{GNU a2ps} \index{a2ps}
|
||||
\begin{verbatim}
|
||||
DESCRIPTION
|
||||
Convert FILE(s) or standard input to PostScript. By default,
|
||||
the output is sent to the default printer. An output file
|
||||
may be specified with -o.
|
||||
Mandatory arguments to long options are mandatory for short
|
||||
options too. Long options marked with * require a yes/no ar‐
|
||||
gument, corresponding short options stand for `yes'.
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
\subsection{Les autres\dots}
|
||||
\begin{itemize}
|
||||
\item fmt\index{fmt} / pr\index{pr}
|
||||
\item lgrind
|
||||
\item src2tex
|
||||
\item trueprint
|
||||
\end{itemize}
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
|
||||
105
chap/reseau.tex
105
chap/reseau.tex
@@ -2,8 +2,9 @@
|
||||
\label{chap:reseau} \index{Internet}
|
||||
|
||||
Ah, le grand Internet sauvage, il serait temps qu'on en parle un peu.
|
||||
Nous allons voir dans ce chapitre quelques utilisations
|
||||
que l'on peut qualifier de «~créatives~».
|
||||
Nous allons voir dans ce chapitre des logiciels peu connus,
|
||||
et les quelques utilisations que l'on peut en faire
|
||||
afin d'avoir le label « techno-futilité ».
|
||||
|
||||
Si vous attendiez des choses plus sérieuses, j'ai aussi ça
|
||||
en magasin : \textsc{dns} page \pageref{chap:DNS},
|
||||
@@ -34,15 +35,17 @@ il a probablement été remplacé par quelque chose d'encore plus
|
||||
étrange basé sur \textsl{systemd}\index{systemd},
|
||||
puisque l'important
|
||||
ça n'est pas que ça soit mieux, mais que ce soit
|
||||
\textbf{nouveau}.
|
||||
\textbf{nouveau}. Il fallait le dire.
|
||||
|
||||
\subsection{qotd}
|
||||
\index{qotd}
|
||||
% ---------------------------------------------------------
|
||||
|
||||
\subsection{Un serveur pour \textsl{qotd}}
|
||||
\label{xinetd:qotd}
|
||||
|
||||
À titre d'exercice, nous allons reprendre l'exemple du serveur
|
||||
de \textsl{quote of the day} que nous avons déja utilisé avec
|
||||
Inetd\index{inetd}, et lancer le
|
||||
petit script par l'intermédiaire de Xinetd.
|
||||
Inetd\index{inetd} (page \pageref{qotd}),
|
||||
et lancer notre petit script par l'intermédiaire de Xinetd.
|
||||
|
||||
Pour cela, il faut créer dans le répertoire
|
||||
\texttt{/etc/xinetd.d/}\footnote{Attention, ce répertoire
|
||||
@@ -51,27 +54,38 @@ est peut-être un debianisme, ymmv.} un fichier nommé
|
||||
|
||||
\begin{verbatim}
|
||||
service qotd
|
||||
{
|
||||
disable = yes
|
||||
type = UNLISTED
|
||||
|
||||
socket_type = stream
|
||||
protocol = tcp
|
||||
|
||||
user = nobody
|
||||
server = /usr/local/bin/qotd.sh
|
||||
}
|
||||
{
|
||||
disable = no
|
||||
type = UNLISTED
|
||||
socket_type = stream
|
||||
protocol = tcp
|
||||
user = nobody
|
||||
server = /usr/local/bin/qotd.sh
|
||||
}
|
||||
\end{verbatim}
|
||||
|
||||
Bien entendu, le script \texttt{qotd.sh} décrit en page
|
||||
\pageref{inetd} sera placé dans le bon répertoire.
|
||||
Et ouvert aux quatre vents par un
|
||||
\texttt{sudo chmod a+x /usr/local/bin/qotd.sh} de bon aloi.
|
||||
|
||||
\index{fortune}
|
||||
\lstinputlisting[language=sh]{code/inet/qotd.sh}
|
||||
|
||||
Ensuite, il faut demander à Xinetd de relire ses fichiers de
|
||||
configuration par un signal bien senti et au bon endroit.
|
||||
configuration par un bon \textsc{SIGHUP} bien senti
|
||||
et au bon endroit, c'est à dire le PID que l'on pourra
|
||||
(peut-être) obtenir dans \texttt{/var/run/xinetd.pid},
|
||||
et paf.
|
||||
Allons voir si cela fonctionne.
|
||||
|
||||
|
||||
|
||||
Ah, on me murmure dans l'oreille que Xinetd n'existe plus dans
|
||||
les Linux modernes, et qu'il existe quelque chose de
|
||||
\textit{beaucoup mieux}. Je ne sais pas quoi.
|
||||
Je demande à voir\footnote{Parce que c'est écrit par LP ?}.
|
||||
% --> https://0pointer.de/blog/projects/inetd.html
|
||||
|
||||
|
||||
% ==============================================================
|
||||
@@ -92,59 +106,6 @@ Par exemple la comparaison de la mise en œuvre du NAT
|
||||
avec \texttt{iptables} et \texttt{pfctl} est une source de trolls
|
||||
sans fin.
|
||||
|
||||
|
||||
% ==============================================================
|
||||
\section{Iodine}
|
||||
\index{iodine}\label{iodine}
|
||||
|
||||
Iodine, c'est quoi ? C'est un ensemble de logiciels qui permettent
|
||||
de se brancher sur l'Intertube même si on n'a pas d'accès
|
||||
«~autorisé~» par la voisine qui a déménagée vers la
|
||||
lointaine campagne avec sa friboite.
|
||||
|
||||
\begin{quote}
|
||||
This is a piece of software that lets you tunnel IPv4 data through a
|
||||
DNS server. This can be usable in different situations where internet
|
||||
access is firewalled, but DNS queries are allowed.
|
||||
The name iodine was chosen since it starts with IOD (IP Over DNS)
|
||||
and since iodine has atomic number 53, which happens to be the DNS
|
||||
port number.
|
||||
\end{quote}
|
||||
|
||||
À ce jour (2 septembre 2013) ce que vous allez lire est basé
|
||||
sur la version \texttt{0.6.0-rc1} et sera probablement plus ou
|
||||
moins incompatible avec les versions précedentes ou suivantes, ymmv.
|
||||
|
||||
\begin{verbatim}
|
||||
root@plop:iodine-0.6.0-rc1# bin/iodine teton.mooo.com -f -P m
|
||||
Opened dns0
|
||||
Opened UDP socket
|
||||
Sending DNS queries for teton.mooo.com to 192.168.1.1
|
||||
Autodetecting DNS query type (use -T to override)..................
|
||||
iodine: No suitable DNS query type found. Are you connected to a network?
|
||||
iodine: If you expect very long roundtrip delays, use -T explicitly.
|
||||
iodine: (Also, connecting to an "ancient" version of iodined won't work.)
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
\subsection{Coté serveur}
|
||||
|
||||
Je pense qu'il faut commencer par voir du coté du DNS
|
||||
pour déléguer une sous-zone à la machine qui va faire tourner
|
||||
le serveur iodine. Mais j'en suis pas certain. RTFM.
|
||||
|
||||
\subsection{Coté client}
|
||||
|
||||
Je n'en sais pas plus non plus...
|
||||
|
||||
\begin{verbatim}
|
||||
sudo bin/iodine -f -P s3cr3tp4ssw0rd i.buvette.org
|
||||
\end{verbatim}
|
||||
|
||||
Donc, n'ayant plus vraiment (pour le moment) le besoin d'utiliser
|
||||
ce passe-muraille, je vais laisser ce passage en l'état...
|
||||
|
||||
|
||||
% ==============================================================
|
||||
\section{Outils de diagnostic}
|
||||
|
||||
@@ -152,6 +113,8 @@ iftop\index{iftop},
|
||||
iptraf\index{iptraf}
|
||||
\dots
|
||||
|
||||
Mais c'est toujours la faute du \textsc{dns}\index{dns}.
|
||||
|
||||
% -------------------------------------------------------------
|
||||
\subsection{iperf}
|
||||
\index{iperf}
|
||||
|
||||
@@ -1,7 +1,28 @@
|
||||
\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}
|
||||
|
||||
Awk est un langage de programmation crée
|
||||
@@ -9,9 +30,12 @@ par Aho, Kernighan, and Weinberger%
|
||||
\footnote{The AWK Programming Language, Alfred V. Aho,
|
||||
Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988.
|
||||
ISBN 0-201-07981-X. }.
|
||||
Son originalité vient du fait qu'il a été conçu principalement
|
||||
pour traiter ligne par ligne des fichiers tabulés.
|
||||
C'est son domaine de prédilection, autant en profiter.
|
||||
|
||||
Quelques \textsl{oneliners} de bon aloi pour vous donner
|
||||
une idée du langage\dots
|
||||
une idée des possibilités du langage\dots
|
||||
|
||||
\begin{verbatim}
|
||||
cat { print $0 } or just 1
|
||||
@@ -32,15 +56,17 @@ on va procéder en quelque sorte « demi-dalle par demi-dalle ».
|
||||
\subsection{Un exemple simple}
|
||||
|
||||
À partir d'un jeu de données structurées, nous allons générer un
|
||||
fichier \texttt{.inc} contenant un objet pour Povray\index{Povray}.
|
||||
fichier \texttt{.inc} contenant la description en
|
||||
SDL\index{SDL}\footnote{SDL: Scene Description Language}
|
||||
d'un objet pour Povray\index{Povray}.
|
||||
Un cas d'école : un élément par ligne, les valeurs sont séparées par
|
||||
des espaces.
|
||||
des espaces et/ou des tabulations.
|
||||
|
||||
\lstinputlisting[]{code/awk/dataset}
|
||||
|
||||
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
|
||||
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
|
||||
des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord
|
||||
@@ -49,7 +75,129 @@ le voir ici-même~:
|
||||
|
||||
\lstinputlisting[]{code/awk/mkunion.awk}
|
||||
|
||||
La première ligne est pour le traditionnel
|
||||
\textsl{shebang}\index{shebang},
|
||||
avec l'option \texttt{-f} pour que le contenu du script soit lu
|
||||
par l'interpréteur Awk dès son lancement.
|
||||
Ensuite, nous trouvons trois blocs délimités par des accolades,
|
||||
deux d'entre eux étant précédés d'une « instruction ».
|
||||
|
||||
% XXX to be continued XXX
|
||||
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.
|
||||
Ce qui est le bon moment pour initialiser des variables.
|
||||
Nous l'utilisons pour créer l'en-tête d'un descripteur
|
||||
d'objet pour Povray.
|
||||
|
||||
Le second bloc (sans label) est exécuté pour chaque ligne lue.
|
||||
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
|
||||
la lecture et le traitement du dernier enregistrement,
|
||||
qui est dans notre cas la dernière ligne.
|
||||
|
||||
Et à l'exécution~:
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Devel/TetaTricks/code/awk$ ./mkunion.awk < dataset
|
||||
#declare Bubulles = object
|
||||
{
|
||||
union {
|
||||
sphere { <17.000000, 9.000000, 4.000000>, 1.500000 }
|
||||
sphere { <11.000000, 0.800000, 2.300000>, 0.989000 }
|
||||
sphere { <0.000000, 0.000000, 0.000000>, 1.000000 }
|
||||
}
|
||||
}
|
||||
// 3 bubulles
|
||||
\end{verbatim}
|
||||
|
||||
% ===============================================================
|
||||
\subsection{Mais ce n'est pas tout !}
|
||||
|
||||
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}
|
||||
|
||||
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.
|
||||
|
||||
% ===============================================================
|
||||
|
||||
|
||||
|
||||
211
chap/shell.tex
211
chap/shell.tex
@@ -39,24 +39,47 @@ Thu Oct 5 00:53:01 UTC 2023
|
||||
tth@redlady:~$
|
||||
\end{verbatim}
|
||||
|
||||
Ces ordres peuvent être des commandes internes à l'interpréteur,
|
||||
d'autres seront des commandes fournies par des exécutables
|
||||
externes. Pour le début, la différence n'est pas importante.
|
||||
|
||||
Mais comment le shell fait-il pour retrouver tous les outils
|
||||
dont il a besoin ? Simplement, il connait une liste
|
||||
d'endroits où aller chercher, une sorte de chemin de recherche,
|
||||
c'est d'ailleurs pour ça que cette liste
|
||||
est nommée \texttt{PATH}\index{PATH}.
|
||||
Il est très simple de la visualiser~:
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Devel/TetaTricks$ echo $PATH
|
||||
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
|
||||
\end{verbatim}
|
||||
|
||||
% ==============================================================
|
||||
|
||||
\section{Langage}\index{script}
|
||||
\section{Un langage}\index{script}
|
||||
|
||||
Le shell est aussi, et surtout, un langage de programmation, parfois
|
||||
appelé \textsl{glue-language} parce qu'il permet de "coller" ensemble
|
||||
plusieurs opérations élémentaires, d'abord avec ses opérateurs internes
|
||||
et ensuite l'utilisation d'outils
|
||||
extérieurs\footnote{Grep, Sed, Awk, BwBasic...}
|
||||
Le shell est aussi, et surtout, un langage de programmation
|
||||
à part entière.
|
||||
Il est parfois appelé \textsl{glue-language} parce qu'il permet de
|
||||
"coller" ensemble plusieurs opérations élémentaires, d'abord avec
|
||||
ses opérateurs internes et ensuite par l'utilisation d'outils
|
||||
extérieurs\footnote{Grep, Sed, Awk, BwBasic, Sort, Gfortran...}
|
||||
divers. C'est \textsl{très} efficace.
|
||||
|
||||
Nous allons commencer par voir quelques notions liées à
|
||||
la création d'un script exécutable, puis d'un enchainement
|
||||
de commandes.
|
||||
Nous passerons ensuite aux structures de contrôle, comme les
|
||||
tests et les boucles.
|
||||
|
||||
% --------------------------------------------------------------
|
||||
|
||||
\subsection{Le \textsc{shebang}} \index{shebang}
|
||||
\subsection{Le shebang} \index{shebang} \label{shebang}
|
||||
|
||||
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
|
||||
au tout début d'un script shell.
|
||||
Le 'she' est l'abréviation de 'sharp', coupant en français. C'est
|
||||
Le 'she' est l'abréviation de 'sharp', qui veut dire 'coupant' en français.
|
||||
C'est
|
||||
probablement une allusion aux cotés tranchants du \texttt{\#}.
|
||||
Quand au 'bang', c'est le point d'exclamation après l'explosion
|
||||
de la forkbomb.
|
||||
@@ -67,6 +90,26 @@ octets. Si les deux premiers sont \textsl{0x23 0x21}, le reste
|
||||
de la première ligne sera interprété pour lancer un autre exécutable,
|
||||
avec un traitement particuler des options.
|
||||
|
||||
Et à ce momment-là des explications, on entend Serguey qui hurle
|
||||
du fond de la salle « schmod777 en force ! ».
|
||||
Et il a bien raison. En effet, ce fichier doit être vu comme
|
||||
possiblement exécutable selon les droits 'X' qu'il a.
|
||||
Il y a une commande prévue à cet effet, dont nous allons voir
|
||||
l'usage à l'instant, avec la création d'un script complet~:
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~$ echo '#!/bin/bash' > foo.sh
|
||||
tth@redlady:~$ echo 'printf "%x" 85 >> foo.sh
|
||||
tth@redlady:~$ chmod u+x ./foo.sh
|
||||
tth@redlady:~$ ./foo.sh
|
||||
55
|
||||
tth@redlady:~$ cat foo.sh
|
||||
#!/bin/bash
|
||||
printf "%x\n" 85
|
||||
tth@redlady:~$
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
% ==============================================================
|
||||
\section{Le pipeline}\index{pipeline}\label{pipeline}
|
||||
|
||||
@@ -84,43 +127,100 @@ X09:22:29XupX33Xdays,X14:00,XX8Xusers,XXloadXaverage:X0.12,X0.17,X0.17
|
||||
\end{verbatim}
|
||||
|
||||
Bien entendu, on peut utiliser plusieurs tuyaux pour construire
|
||||
une chaine de traitements\footnote{La
|
||||
chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
|
||||
une chaine de traitements%
|
||||
\footnote{La chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
|
||||
On peut même « intercepter » ce qui transite par un des tuyaux.
|
||||
|
||||
\begin{verbatim}
|
||||
$
|
||||
tth@redlady:~/Devel/TetaTricks$ date | tee foo.txt |
|
||||
tr 'EASLeasl' '34573457'
|
||||
W3d 53p 25 16:07:01 C35T 2024
|
||||
tth@redlady:~/Devel/TetaTricks$ cat foo.txt
|
||||
Wed Sep 25 16:07:01 CEST 2024
|
||||
\end{verbatim}
|
||||
|
||||
% ==============================================================
|
||||
% new Wed Sep 25 14:00:07 UTC 2024
|
||||
|
||||
\section{L'environnement} \index{environ}
|
||||
|
||||
Commençons par une petite histoire.
|
||||
Un jour\footnote{été 2024 ?}, je suis tombé par un hasard
|
||||
improbable sur une variable d'environnement nommée
|
||||
\textsc{hostname}. Qui contenait précisément "redlady" !
|
||||
Tout bien.
|
||||
Alors, quelques jours avant, vers 2006, je l'ai utilisée
|
||||
dans un bout de code en C, que j'avais depuis bien
|
||||
bien longtemps oublié au fond
|
||||
d'une 8" hard-sectored.
|
||||
Et là, ça ne marche pas comme je l'espérais.
|
||||
Voyez ce bout de code~:
|
||||
\begin{verbatim}
|
||||
char *nom = "HOSTNAME";
|
||||
printf("%s -> %s\n", nom, getenv(nom));
|
||||
\end{verbatim}
|
||||
|
||||
Il me renvoit \texttt{HOSTNAME -> (null)}.
|
||||
Krkrkr.
|
||||
|
||||
% ==============================================================
|
||||
|
||||
\section{Structures de contrôle}
|
||||
|
||||
Les plus importantes sont là : le choix, la boucle, l'attente,
|
||||
le \textsc{goto}\index{goto} calculé, la sélection,
|
||||
\textsl{make your choice}.
|
||||
|
||||
% --------------------------------------------------------------
|
||||
|
||||
\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}
|
||||
|
||||
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}
|
||||
|
||||
Une bonne manière de rendre votre code modulaire, et de réutiliser
|
||||
des bouts de code à volonté depuis plusieurs programmes.
|
||||
Une fonction peut accepter des paramètres, qui seront
|
||||
connus sous les petits noms de
|
||||
\texttt{\$1 \$2 ... \$n}.
|
||||
|
||||
Voici quelques fonctions~:
|
||||
Voici un fichier contenant quelques fonctions~:
|
||||
|
||||
\lstinputlisting{code/shell/fonctions.sh}
|
||||
|
||||
Et comment les utiliser~:
|
||||
Pour les utiliser, il faut d'abord les charger dans le shell courant.
|
||||
C'est la directive \texttt{source}\index{source} qui s'en charge~:
|
||||
|
||||
\lstinputlisting{code/shell/demofonctions.sh}
|
||||
|
||||
XXX expliquer "source" \index{XXX}
|
||||
|
||||
% ==============================================================
|
||||
|
||||
% https://bwog-notes.chagratt.site/2023/le-heredoc/
|
||||
@@ -128,37 +228,49 @@ Et comment les utiliser~:
|
||||
\section{Heredoc}
|
||||
|
||||
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
||||
|
||||
C'est un moyen simple et efficace de mettre des données textuelles
|
||||
(comme des commandes pour un logiciel particulier)
|
||||
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}
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Devel/TetaTricks$ 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.
|
||||
|
||||
Here Doc
|
||||
|
||||
1 +--------------------------------------------------------------------+
|
||||
| +** *** + + + + |
|
||||
0.8 |-+.......**..........:.**.......:..........:.........sin(x).*******-|
|
||||
| ** : : * : : : : |
|
||||
0.6 |-+....**..:..........:....**....:..........:..........:..........:+-|
|
||||
| * : : * : : : : |
|
||||
0.4 |-+.**.....:..........:.......*..:..........:..........:..........:+-|
|
||||
| * : : * : : : : |
|
||||
0.2 |-*........:..........:.........**..........:..........:..........:+-|
|
||||
|* : : * : : : |
|
||||
0 |-+........:..........:..........:**........:..........:..........:+-|
|
||||
| : : : * : : : *|
|
||||
-0.2 |-+........:..........:..........:..**......:..........:..........:*-|
|
||||
| : : : * : : * |
|
||||
-0.4 |-+........:..........:..........:.....*....:..........:........**:+-|
|
||||
| : : : * : : * : |
|
||||
-0.6 |-+........:..........:..........:.......**.:..........:.....**...:+-|
|
||||
| : : : *: : ** : |
|
||||
-0.8 |-+........:..........:..........:..........**.........:..**......:+-|
|
||||
| + + + + *** +** + |
|
||||
-1 +--------------------------------------------------------------------+
|
||||
0 1 2 3 4 5 6
|
||||
... et la démonstration~:
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~/Devel/TetaTricks/code/shell$ ./heredoc.sh
|
||||
|
||||
Here Doc (9946)
|
||||
|
||||
1 +-------------------------------------------------------------+
|
||||
| + + + + + + + + + |
|
||||
| 0.7*sin(x) ******* |
|
||||
| ****** ****** |
|
||||
0.5 |-+ ** ** ** ** +-|
|
||||
| ** * * ** |
|
||||
| ** ** ** ** |
|
||||
| ** ** ** ** |
|
||||
|* ** ** *|
|
||||
0 |-+ * * +-|
|
||||
| ** ** |
|
||||
| * * |
|
||||
| * * |
|
||||
-0.5 |-+ ** ** +-|
|
||||
| *** *** |
|
||||
| ******* |
|
||||
| |
|
||||
| + + + + + + + + + |
|
||||
-1 +-------------------------------------------------------------+
|
||||
0 1 2 3 4 5 6 7 8 9
|
||||
\end{verbatim}
|
||||
|
||||
Je pense que l'exemple est assez parlant.
|
||||
@@ -175,6 +287,23 @@ Quelle sont les différences entre \texttt{en\_US.UTF-8} et
|
||||
\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}
|
||||
|
||||
\begin{itemize}
|
||||
|
||||
28
chap/son.tex
28
chap/son.tex
@@ -2,10 +2,19 @@
|
||||
\label{chap:son}
|
||||
|
||||
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
|
||||
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}
|
||||
@@ -33,6 +42,8 @@ Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
|
||||
qui permettent d'écouter et d'enregistrer les sets de
|
||||
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
||||
|
||||
Ils partagent beaucoup d'options communes.
|
||||
|
||||
\subsection{arecord}
|
||||
|
||||
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
|
||||
\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...}
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -129,8 +147,8 @@ serveur de stream comme Icecast\index{icecast}
|
||||
Libsndfile est essentiellement une très complète bibliothèque
|
||||
de lecture et écriture de fichiers sons.
|
||||
Elle permet de gérer facilement un nombre
|
||||
considérable de formats de fichiers\footnote{Mais ceci est une autre
|
||||
histoire, que nous verrons peut-être un de ces jours\dots}.
|
||||
considérable de formats de fichiers,
|
||||
que nous verrons peut-être un de ces jours\dots.
|
||||
|
||||
Elle arrive avec une floppée d'outils en ligne de
|
||||
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
|
||||
le son, il y a deux choix à faire. La partie logicielle d'une part
|
||||
(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
|
||||
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
|
||||
|
||||
3
chap/systemd.tex
Normal file
3
chap/systemd.tex
Normal file
@@ -0,0 +1,3 @@
|
||||
\chapter{systemd}
|
||||
\label{chap:systemd}
|
||||
|
||||
3
chap/systemd.text
Normal file
3
chap/systemd.text
Normal file
@@ -0,0 +1,3 @@
|
||||
\chapter{systemd}
|
||||
\label{chap:systemd}
|
||||
|
||||
@@ -5,6 +5,10 @@ de le présenter de façon harmonieuse, tout le monde l'a déja
|
||||
fait, avec des outils divers et variés et des résultats parfois
|
||||
(ou souvent) hasardeux.
|
||||
|
||||
Heureusement, Unix\index{Unix} a été conçu quasiment dès
|
||||
le départ avec tout ce qu'il faut pour traiter et
|
||||
mettre en page du texte.
|
||||
|
||||
\section{fmt et ses copains}
|
||||
\index{fmt}\index{tr}
|
||||
|
||||
@@ -33,19 +37,20 @@ condimentum ante in metus iaculis quis congue diam commodo.
|
||||
|
||||
%-------------------------------------------------------------
|
||||
|
||||
\section{roff}
|
||||
\index{roff}\label{roff}
|
||||
\section{La famille \texttt{roff}}
|
||||
\index{roff}\label{roff} \index{groff}\index{troff}
|
||||
|
||||
%
|
||||
% https://linuxfr.org/users/karchnu/journaux/redecouverte-roff
|
||||
% https://pjfichet.github.io/utroff/
|
||||
%
|
||||
% https://allthingsopen.org/articles/linux-and-unix-experiment-part-2
|
||||
|
||||
\textbf{Roff} est l'outil qui a permis à quelques hackers légendaire
|
||||
de justifier auprès de leur hiérarchie le développement d'une machine
|
||||
de jeu, il est donc légitime d'en parler, non ?
|
||||
|
||||
Après quelques minutes d'expérimentation, un premier souci arrive.
|
||||
Après quelques minutes d'expérimentation, un premier souci arrive%
|
||||
\footnote{Mais qui est peut-être causé par l'ancienneté de mon système ?}.
|
||||
Il semble bien que \texttt{groff} ne sache pas lire les fichiers
|
||||
encodés en \textbf{utf8}\index{utf8}. Il faut donc utiliser
|
||||
un hack avec \texttt{recode} en prenant bien soin d'utiliser
|
||||
@@ -59,7 +64,48 @@ D'un autre coté, c'est \texttt{roff} qui est utilisé pour formater
|
||||
les pages du manuel Unix. La documentation, c'est important.
|
||||
C'est pour ça que j'en cause page \pageref{chap:manpages}.
|
||||
|
||||
Voyons rapidement un exemple minumum compilable. XXX
|
||||
Voyons rapidement un exemple minimum compilable\index{EMC},
|
||||
le fichier
|
||||
\texttt{premier.roff}~:
|
||||
|
||||
\lstinputlisting{code/roff/premier.roff}
|
||||
|
||||
Il y a deux choses différentes ici : les instructions de formatage
|
||||
et le texte en lui-même.
|
||||
Une instruction est placée en début de ligne.
|
||||
Elle commence par un point, et est constituée de deux lettres,
|
||||
eventuellement suivie de paramètres.
|
||||
Nous avons \texttt{.ti} (\textsl{temporary indent})
|
||||
qui gère l'indentation de la ligne qui suit,
|
||||
et \texttt{.sp} (\textsl{spacing})
|
||||
qui va sauter une ou plusieurs lignes.
|
||||
|
||||
Après compilation par la commande
|
||||
"\texttt{nroff -Tutf8 < premier.roff > premier.text}",
|
||||
nous obtenons ce résultat~:
|
||||
|
||||
\begin{verbatim}
|
||||
hello world.
|
||||
|
||||
Ceci est le premier exemple avec nroff.
|
||||
|
||||
|
||||
je vais essayer quelques variations de mise en page en jouant sur
|
||||
les diverses marges, puis explorer les "mises en avant" comme le
|
||||
gras, l’italique, le soulignement, toussa. Ensuite il me faudra
|
||||
solutionner le souci avec UTF8 :(
|
||||
\end{verbatim}
|
||||
|
||||
On peut dire que c'est un bon début, avec juste deux commandes,
|
||||
on a déja un résultat visible.
|
||||
Voyons maintenant quelques autres possibilités du roff de base.
|
||||
|
||||
|
||||
|
||||
|
||||
Mais une mise en page un peu
|
||||
avancée peut devenir vite fastidieuse avec ces instructions
|
||||
de bas niveau.
|
||||
|
||||
\subsection{eqn}
|
||||
|
||||
@@ -82,6 +128,10 @@ input files into commands that are understood by troff.
|
||||
input files into commands that are understood by troff.
|
||||
\end{quote}
|
||||
|
||||
\subsection{Autres trucs...}
|
||||
|
||||
\texttt{colcrt} : filter nroff output for CRT previewing
|
||||
|
||||
%-------------------------------------------------------------
|
||||
\section{yodl}
|
||||
\index{yodl}
|
||||
|
||||
39
chap/unused/flydraw.tex
Normal file
39
chap/unused/flydraw.tex
Normal file
@@ -0,0 +1,39 @@
|
||||
|
||||
\section{Flydraw}\index{Flydraw}
|
||||
|
||||
Comment faire des dessins en écrivant des lignes de codes ?
|
||||
|
||||
\begin{quote}
|
||||
flydraw is a drawing tool based on an interpreter which parses a
|
||||
language featuring rich graphic primitives; it uses libgd to output
|
||||
GIF, JPEG, or PNG\index{PNG} files.
|
||||
\end{quote}
|
||||
|
||||
\lstinputlisting{code/dessiner.fly}
|
||||
|
||||
Pour le moment, les résultats ne sont pas encourageants~:
|
||||
\begin{verbatim}
|
||||
tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly
|
||||
bad_parms -100000
|
||||
tth@fubar:~/Documents/TetaTricks/code$
|
||||
\end{verbatim}
|
||||
|
||||
Mais en s'obstinant un peu au \textsl{cargocult}, il
|
||||
s'avère que la documentation et le code semble ne sont
|
||||
pas d'accord. Et les messages d'erreur trop
|
||||
cryptiques pour moi. Donc, on y arrive.
|
||||
|
||||
\begin{figure}[h]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.75]{code/flydraw}
|
||||
\caption{Flydraw}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
Ceci dit, une lecture attentive du code source\footnote{UTSL!} permettra
|
||||
de contourner ces petits désagréments, et de rédiger quelques exemples
|
||||
d'utilisation amusants.
|
||||
|
||||
% package source
|
||||
% http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz
|
||||
|
||||
53
chap/unused/iodine.tex
Normal file
53
chap/unused/iodine.tex
Normal file
@@ -0,0 +1,53 @@
|
||||
% ==============================================================
|
||||
\section{Iodine}
|
||||
\index{iodine}\label{iodine}
|
||||
|
||||
Iodine, c'est quoi ? C'est un ensemble de logiciels qui permettent
|
||||
de se brancher sur l'Intertube même si on n'a pas d'accès
|
||||
«~autorisé~» par la voisine qui a déménagée vers la
|
||||
lointaine campagne avec sa friboite.
|
||||
|
||||
\begin{quote}
|
||||
This is a piece of software that lets you tunnel IPv4 data through a
|
||||
DNS server. This can be usable in different situations where internet
|
||||
access is firewalled, but DNS queries are allowed.
|
||||
The name iodine was chosen since it starts with IOD (IP Over DNS)
|
||||
and since iodine has atomic number 53, which happens to be the DNS
|
||||
port number.
|
||||
\end{quote}
|
||||
|
||||
À ce jour (2 septembre 2013) ce que vous allez lire est basé
|
||||
sur la version \texttt{0.6.0-rc1} et sera probablement plus ou
|
||||
moins incompatible avec les versions précedentes ou suivantes, ymmv.
|
||||
|
||||
\begin{verbatim}
|
||||
root@plop:iodine-0.6.0-rc1# bin/iodine teton.mooo.com -f -P m
|
||||
Opened dns0
|
||||
Opened UDP socket
|
||||
Sending DNS queries for teton.mooo.com to 192.168.1.1
|
||||
Autodetecting DNS query type (use -T to override)..................
|
||||
iodine: No suitable DNS query type found. Are you connected to a network?
|
||||
iodine: If you expect very long roundtrip delays, use -T explicitly.
|
||||
iodine: (Also, connecting to an "ancient" version of iodined won't work.)
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
\subsection{Coté serveur}
|
||||
|
||||
Je pense qu'il faut commencer par voir du coté du DNS
|
||||
pour déléguer une sous-zone à la machine qui va faire tourner
|
||||
le serveur iodine. Mais j'en suis pas certain. RTFM.
|
||||
|
||||
\subsection{Coté client}
|
||||
|
||||
Je n'en sais pas plus non plus...
|
||||
|
||||
\begin{verbatim}
|
||||
sudo bin/iodine -f -P s3cr3tp4ssw0rd i.buvette.org
|
||||
\end{verbatim}
|
||||
|
||||
Donc, n'ayant plus vraiment (pour le moment) le besoin d'utiliser
|
||||
ce passe-muraille, je vais laisser ce passage en l'état...
|
||||
% ==============================================================
|
||||
|
||||
|
||||
@@ -62,7 +62,6 @@ Il existe bien une alternative, mais je n'ai pas encore essayé~:
|
||||
\# Write out 20 png format frames from a video starting at 3 minutes, 46 seconds.
|
||||
|
||||
|
||||
|
||||
Tu peux générer les images de transition avec
|
||||
ImageMagick\index{ImageMagick} :
|
||||
\texttt{convert a.png b.png -alpha set -channel A
|
||||
@@ -149,8 +148,6 @@ OMFG! Il manque le son.
|
||||
% mais où ai-je bien pu trouver ça ?
|
||||
%
|
||||
|
||||
|
||||
|
||||
\begin{verbatim}
|
||||
read -p "*** Press Enter to start recording ***"
|
||||
"$FFMPEGBIN" \
|
||||
@@ -224,11 +221,11 @@ Et avec du \textbf{Zenitram} dedans \textit{:)}
|
||||
\section{MPV} \index{MPV}
|
||||
|
||||
\begin{quote}
|
||||
mpv is a media player based on MPlayer and mplayer2. It supports a wide
|
||||
variety of video file formats, audio and video codecs, and subtitle
|
||||
types. Special input URL types are available to read input from a vari‐
|
||||
ety of sources other than disk files. Depending on platform, a variety
|
||||
of different video and audio output methods are supported.
|
||||
mpv is a media player based on MPlayer and mplayer2. It supports a wide
|
||||
variety of video file formats, audio and video codecs, and subtitle
|
||||
types. Special input URL types are available to read input from a variety
|
||||
of sources other than disk files. Depending on platform, a variety
|
||||
of different video and audio output methods are supported.
|
||||
\end {quote}
|
||||
|
||||
Un avantage de Mpv sur ses camarades (Mplayer, Ffplay\dots) est évident
|
||||
@@ -244,9 +241,11 @@ de codecs, la foultitude de containers, et les nombreuses variantes de
|
||||
combinaisons codec/container rendent la compréhension de cet univers
|
||||
assez perturbante.
|
||||
|
||||
\subsection{rtmp} \index{rtmp}
|
||||
|
||||
\texttt{flvstreamer -r rtmp://lacantine.live-fstreams.cdn02.rambla.be:1935/live-lacantine/live-lacantine-2 | mplayer -}
|
||||
\index{rtmp}
|
||||
|
||||
\texttt{encodedv} - encode a series of images to a digital video stream
|
||||
\index{encodedv}
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -21,8 +21,12 @@ image.
|
||||
|
||||
\textsl{Video For Linux, second edition.}
|
||||
|
||||
%
|
||||
% PLEASE EXPLAIN !
|
||||
%
|
||||
|
||||
\begin{verbatim}
|
||||
tth@delirium:~/Essais/Fonderie$ v4l2-ctl --list-formats-ext
|
||||
tth@delirium:~$ v4l2-ctl --list-formats-ext
|
||||
ioctl: VIDIOC_ENUM_FMT
|
||||
Type: Video Capture
|
||||
|
||||
@@ -38,8 +42,81 @@ ioctl: VIDIOC_ENUM_FMT
|
||||
\end{verbatim}
|
||||
|
||||
Question : quelle méthode utiliser pour avoir la même chose avec
|
||||
des lignes de code écrites en C ? Il faut passer par une suite d'appels
|
||||
\texttt{ioctl}\index{ioctl}.
|
||||
des lignes de code écrites en C ?
|
||||
Il faut certainement passer par une suite d'appels
|
||||
\texttt{ioctl}\index{ioctl} après ouverture du device,
|
||||
mais la documentation est difficile à \textsl{greper}.
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
% nouveau : Tue Sep 3 11:14:13 UTC 2024
|
||||
|
||||
\section{libwebcam} \index{libwebcam}
|
||||
|
||||
\begin{quote}
|
||||
The Webcam Library libwebcam is designed to simplify
|
||||
the development of webcam applications, primarily on Linux but
|
||||
with an option to be ported to other platforms, in particular
|
||||
Solaris. It realizes part of what the unwritten Video4Linux user
|
||||
space library was always supposed to be: an easy to use library
|
||||
that shields its users from many of the difficulties and problems
|
||||
of using the V4L2 API directly.
|
||||
\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} même
|
||||
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}
|
||||
|
||||
%
|
||||
% trouvé dans pleroma
|
||||
%
|
||||
|
||||
Voilà (désolé dur de faire moins technique en 500 charactères):
|
||||
|
||||
\texttt{sudo modprobe v4l2loopback exclusive\_caps\=1 video\_nr\=7 %
|
||||
card\_label="WebcamVirtuelle"}
|
||||
|
||||
On créé un périphérique de caméra virtuelle sur /dev/video7
|
||||
|
||||
\texttt{ffmpeg -video\_size 352x288 -i /dev/video0 -i ./palette.png
|
||||
-lavfi fps=10,scale=w=128:h=112,paletteuse=dither=bayer,format=yuyv422
|
||||
-f v4l2 /dev/video7}
|
||||
|
||||
On fait une chaîne ffmpeg de la webcam réelle vers la virtuelle,
|
||||
en redimensionnant en 128x112 1/2
|
||||
|
||||
puis en appliquant un algorithme de dithering et une palette de
|
||||
couleurs (juste un PNG carré avec les différentes couleurs à utiliser
|
||||
pour le dithering, je peux le fournir si besoin).
|
||||
Enfin on force un format pour la webcam de destination et on sort
|
||||
sur son fichier (/dev/video7 comme défini tout à l'heure).
|
||||
|
||||
C'est pas propre (et il faudrait que je change d'algorithme pour le
|
||||
scaling parce qu'il y a un effet de flou désagréable), MAIS ça
|
||||
fonctionne et le rendu ressemble.
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
|
||||
@@ -47,18 +124,21 @@ des lignes de code écrites en C ? Il faut passer par une suite d'appels
|
||||
\index{vgrabbj}
|
||||
|
||||
|
||||
|
||||
D'après la manpage :
|
||||
« \textit{
|
||||
vgrabbj is a program that will grab images from any v4l-capable device
|
||||
« \textit{%
|
||||
vgrabbj is a program that will grab images from any v4l-capable device
|
||||
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
|
||||
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
|
||||
} »
|
||||
|
||||
Quelques options à connaitre : \texttt{-S} échange des
|
||||
deux composantes R et B; \texttt{-s <device>} affiche
|
||||
les capacités du périphérique v4l\index{v4l}.
|
||||
Quelques options à connaitre :
|
||||
\texttt{-S} échange des
|
||||
deux composantes R et B (parfois utile avec des caméras \textit{noname});
|
||||
\texttt{-s <device>} affiche
|
||||
les capacités du périphérique v4l\index{v4l} que l'on sélectionne
|
||||
avec \texttt{-d /dev/vidz0}.
|
||||
|
||||
Il y a plus de choses à dire, avec un exemple concret. XXX\index{XXX}
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
\section{Cheese}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
% ==============================================================
|
||||
\section{Apache, Nginx} \index{Apache} \index{nginx}
|
||||
|
||||
Apache (\textsl{A patchy server} et Nginx sont de grands classiques,
|
||||
Apache (\textsl{A patchy server}) et Nginx sont de grands classiques,
|
||||
voire même, dans le cas d'Apache, un grand ancien.
|
||||
|
||||
Que nous ne verrons pas pour le moment. Je vais plutôt me concentrer
|
||||
@@ -60,34 +60,21 @@ if you want):
|
||||
\begin{verbatim}
|
||||
tth@ramen:~/Houba/Fractales90$ apt show libmicrohttpd12
|
||||
Package: libmicrohttpd12
|
||||
Version: 0.9.72-2
|
||||
Priority: optional
|
||||
Section: libs
|
||||
Source: libmicrohttpd
|
||||
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
|
||||
Installed-Size: 211 kB
|
||||
Depends: libc6 (>= 2.17), libgnutls30 (>= 3.7.0)
|
||||
Homepage: https://www.gnu.org/software/libmicrohttpd/
|
||||
Tag: role::shared-lib
|
||||
Download-Size: 109 kB
|
||||
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
|
||||
Description: library embedding HTTP server functionality
|
||||
GNU libmicrohttpd is a small C library that is supposed to make it
|
||||
easy to run an HTTP server as part of another application.
|
||||
Key features that distinguish GNU Libmicrohttpd from other
|
||||
projects are:
|
||||
* C library: fast and small
|
||||
* API is simple, expressive and fully reentrant
|
||||
* Implementation is HTTP 1.1 compliant
|
||||
* HTTP server can listen on multiple ports
|
||||
* Four different threading models (select, poll, pthread, thread pool)
|
||||
* Support for IPv6
|
||||
* Support for SHOUTcast
|
||||
* Support for incremental processing of POST data (optional)
|
||||
* Support for basic and digest authentication (optional)
|
||||
* Support for SSL3 and TLS
|
||||
\end{verbatim}
|
||||
|
||||
\lstinputlisting[language=C]{code/inet/plopserver.c}
|
||||
|
||||
% ==============================================================
|
||||
|
||||
\section{Mais encore ?}
|
||||
|
||||
Il doit bien exister des modules Perl pour faire facilement
|
||||
un serveur web, non ?
|
||||
Même qu'on pourrait en écrire un rien qu'avec les sockets.
|
||||
|
||||
|
||||
% ==============================================================
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
10 CLEAR
|
||||
20 FOR I=1 TO 10
|
||||
20 FOR I=2 TO 5
|
||||
30 PRINT I, I*I
|
||||
40 NEXT I
|
||||
50 SYSTEM
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
open window 511,511
|
||||
for x=10 to 495 step 5:for y=10 to 495 step 5
|
||||
colour x/2,y/2,0
|
||||
fill rectangle x,y,x+5,y+5
|
||||
fill rectangle x+1,y+1,x+4,y+4
|
||||
next y:next x
|
||||
|
||||
1
code/C/.gitignore
vendored
1
code/C/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
fgets-simple
|
||||
demo-strtok
|
||||
packtest
|
||||
use_envp
|
||||
|
||||
@@ -2,7 +2,16 @@
|
||||
# exemples pour le chapitre sur le C
|
||||
# new Sat Feb 11 12:06:34 CET 2023
|
||||
|
||||
all: no-op slowprint fgets-simple packtest
|
||||
|
||||
all: no-op slowprint fgets-simple packtest use_envp
|
||||
|
||||
# simplified version of the canonical first C program
|
||||
hello: hello.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
# please show me the command line
|
||||
arguments: arguments.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
no-op: no-op.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
@@ -19,3 +28,8 @@ demo-strtok: demo-strtok.c Makefile
|
||||
# added Wed Mar 27 10:01:41 UTC 2024
|
||||
packtest: packtest.c
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
# added Thu Aug 8 13:44:58 UTC 2024
|
||||
use_envp: use_envp.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
|
||||
@@ -34,8 +34,7 @@ ts.tv_sec = sec;
|
||||
ts.tv_nsec = nano;
|
||||
while ( EOF != (c=getchar()) )
|
||||
{
|
||||
putchar(c);
|
||||
fflush(stdout);
|
||||
putchar(c), fflush(stdout);
|
||||
nanosleep(&ts, NULL);
|
||||
}
|
||||
|
||||
|
||||
16
code/C/use_envp.c
Normal file
16
code/C/use_envp.c
Normal file
@@ -0,0 +1,16 @@
|
||||
/* using envp for fun and profit */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
char *cptr;
|
||||
int idx = 0;
|
||||
cptr = envp[idx];
|
||||
while ( NULL != (cptr=envp[idx]) ) {
|
||||
fprintf(stderr, "envp[%d] %p --> %s\n",
|
||||
idx, cptr, cptr);
|
||||
idx++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -10,23 +10,9 @@ ex_curses: ex_curses.c Makefile
|
||||
thread-demo: thread-demo.c Makefile
|
||||
gcc -Wall -pthread $< -o $@
|
||||
|
||||
hello: hello.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
arguments: arguments.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
voirenv: voirenv.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
#------------- OSC -----------------------
|
||||
|
||||
osc: send-osc listen-osc
|
||||
|
||||
send-osc: send-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
listen-osc: listen-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
|
||||
#------------- IPC -----------------------
|
||||
|
||||
|
||||
9
code/OSC/Makefile
Normal file
9
code/OSC/Makefile
Normal file
@@ -0,0 +1,9 @@
|
||||
#------------- OSC -----------------------
|
||||
|
||||
osc: send-osc listen-osc
|
||||
|
||||
send-osc: send-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
|
||||
listen-osc: listen-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
0
code/OSC/README.md
Normal file
0
code/OSC/README.md
Normal file
48
code/OSC/listen-osc.c
Normal file
48
code/OSC/listen-osc.c
Normal file
@@ -0,0 +1,48 @@
|
||||
/* LISTEN OSC */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <lo/lo.h>
|
||||
#define LOCAL_PORT "9000"
|
||||
|
||||
/* ------------------------------------------------------- */
|
||||
void error(int num, const char *msg, const char *path)
|
||||
{
|
||||
fprintf(stderr, "liblo server error %d in path %s : %s\n",
|
||||
num, path, msg);
|
||||
exit(1);
|
||||
}
|
||||
/* ------------------------------------------------------- */
|
||||
int handler(const char *path, const char *types, lo_arg **argv,
|
||||
int argc, void *data, void *udata)
|
||||
{
|
||||
static int event_number = 1;
|
||||
|
||||
printf("------ event #%d :\n", event_number++);
|
||||
printf("\tpath '%s' types '%s' argc %d\n",
|
||||
path, types, argc);
|
||||
|
||||
printf("\tdata %p\n", data);
|
||||
// if (NULL!=data) printf("\t >%s<\n", data);
|
||||
printf("\tudata %p\n", udata);
|
||||
if (NULL!=udata) printf("\t\t>%s<\n", (char *)udata);
|
||||
return 0;
|
||||
}
|
||||
/* ------------------------------------------------------- */
|
||||
char signature[] = "Bourtoulots";
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
lo_server_thread st;
|
||||
int count = 0;
|
||||
|
||||
st = lo_server_thread_new(LOCAL_PORT, error);
|
||||
lo_server_thread_add_method(st, "/demo", "is", handler, signature);
|
||||
lo_server_thread_start(st);
|
||||
|
||||
for (;;) {
|
||||
fprintf(stderr, "%6d I'm alive\n", count++); sleep(10);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -11,8 +11,9 @@ int main(int argc, char *argv[])
|
||||
lo_address loana;
|
||||
int foo;
|
||||
|
||||
fprintf(stderr, "sending to %s:%s\n", REMOTE_HOST, REMOTE_PORT);
|
||||
loana = lo_address_new(REMOTE_HOST, REMOTE_PORT);
|
||||
foo = lo_send(loana, "/dev/kmem", "is", 61, "meg, efface !");
|
||||
fprintf(stderr, "foo %d\n", foo);
|
||||
foo = lo_send(loana, "/demo", "is", 61, "meg, efface !");
|
||||
fprintf(stderr, "got a %d return code ?\n", foo);
|
||||
return 0;
|
||||
}
|
||||
1
code/POV/.gitignore
vendored
Normal file
1
code/POV/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.png
|
||||
3
code/POV/Makefile
Normal file
3
code/POV/Makefile
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
hello.png: hello.pov Makefile
|
||||
povray -I$< -o$@ -W640 -H0 -Q0
|
||||
0
code/POV/README.md
Normal file
0
code/POV/README.md
Normal file
8
code/POV/hello.pov
Normal file
8
code/POV/hello.pov
Normal file
@@ -0,0 +1,8 @@
|
||||
/* HELLO.POV */
|
||||
#version 3.7;
|
||||
global_settings { assumed_gamma 1.0 }
|
||||
#include "colors.inc"
|
||||
|
||||
plane { y, 0 }
|
||||
sphere { <0, 0.50, 0>, 0.333 }
|
||||
light_source { <-210, 350, -530> color rgb <1, 1, 1>}
|
||||
3
code/Perl/README.md
Normal file
3
code/Perl/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Perl
|
||||
|
||||
The famous **Pathologic Eclectic Rubish Lister was here** !!!
|
||||
8
code/Perl/getip.pl
Executable file
8
code/Perl/getip.pl
Executable file
@@ -0,0 +1,8 @@
|
||||
#! /usr/bin/perl
|
||||
use strict;
|
||||
use LWP::UserAgent ();
|
||||
my $ua = LWP::UserAgent->new(agent => "curl");
|
||||
my $url = "https://ifconfig.io";
|
||||
my $req = HTTP::Request->new('GET' => $url);
|
||||
my $res = $ua->simple_request($req);
|
||||
print($res->content());
|
||||
10
code/Perl/listurls.pl
Executable file
10
code/Perl/listurls.pl
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/perl
|
||||
use strict;
|
||||
use LWP::Simple;
|
||||
use HTML::Parser;
|
||||
|
||||
my $page = get "https://tetalab.org";
|
||||
|
||||
my $parser = HTML::Parser->new;
|
||||
$parser->parse($page);
|
||||
|
||||
1
code/SDL2/.gitignore
vendored
Normal file
1
code/SDL2/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
strangebug
|
||||
4
code/SDL2/Makefile
Normal file
4
code/SDL2/Makefile
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
|
||||
strangebug: strangebug.c Makefile
|
||||
gcc -Wall $< -lSDL2 -o $@
|
||||
11
code/SDL2/README.md
Normal file
11
code/SDL2/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Simple DirectMedia Layer
|
||||
|
||||
|
||||
|
||||
The *[Simple DirectMedia Layer](https://libsdl.org/)
|
||||
is a cross-platform development library designed
|
||||
to provide low level access to audio, keyboard, mouse, joystick, and
|
||||
graphics hardware via OpenGL/Direct3D/Metal/Vulkan.*
|
||||
|
||||
Paf, premier essai, [premier souci](strangebug.md) **:)**
|
||||
|
||||
BIN
code/SDL2/picz/strangebug.png
Normal file
BIN
code/SDL2/picz/strangebug.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
47
code/SDL2/strangebug.c
Normal file
47
code/SDL2/strangebug.c
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Strange Bug ?
|
||||
*
|
||||
* gcc -Wall strangebug.c -lSDL2 -o strangebug
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
SDL_Window *win;
|
||||
SDL_Renderer *rend;
|
||||
int foo, idx, idy;
|
||||
|
||||
foo = SDL_CreateWindowAndRenderer(256, 256,
|
||||
SDL_WINDOW_SHOWN, &win, &rend);
|
||||
if (foo) {
|
||||
fprintf(stderr,
|
||||
"Err %d CreateWindowAndRenderer : %s",
|
||||
foo, SDL_GetError());
|
||||
exit(1);
|
||||
}
|
||||
SDL_SetRenderDrawColor(rend, 255, 0, 0, 0);
|
||||
SDL_RenderClear(rend);
|
||||
SDL_RenderPresent(rend);
|
||||
|
||||
for (idx=0; idx<256; idx++) {
|
||||
for (idy=0; idy<256; idy++) {
|
||||
SDL_SetRenderDrawColor(rend,
|
||||
127, idx, idy, 0);
|
||||
SDL_RenderDrawPoint(rend, idx, idy);
|
||||
}
|
||||
SDL_RenderPresent(rend);
|
||||
// SDL_Delay(50); /* Is the bug here ? */
|
||||
}
|
||||
SDL_RenderPresent(rend);
|
||||
sleep(30);
|
||||
|
||||
SDL_DestroyRenderer(rend);
|
||||
SDL_DestroyWindow(win);
|
||||
|
||||
return 0;
|
||||
}
|
||||
17
code/SDL2/strangebug.md
Normal file
17
code/SDL2/strangebug.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# `strangebug`, ou le bug étrange
|
||||
|
||||
Pour mes premiers pas dans la sdl, j'ai voulu faire un gradient de couleur
|
||||
dans une petite fenêtre, quelque chose de vraiment simple, me diriez-vous,
|
||||
mais qui cache une chose étrange...
|
||||
|
||||
La version que j'ai utilisée pour ça (et qui est <u>très</u> ancienne) est
|
||||
la 2.0.9 et j'ai beau me creuser la tête, je ne vois pas d'explication *:)*
|
||||
|
||||
Voici le [Code source](strangebug.c). Si vous décommentez la ligne
|
||||
marquée, seul une colonne sur deux est correctement tracée,
|
||||
comme le montre cette capture d'écran :
|
||||
|
||||

|
||||
|
||||
*Please explain that ...*
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1,15 +1,21 @@
|
||||
#!/usr/bin/awk -f
|
||||
|
||||
# create the sdl object: an union of sphere
|
||||
BEGIN {
|
||||
print "#declare Bubules = object"
|
||||
nbre = 0
|
||||
print "#declare Bubulles = object"
|
||||
print "{ \nunion { "
|
||||
}
|
||||
|
||||
# active portion of the code
|
||||
{
|
||||
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
||||
$1, $2, $3, $4 )
|
||||
nbre++
|
||||
}
|
||||
|
||||
# closing sdl structure
|
||||
END {
|
||||
|
||||
print " }\n}"
|
||||
printf "// %d bubulles\n", nbre
|
||||
}
|
||||
|
||||
0
code/bdd/README.md
Normal file
0
code/bdd/README.md
Normal file
20
code/bdd/mkgdbm.pl
Normal file
20
code/bdd/mkgdbm.pl
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
use strict;
|
||||
use GDBM_File;
|
||||
my $nomdb = "exemple.gdbm";
|
||||
my (%DB, @champs);
|
||||
my ($user, $gecos);
|
||||
open(SOURCE, "< /etc/passwd") or die "source $!";
|
||||
tie(%DB, "GDBM_File", $nomdb, GDBM_WRCREAT, 0666) or die "gdbm $!";
|
||||
|
||||
while (<SOURCE>) {
|
||||
@champs = split ":", $_;
|
||||
$user = $champs[0]."\0";
|
||||
$gecos = $champs[4]."\0";
|
||||
$DB{$user} = $gecos;
|
||||
}
|
||||
|
||||
untie %DB;
|
||||
close SOURCE;
|
||||
0;
|
||||
@@ -1,14 +1,10 @@
|
||||
/*
|
||||
*
|
||||
* spy_getenv.so: spy_getenv.c Makefile
|
||||
* gcc -Wall -shared -fPIC $< -ldl -o $@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define __USE_GNU
|
||||
#include <dlfcn.h>
|
||||
|
||||
@@ -18,15 +14,12 @@ char *getenv(char *envname)
|
||||
{
|
||||
static char *arrow = "--getenv--> ";
|
||||
static char *wtf = " --> (nil)";
|
||||
|
||||
char *content;
|
||||
original_getenv orig_getenv;
|
||||
|
||||
orig_getenv = (original_getenv)dlsym(RTLD_NEXT, "getenv");
|
||||
|
||||
write(STDERR_FILENO, arrow, strlen(arrow));
|
||||
write(STDERR_FILENO, envname, strlen(envname));
|
||||
|
||||
content = orig_getenv(envname);
|
||||
if (NULL != content) {
|
||||
write(STDERR_FILENO, "=", 1);
|
||||
@@ -35,9 +28,7 @@ if (NULL != content) {
|
||||
else {
|
||||
write(STDERR_FILENO, wtf, strlen(wtf));
|
||||
}
|
||||
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
|
||||
1
code/fortran/.gitignore
vendored
1
code/fortran/.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
|
||||
plplotting
|
||||
dessiner
|
||||
printty
|
||||
|
||||
*.png
|
||||
*.gif
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
|
||||
INCS = -I/usr/include/plplot -I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot
|
||||
|
||||
# sinple examples
|
||||
|
||||
printty: printty.f90 Makefile
|
||||
gfortran -g $< $(INCS) -o $@
|
||||
|
||||
|
||||
# more complex garbage
|
||||
|
||||
plplotting: plplotting.f90 Makefile
|
||||
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
||||
|
||||
@@ -11,4 +19,5 @@ dessiner: dessiner.f90 Makefile
|
||||
plot89a.gif: dessiner Makefile
|
||||
rm -f WS/A????.png
|
||||
./dessiner
|
||||
convert -delay 10 -colors 42 WS/A????.png $@
|
||||
convert -delay 10 -colors 42 WS/A????.png $@
|
||||
wc -c plot89a.gif
|
||||
|
||||
@@ -3,3 +3,8 @@
|
||||
Pour les explications, il faut aller lire le livre ou
|
||||
les codes source.
|
||||
|
||||
## Dessiner...
|
||||
|
||||
Je pense qe l'on devrait parler ici de plplot.
|
||||
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ program dessiner
|
||||
call plgver(version)
|
||||
write (*,'(" ",a,a)') 'plPlot version: ', trim(version)
|
||||
|
||||
call dessin_X11 (0.12, 1.51, 11)
|
||||
!! call dessin_dans_un_fichier ()
|
||||
!! call dessin_X11 (0.12, 1.51, 11)
|
||||
call dessin_dans_un_fichier ()
|
||||
|
||||
contains ! -----------------------------
|
||||
!------------------------------------------------------
|
||||
@@ -33,7 +33,7 @@ subroutine dessin_X11 (sha, shb, color)
|
||||
|
||||
call plsdev('xwin')
|
||||
call plinit ()
|
||||
call plenv (-2.5, 2.5, -2.5, 2.5, 1, 2)
|
||||
call plenv (-2.5, 2.5, -2.5, 2.5, 1, 1)
|
||||
|
||||
amp = 2.06
|
||||
do i = 1, lg
|
||||
@@ -52,47 +52,67 @@ subroutine dessin_X11 (sha, shb, color)
|
||||
|
||||
end subroutine
|
||||
!------------------------------------------------------
|
||||
!- _ __ ___ ___ ___
|
||||
!- __ _ (_) / _| ( _ ) / _ \ __ _ |__ \
|
||||
!- / _` | | | | |_ / _ \ | (_) | / _` | / /
|
||||
!- | (_| | | | | _| | (_) | \__, | | (_| | |_|
|
||||
!- \__, | |_| |_| \___/ /_/ \__,_| (_)
|
||||
!- _ __ ___ ___
|
||||
!- __ _ (_) / _| ( _ ) / _ \ __ _
|
||||
!- / _` | | | | |_ / _ \ | (_) | / _` |
|
||||
!- | (_| | | | | _| | (_) | \__, | | (_| |
|
||||
!- \__, | |_| |_| \___/ /_/ \__,_|
|
||||
!- |___/
|
||||
!-
|
||||
|
||||
subroutine dessin_dans_un_fichier ()
|
||||
|
||||
integer, parameter :: nbpts = 20
|
||||
real, parameter :: usz = 15.0 ! univers size
|
||||
integer, parameter :: nbpts = 179
|
||||
integer, parameter :: nbframes = 99
|
||||
real, parameter :: usz = 17.0 ! univers size
|
||||
|
||||
real :: xa(nbpts), ya(nbpts)
|
||||
real :: xb(nbpts), yb(nbpts)
|
||||
real :: x(nbpts), y(nbpts)
|
||||
|
||||
integer :: frame, i
|
||||
real :: coef
|
||||
|
||||
character(len=89) :: filename
|
||||
character(len=89) :: buffer
|
||||
character(len=3) :: str
|
||||
|
||||
print *, 'Dessin dans un fichier'
|
||||
|
||||
! build the startup conditions
|
||||
do i=1, nbpts
|
||||
x(i) = usz * (rand() - 0.5000)
|
||||
y(i) = usz * (rand() - 0.5000) * 0.50
|
||||
coef = real(i) * 0.051
|
||||
xa(i) = usz * 0.80 * sin(coef*2.0)
|
||||
ya(i) = usz * 0.70 * (-0.27 + cos(coef*3.0))
|
||||
xb(i) = usz * 0.11 * (rand() - 0.54)
|
||||
yb(i) = usz * 0.11 * (rand() - 0.97)
|
||||
enddo
|
||||
|
||||
do frame= 0, 119
|
||||
! iterate over frames.
|
||||
do frame= 0, nbframes
|
||||
coef = real(frame) / real(nbframes)
|
||||
coef = cos(coef*3.141592654)
|
||||
|
||||
write (filename, "(a, i4.4, a)") "WS/A", frame, ".png"
|
||||
print *, frame, ' => ', trim(filename)
|
||||
! print *, frame, "!", coef, ' => ', trim(filename)
|
||||
|
||||
call plsdev ('pngcairo')
|
||||
call plsfnam (trim(filename))
|
||||
call plinit ()
|
||||
call plenv (-10., 10., -10., 10., 0, 1)
|
||||
call plenv (-usz, usz, -usz, usz, 0, 1)
|
||||
call plcol0 (3)
|
||||
|
||||
! compute the real picture...
|
||||
do i=1, nbpts
|
||||
x(i) = x(i) + 1.2 * (rand() - 0.5000)
|
||||
y(i) = y(i) + 1.2 * (rand() - 0.5000)
|
||||
call plline (x, y)
|
||||
enddo
|
||||
write(buffer, "(i3.3)") frame
|
||||
str = trim(buffer)
|
||||
call plcol0 (15)
|
||||
call plstring (x, y, buffer)
|
||||
x(i) = xa(i)*coef - xb(i)*(1.0-coef)
|
||||
y(i) = ya(i)*coef - yb(i)*(1.0-coef)
|
||||
enddo
|
||||
|
||||
! ... and plot it *now*
|
||||
call plline (x, y)
|
||||
|
||||
call plcol0 (15) ! 15 is pure white
|
||||
call pllab("Apéro level", "Choupitude", "-- Philosophie de comptoir --")
|
||||
|
||||
call plend ()
|
||||
enddo
|
||||
|
||||
7
code/fortran/printty.f90
Normal file
7
code/fortran/printty.f90
Normal file
@@ -0,0 +1,7 @@
|
||||
! new: Sun Sep 15 05:04:37 UTC 2024
|
||||
program hello
|
||||
implicit none
|
||||
|
||||
print *, "This is the 'printty' program"
|
||||
|
||||
end
|
||||
0
code/inet/Makefile
Normal file
0
code/inet/Makefile
Normal file
5
code/inet/README.md
Normal file
5
code/inet/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Internet protocols
|
||||
|
||||
## Finger
|
||||
|
||||
Show us the [code](finger.md) !
|
||||
0
code/inet/finger-server.pl
Normal file
0
code/inet/finger-server.pl
Normal file
7
code/inet/finger.md
Normal file
7
code/inet/finger.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Finger
|
||||
|
||||
Sur le port 79/tcp.
|
||||
|
||||
[https://tools.ietf.org/html/rfc1288](https://tools.ietf.org/html/rfc1288)
|
||||
|
||||
[https://www.bortzmeyer.org/1288.html](https://www.bortzmeyer.org/1288.html)
|
||||
4
code/inet/plopserver.c
Normal file
4
code/inet/plopserver.c
Normal file
@@ -0,0 +1,4 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{ puts("plop"); return 0 }
|
||||
2
code/inet/plopserver.md
Normal file
2
code/inet/plopserver.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# Plop serveur
|
||||
|
||||
3
code/inet/qotd.sh
Normal file
3
code/inet/qotd.sh
Normal file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
/usr/games/fortune -a -n 500
|
||||
@@ -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;
|
||||
}
|
||||
2
code/roff/.gitignore
vendored
Normal file
2
code/roff/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*.text
|
||||
|
||||
6
code/roff/Makefile
Normal file
6
code/roff/Makefile
Normal file
@@ -0,0 +1,6 @@
|
||||
|
||||
# this is not a serious job !
|
||||
|
||||
premier.text: premier.roff Makefile
|
||||
nroff -Tutf8 < $< > $@
|
||||
|
||||
2
code/roff/README.md
Normal file
2
code/roff/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# La famille des roffs
|
||||
|
||||
10
code/roff/premier.roff
Normal file
10
code/roff/premier.roff
Normal file
@@ -0,0 +1,10 @@
|
||||
.ti 12
|
||||
hello world.
|
||||
.sp 1
|
||||
Ceci est le premier exemple avec nroff.
|
||||
.sp 2
|
||||
je vais essayer quelques variations de mise en page
|
||||
en jouant sur les diverses marges,
|
||||
puis explorer les "mises en avant"
|
||||
comme le gras, l'italique, le soulignement, toussa.
|
||||
Ensuite il me faudra solutionner le souci avec UTF8 :(
|
||||
@@ -1,3 +1,3 @@
|
||||
#!/bin/sh
|
||||
. ./fonctions.sh
|
||||
source ./fonctions.sh
|
||||
message "hello world"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
TITLE="Here Doc"
|
||||
TITLE="Here Doc ($$)"
|
||||
|
||||
gnuplot << __EOC__
|
||||
set term dumb
|
||||
set grid
|
||||
set title "$TITLE"
|
||||
plot [x=0:pi*2] sin(x)
|
||||
set term dumb size 72,24
|
||||
# set grid
|
||||
set title "$TITLE"
|
||||
plot [x=0:pi*3] [-1:1] 0.7*sin(x)
|
||||
__EOC__
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/awk -f
|
||||
|
||||
{ printf "%5d\t%s\n", NR, $0; }
|
||||
|
||||
@@ -24,11 +24,12 @@
|
||||
|
||||
\makeindex
|
||||
|
||||
\setlength \parindent {2em}
|
||||
\setlength \parskip {0.30em} % XXX
|
||||
\setlength \parindent {1.5em}
|
||||
\setlength \parskip {0.25em} % XXX
|
||||
|
||||
%------ reglages des 'listings'
|
||||
\lstset{frame=single} % dessin d'un cadre autour du listing
|
||||
\lstset{frame=leftline} % éventuel dessin d'un cadre autour du listing
|
||||
|
||||
\lstset{basicstyle=\ttfamily\small}
|
||||
\lstset{aboveskip=0.7em,belowskip=0.7em}
|
||||
|
||||
@@ -55,7 +56,7 @@ Mais elles sont en vrac, et surtout, elles sont reprises
|
||||
d'une très ancienne version (circa 2011) et donc,
|
||||
peut-être pas vraiment d'actualité.
|
||||
|
||||
\vspace{3em}
|
||||
\vspace{1em}
|
||||
|
||||
|
||||
Cependant, toute cette ouvrage est en cours de
|
||||
@@ -78,10 +79,23 @@ Et pour finir, il y a quelques ouvrages de référence.
|
||||
Citons, par exemple, le K\&R, ceux de Christophe Blaess,
|
||||
le Christian Pelissier, et bien d'autres.
|
||||
|
||||
\vspace{3em}
|
||||
En \textbf{mars 2024}, je déménage dans le Gers, au milieu
|
||||
de la campagne, et le travail sur cette ouvrage peut
|
||||
reprendre dans des conditions plus sereines.
|
||||
Je vais même tenter de faire avec seulement l'aide
|
||||
de mes souvenirs, de ma collection de livres
|
||||
(qui sera bientôt racontée page \pageref{chap:livres}),
|
||||
et des indispensables \textsl{manpages}.
|
||||
C'est rarement facile.
|
||||
Il faut parfois plonger dans les lignes de code\index{UTSL}.
|
||||
|
||||
Le code \LaTeX{} et les fichiers d'exemples sont disponibles
|
||||
en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
|
||||
\vspace{2em}
|
||||
|
||||
Le code \LaTeX{} de cet ouvrage
|
||||
et la plupart des fichiers d'exemples sont disponibles
|
||||
en ligne sur le site du Tetalab.
|
||||
\textsl{Your mileage may vary, film at 11\dots}
|
||||
|
||||
\texttt{https://git.tetalab.org/tTh/TetaTricks}
|
||||
|
||||
@@ -108,7 +122,7 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
\input{chap/modular}
|
||||
\input{chap/MIDI}
|
||||
\input{chap/OSC}
|
||||
|
||||
\input{chap/DMX512} % nouveau 2 juin 2024
|
||||
\input{chap/image}
|
||||
\input{chap/reseau}
|
||||
\input{chap/Perl}
|
||||
@@ -119,15 +133,16 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
|
||||
\input{chap/video}
|
||||
\input{chap/graphisme}
|
||||
% \input{chap/dessin} % nouveau 5 septembre 2024
|
||||
\input{chap/gnuplot}
|
||||
% \input{chap/print}
|
||||
\input{chap/print}
|
||||
\input{chap/webcam}
|
||||
% \input{chap/SCSI}
|
||||
\input{chap/X11}
|
||||
\input{chap/wayland} % nouveau septembre 2023
|
||||
% \input{chap/wayland} % nouveau septembre 2023
|
||||
\input{chap/Fortran}
|
||||
\input{chap/scripting}
|
||||
\input{chap/Arduino}
|
||||
% \input{chap/Arduino}
|
||||
\input{chap/Basic}
|
||||
\input{chap/R} % new octobre 2023
|
||||
% \input{chap/GMP}
|
||||
@@ -140,20 +155,20 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
% \input{chap/MINITEL}
|
||||
% \input{chap/Raspberry}
|
||||
% \input{chap/Fedora}
|
||||
% \input{chap/IPv6}
|
||||
\input{chap/IPv6}
|
||||
\input{chap/threads}
|
||||
\input{chap/IPC}
|
||||
\input{chap/dosbox}
|
||||
\input{chap/manpages}
|
||||
\input{chap/grub}
|
||||
% \input{chap/grub}
|
||||
\input{chap/photos}
|
||||
\input{chap/plugins}
|
||||
\input{chap/Bonjour}
|
||||
% \input{chap/Bonjour}
|
||||
\input{chap/ioctl}
|
||||
\input{chap/debug}
|
||||
% \input{chap/buzybox}
|
||||
\input{chap/gif89a}
|
||||
\input{chap/IRC}
|
||||
% \input{chap/IRC}
|
||||
% \input{chap/SCCS} % nouveau 18 mars 2021
|
||||
\input{chap/Usenet}
|
||||
\input{chap/DNS}
|
||||
@@ -161,15 +176,16 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
\input{chap/webserver}
|
||||
\input{chap/hardware}
|
||||
\input{chap/gadgets}
|
||||
\input{chap/sdr}
|
||||
% \input{chap/sdr}
|
||||
\input{chap/bdd} % nouveau 26 octobre 2022
|
||||
\input{chap/slang}
|
||||
% \input{chap/slang}
|
||||
\input{chap/curses}
|
||||
% \input{chap/openwrt}
|
||||
\input{chap/WiFi}
|
||||
% \input{chap/GIT}
|
||||
\input{chap/divers}
|
||||
% \input{chap/peer2peer}
|
||||
\input{chap/livres}
|
||||
|
||||
% ==============================================================
|
||||
|
||||
@@ -178,6 +194,8 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
||||
|
||||
\textbf{Non, la route est longue, mais la voie est libre.}
|
||||
|
||||
\vspace{4em}
|
||||
|
||||
Si vous êtes arrivés jusque ici, c'est que vous avez (peut-être ?)
|
||||
parcouru cet ouvrage, et constaté à quel point il est en friche.
|
||||
Beaucoup de chapitres sont vraiment incomplets, voire cruellement
|
||||
|
||||
Reference in New Issue
Block a user