Compare commits
83 Commits
c09df69af3
...
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 | ||
|
|
66bc3d19c4 | ||
|
|
0818f87582 | ||
|
|
c5b0e17bbb | ||
|
|
f53ee92b02 | ||
|
|
b1ebd390b4 | ||
|
|
70545d9355 | ||
|
|
ca1b226a13 | ||
|
|
6ad95e84ff |
@@ -4,4 +4,4 @@ Astuces diverses pour utiliser un ordinateur sous Linux...
|
|||||||
|
|
||||||
Un travail à l'évolution (trop) lente.
|
Un travail à l'évolution (trop) lente.
|
||||||
|
|
||||||
* http://la.buvette.org/devel/docs/tetatricks.pdf
|
`pdfbook2 tetatricks.pdf --paper=a4paper --short-edge --no-crop`
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
% https://www.theregister.com/2023/03/28/nostalgic_for_basic/
|
% https://www.theregister.com/2023/03/28/nostalgic_for_basic/
|
||||||
|
% https://retrofun.pl/2023/12/18/was-basic-that-horrible-or-better/
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
% \section{BASIC} \index{BASIC}
|
% \section{BASIC} \index{BASIC}
|
||||||
@@ -13,18 +14,20 @@
|
|||||||
C'est probablement un des premiers langages interactifs utilisable par le
|
C'est probablement un des premiers langages interactifs utilisable par le
|
||||||
peuple et les gens. Déja, à ce titre, dénonce que ce langage
|
peuple et les gens. Déja, à ce titre, dénonce que ce langage
|
||||||
demande un peu de curiosité, il a traversé soixante ans
|
demande un peu de curiosité, il a traversé soixante ans
|
||||||
d'informatique, et il existe enore.
|
d'informatique, et il existe encore.
|
||||||
Mais pour moi, le véritable intérèt
|
Mais pour moi, le véritable intérèt
|
||||||
est dans la multitude et la diversité des implémentations.
|
est dans la multitude et la diversité des implémentations.
|
||||||
Des minis catatoniques des années 60 aux micros-ordinateurs 8 bits,
|
Des minis catatoniques des années 60 aux micros-ordinateurs 8 bits,
|
||||||
des dizaines de versions souvent incompatibles ont vues le jour.
|
des dizaines de versions souvent incompatibles ont vues le jour.
|
||||||
Un nom ? « Locomotive », ça ira ?
|
Un nom pour citer un exemple ? « Locomotive », ça ira ?
|
||||||
|
|
||||||
Dans un premier temps, je vais les lister sommairement, et
|
Dans un premier temps, je vais les lister sommairement, et
|
||||||
ensuite j'aurais une idée sur lesquels seront les plus funs
|
ensuite j'aurais une idée sur lesquels seront les plus funs
|
||||||
à explorer.
|
à explorer, voire sauront trouver leur place dans un
|
||||||
|
environnement dédié à la techno-futilité, concept très
|
||||||
|
tendance dans certains milieux.
|
||||||
|
|
||||||
Dartmouth Time Sharing System
|
Pour en savoir plus : \textsc{Dartmouth Time Sharing System}
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
\section{Bywater} \index{bywater}
|
\section{Bywater} \index{bywater}
|
||||||
@@ -37,14 +40,14 @@ Full BASIC (X3.113-1987) in C.
|
|||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
Bywater BASIC Interpreter/Shell, version 2.10
|
Bywater BASIC Interpreter/Shell, version 2.10
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
Copyright (c) 1993, Ted A. Campbell
|
Copyright (c) 1993, Ted A. Campbell
|
||||||
for bwBASIC version 2.10, 11 October 1993
|
for bwBASIC version 2.10, 11 October 1993
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Le mode interactif me semble un peu rustre, mais utilisable à l'ancienne.
|
Le mode interactif me semble un peu rustre, mais utilisable à l'ancienne.
|
||||||
Les messages d'erreur sont du genre \textsc{bdos error on a}.
|
Les messages d'erreur sont du genre \textsc{bdos error on a, select}.
|
||||||
Je n'ai pas réussi à faire une sauvegarde du programme\footnote{J'ai
|
Je n'ai pas réussi à faire une sauvegarde du programme\footnote{J'ai
|
||||||
renoncé au bout de 30 secondes}, ce qui limite son \textsl{utilisability}.
|
renoncé au bout de 30 secondes}, ce qui limite son \textsl{utilisability}.
|
||||||
|
|
||||||
@@ -54,11 +57,35 @@ mais canonique~:
|
|||||||
|
|
||||||
\lstinputlisting{code/Basic/bywater-1.bas}
|
\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.
|
Première conclusion : affaire à suivre.
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
\section{Yabasic} \index{yabasic}
|
\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.
|
Première innovation, les numéros de ligne ne sont plus obligatoires.
|
||||||
|
|
||||||
\lstinputlisting{code/Basic/yabasic-1.bas}
|
\lstinputlisting{code/Basic/yabasic-1.bas}
|
||||||
@@ -81,8 +108,6 @@ http://www.sdlbasic.altervista.org/main/
|
|||||||
|
|
||||||
\index{BBC} \index{Acorn}
|
\index{BBC} \index{Acorn}
|
||||||
|
|
||||||
https://www.bbcbasic.co.uk/index.html
|
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
Brandy is an interpreter for BBC BASIC V, the dialect of BASIC that
|
Brandy is an interpreter for BBC BASIC V, the dialect of BASIC that
|
||||||
Acorn Computers supplied with their ranges of desktop computers that
|
Acorn Computers supplied with their ranges of desktop computers that
|
||||||
@@ -90,12 +115,12 @@ use the ARM processor such as the Archimedes and Risc PC, and is still
|
|||||||
in use on these and compatibles.
|
in use on these and compatibles.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
|
https://www.bbcbasic.co.uk/index.html
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
\section{FreeBASIC} \index{FreeBASIC}
|
\section{FreeBASIC} \index{FreeBASIC}
|
||||||
|
|
||||||
https://www.freebasic.net/
|
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
When used in its "QB" language mode, FreeBASIC provides a high level
|
When used in its "QB" language mode, FreeBASIC provides a high level
|
||||||
of support for programs written for QuickBASIC\index{QuickBASIC}.
|
of support for programs written for QuickBASIC\index{QuickBASIC}.
|
||||||
@@ -103,12 +128,12 @@ Many programs written for QuickBASIC will compile and run in this mode
|
|||||||
with no changes needed.
|
with no changes needed.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
|
https://www.freebasic.net/
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
\section{BASIC-256} \index{BASIC-256}
|
\section{BASIC-256} \index{BASIC-256}
|
||||||
|
|
||||||
https://basic256.org/
|
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
BASIC-256 is an easy to use version of BASIC designed to teach anybody
|
BASIC-256 is an easy to use version of BASIC designed to teach anybody
|
||||||
(especially middle and high-school students) the basics of computer
|
(especially middle and high-school students) the basics of computer
|
||||||
@@ -120,9 +145,16 @@ on screen in minutes, and a set of detailed, easy-to-follow tutorials
|
|||||||
that introduce programming concepts through fun exercises.
|
that introduce programming concepts through fun exercises.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
|
https://basic256.org/
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
|
\section{Benchmark}
|
||||||
|
|
||||||
|
Nous avons une liste de Basics, il faut maintenant les comparer.
|
||||||
|
Il y a le très classique (et très ancien) crible d'Eratostène, mais
|
||||||
|
nous pouvons trouver mieux en fouillant dans les archives.
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
\section{Et ailleurs ?}
|
\section{Et ailleurs ?}
|
||||||
@@ -131,5 +163,4 @@ L'interpréteur \texttt{Qbasic} de Microsoft fonctionne très bien
|
|||||||
dans Dosbox~: à lire en page \pageref{Qbasic}. Son prédécesseur,
|
dans Dosbox~: à lire en page \pageref{Qbasic}. Son prédécesseur,
|
||||||
\texttt{GWBASIC} marche très bien aussi.
|
\texttt{GWBASIC} marche très bien aussi.
|
||||||
|
|
||||||
% -------------------------------------------
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|||||||
161
chap/C.tex
161
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
|
dans la soute du système d'exploitation, et n'ont pas
|
||||||
d'importance pour le moment..
|
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.
|
Un fois passé l'entrée, nous sommes dans la partie active.
|
||||||
Nous appelons à ce moment une fonction de la bibliothèque
|
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~:
|
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}
|
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 à
|
Pour le traitement des options, il faut sauter à
|
||||||
la page \pageref{getopt}.
|
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}
|
\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é
|
Une fonction a un unique point d'entrée\footnote{Qui a déja joué
|
||||||
avec le ENTRY du Fortran ?}, avec une éventuelle liste
|
avec le ENTRY du Fortran ?}, avec une éventuelle liste
|
||||||
de paramètres,
|
de paramètres,
|
||||||
et une tout aussi éventuelel unique valeur de retour.
|
et une tout aussi éventuelle unique valeur de retour.
|
||||||
|
|
||||||
XXX\index{XXX}
|
XXX\index{XXX}
|
||||||
|
|
||||||
@@ -114,8 +122,11 @@ XXX\index{XXX}
|
|||||||
|
|
||||||
Il est évident qu'un logiciel qui n'a aucun moyen de communiquer
|
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.
|
avec le monde extérieur a bien moins d'utilité qu'un bon ed.
|
||||||
Dans le schéma «~classique~», ces échanges ont lieu par
|
Dans le schéma «~classique~» d'une utilisation interactive,
|
||||||
le truchement d'un terminal.
|
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}
|
\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 ?
|
À ne plus savoir où peut être la tête de lecture ?
|
||||||
Alors les subtilités de \texttt{scanf} vont vous plaire.
|
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...}
|
\textit{To be continued...}
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% ---------------------------------------------------------
|
||||||
@@ -311,7 +371,7 @@ int fprintf(FILE *stream, const char *format, ...);
|
|||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
\section{Un filtre Unix}\label{filtre-unix}
|
\section{Quelques filtres Unix}\label{filtre-unix}
|
||||||
|
|
||||||
Ce qu'on appelle un "filtre" est un logiciel destiné à transformer
|
Ce qu'on appelle un "filtre" est un logiciel destiné à transformer
|
||||||
les données qui le traversent. Pour bien comprendre, le mieux,
|
les données qui le traversent. Pour bien comprendre, le mieux,
|
||||||
@@ -336,14 +396,21 @@ $
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Vous voulez un autre exemple ? En voici un, parfois utile pour des
|
Vous voulez un autre exemple ? En voici un, parfois utile pour des
|
||||||
simulations de terminal de \textsl{h4ck3rZ}\footnote{texte vert ou
|
simulations de terminal de \textsl{tipiak}\footnote{Le texte vert ou
|
||||||
orange sur fond noir de rigueur.} sur une ligne en boucle de
|
orange sur fond noir est de rigueur.} sur une ligne en boucle de
|
||||||
courant à 300 Bauds, le tout pour un film que l'on souhaite classable
|
courant à 300 Bauds, le tout pour un film que l'on souhaite classable
|
||||||
en série Z.
|
en série Z.
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/C/slowprint.c}
|
\lstinputlisting[language=c]{code/C/slowprint.c}
|
||||||
|
% \vspace{2em}
|
||||||
|
|
||||||
|
Vous prendrez bien soin de contempler le traitement d'un éventuel
|
||||||
|
paramètre passé par la ligne de commande,
|
||||||
|
et surtout le calcul alambiqué\footnote{On doit quand même
|
||||||
|
pouvoir faire plus clair\dots}
|
||||||
|
pour convertir une vitesse en Bauds à un délay acceptable
|
||||||
|
par \texttt{nanosleep(2)}.
|
||||||
|
|
||||||
\vspace{2em}
|
|
||||||
Pour une explication plus détaillée sur les mécanismes
|
Pour une explication plus détaillée sur les mécanismes
|
||||||
utilisés et les usages possibles d'un tel filtre,
|
utilisés et les usages possibles d'un tel filtre,
|
||||||
il faut voir le concept de pipeline du shell en
|
il faut voir le concept de pipeline du shell en
|
||||||
@@ -355,12 +422,14 @@ page \pageref{pipeline}.
|
|||||||
|
|
||||||
\textbf{Ah, enfin, on a failli attendre !}
|
\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.
|
le pointeur qui fait à la fois la force et la faiblesse du C.
|
||||||
Pour faire simple, un pointeur est une variable qui contient
|
Pour faire simple, un pointeur est une variable qui contient
|
||||||
l'adresse dans la mémoire d'une autre variable.
|
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.
|
de l'objet pointé, et peut donc « parcourir » un tableau de ces objets.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@@ -370,14 +439,31 @@ ptr = tableau; // *ptr désigne tableau[0];
|
|||||||
ptr++; // *ptr désigne tableau[1];
|
ptr++; // *ptr désigne tableau[1];
|
||||||
\end{verbatim}
|
\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/
|
% 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}
|
\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},
|
Nous avons déja abordé de loin la directive \texttt{\#include},
|
||||||
qui fait partie du préprocesseur, comme toutes les lignes
|
qui fait partie du préprocesseur, comme toutes les lignes
|
||||||
de code commençant par le caractère \textbf{\#}.
|
de code commençant par le caractère \textbf{\#}.
|
||||||
@@ -404,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
|
affichera une maxime dont la véracité demande à être vérifiée
|
||||||
par l'expérimentation. Mais ça n'est pas fini.
|
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
|
de la compilation conditinnelle, et ça, c'est cool parce que
|
||||||
ça ouvre la porte à plein de choses.
|
ça ouvre la porte à plein de choses.
|
||||||
Par exemple, l'instrumentation du code afin de faciliter
|
Par exemple, l'instrumentation du code afin de faciliter
|
||||||
@@ -543,7 +632,7 @@ et un exemple simple d'utilisation.
|
|||||||
\section{Analyser une ligne de texte} \index{parser}
|
\section{Analyser une ligne de texte} \index{parser}
|
||||||
|
|
||||||
Nous désirons implémenter une interface en ligne de commande
|
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
|
assez semblables. On peut aussi voir ça comme la création
|
||||||
d'un \textsl{domain specific language} (aka DSL\index{DSL}).
|
d'un \textsl{domain specific language} (aka DSL\index{DSL}).
|
||||||
|
|
||||||
@@ -684,6 +773,47 @@ types of devices.
|
|||||||
% XXX EXEMPLE TROP MINIMALISTE !!!
|
% XXX EXEMPLE TROP MINIMALISTE !!!
|
||||||
%
|
%
|
||||||
|
|
||||||
|
% =========================================================
|
||||||
|
%
|
||||||
|
% Message-ID: <ur80s3$677$1@dont-email.me>
|
||||||
|
%
|
||||||
|
\section{Advanced}
|
||||||
|
|
||||||
|
Direct from Usenet (\texttt{comp.lang.c}):
|
||||||
|
\textsl{I did an experiment where is possible to create "sets" of warnings.}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
#define SAFE_REGION \
|
||||||
|
_Pragma("GCC diagnostic push") \
|
||||||
|
_Pragma("GCC diagnostic error \"-Wenum-compare\"")\
|
||||||
|
_Pragma("GCC diagnostic error \"-Wparentheses\"")\
|
||||||
|
_Pragma("GCC diagnostic error \"-Wuninitialized\"")
|
||||||
|
#define RESTORE \
|
||||||
|
_Pragma("GCC diagnostic pop")
|
||||||
|
enum E1 { A };
|
||||||
|
enum E2 { B };
|
||||||
|
SAFE_REGION
|
||||||
|
int main() {
|
||||||
|
int a, b;
|
||||||
|
if (a = b){}
|
||||||
|
if (A == B){}
|
||||||
|
}
|
||||||
|
RESTORE
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
J'avoue avoir mis un certain temps à capter. Je vais attendre
|
||||||
|
le \textsl{follow-up} de Bart pour avoir confirmation.
|
||||||
|
\end{quote}
|
||||||
|
% =========================================================
|
||||||
|
|
||||||
|
\section{La suite?}
|
||||||
|
|
||||||
|
% Message-ID: <657f1dd4$0$10079$426a74cc@news.free.fr>
|
||||||
|
% NNTP-Posting-Date: 17 Dec 2023 17:12:04 CET
|
||||||
|
|
||||||
|
Étudier les différents modêles de mémoire partagée.
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
\section{Ailleurs dans cet ouvrage}
|
\section{Ailleurs dans cet ouvrage}
|
||||||
@@ -693,7 +823,8 @@ divers comme Open Sound Control (page \pageref{chap:OSC}) ou
|
|||||||
libsndfile (page \pageref{chap:son}).
|
libsndfile (page \pageref{chap:son}).
|
||||||
Et pour les gens du système~:
|
Et pour les gens du système~:
|
||||||
l'utilisation des signaux (page \pageref{get-signal}),
|
l'utilisation des signaux (page \pageref{get-signal}),
|
||||||
le chargement dynamique d'un \textsl{plug-in} (page \pageref{ex_dlopen}).
|
le chargement dynamique d'un \textsl{plug-in} (page \pageref{ex_dlopen}),
|
||||||
|
les \texttt{ioctl}, \dots
|
||||||
|
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|||||||
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,
|
maintenance du fichier \texttt{/etc/hosts} qu'il fallait,
|
||||||
à la vieille époque, télécharger toutes les nuits\dots
|
à 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}
|
\section{Outils de base}
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ pixel%r = 0x55
|
|||||||
|
|
||||||
Nous verrons plus loin l'importance de cette notion.
|
Nous verrons plus loin l'importance de cette notion.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% ========================================
|
||||||
|
|
||||||
\section{Fichiers}
|
\section{Fichiers}
|
||||||
|
|
||||||
@@ -157,18 +157,81 @@ Il semble qu'il y ait deux concepts orthogonaux :
|
|||||||
|
|
||||||
\textit{Open, Read, Write, Inquire, toussa\dots}
|
\textit{Open, Read, Write, Inquire, toussa\dots}
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Ouvrir un fichier}
|
||||||
|
|
||||||
|
C'est la première étape : attacher un fichier à un numéro d'unité.
|
||||||
|
Il y a une foultitude d'options, nous allons commencer par les
|
||||||
|
plus courantes.
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
\subsection{Sequentiel texte}
|
\subsection{Sequentiel texte}
|
||||||
|
|
||||||
XXX\index{XXX}
|
XXX\index{XXX}
|
||||||
|
|
||||||
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
|
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
|
||||||
comme quand on déroule une bande 6250bpi.
|
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{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.
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
|
||||||
\subsection{Indexé} \index{index}
|
\subsection{Indexé} \index{index}
|
||||||
|
|
||||||
XXX\index{XXX}
|
XXX\index{XXX}
|
||||||
|
|
||||||
C'est pas pareil.
|
C'est pas pareil : d'abord les enregistrements sont tous de la même
|
||||||
|
taille. Ensuite, on y accède par son rang, son numéro d'ordre dans le
|
||||||
|
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}
|
||||||
|
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@@ -198,7 +261,7 @@ end module
|
|||||||
|
|
||||||
Rien de bien compliqué~:
|
Rien de bien compliqué~:
|
||||||
Un module peut être vu comme une boite qui contient (\texttt{contains})
|
Un module peut être vu comme une boite qui contient (\texttt{contains})
|
||||||
des procédures (\texttt{function} ou \texttt{subroutine},
|
des procédures (\texttt{function} ou \texttt{subroutine}),
|
||||||
et qui sera utilisé avec ce genre de petit programme~:
|
et qui sera utilisé avec ce genre de petit programme~:
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
@@ -210,9 +273,17 @@ program t
|
|||||||
end program
|
end program
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
La première ligne, \texttt{use dummy}, permet d'accéder aux fonctions disponibles
|
||||||
|
dans le module dummy.
|
||||||
|
Elle doit être suivie d'un \texttt{implicit none}, pour une raison à éclaircir.
|
||||||
|
Et ensuite nous pouvons appeler notre procédure.
|
||||||
|
|
||||||
|
Mais les modules permettent de faire bien d'autre choses.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
\section{Random et Aléa}
|
\section{Random et Aléa}
|
||||||
|
|
||||||
|
Tentative de sranding faite à la rache.
|
||||||
La dernière ligne va vous étonner.
|
La dernière ligne va vous étonner.
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
@@ -228,15 +299,22 @@ La dernière ligne va vous étonner.
|
|||||||
dummy = rand()
|
dummy = rand()
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Mais il y a d'autres manières plus rigoureuses d'utiliser les nombres
|
||||||
|
pseudo-aléàtoires avec le fortan moderne.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
% new Thu 24 Nov 2022 02:27:05 AM CET
|
% new Thu 24 Nov 2022 02:27:05 AM CET
|
||||||
|
|
||||||
\section{Options de gfortran} \index{gfortran}
|
\section{Options de gfortran} \index{gfortran}
|
||||||
|
|
||||||
Comme d'habitude avec gcc\footnote{The Gnu Compiler Collection}, les
|
Comme d'habitude avec gcc\footnote{Giant Complicated Compilords}, les
|
||||||
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
|
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
|
||||||
mais ce ne sont probablement pas les seules.
|
mais ce ne sont probablement pas les seules.
|
||||||
|
|
||||||
|
Pour commencer, la plus obligatoire de toutes ces options est sans contexte
|
||||||
|
le protecteur de base \texttt{-Wall} qui vous protégera de nombreux
|
||||||
|
maléfices.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
\section{Images}
|
\section{Images}
|
||||||
@@ -321,7 +399,7 @@ immédiatement garnir de données pertinentes~:
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Une fois en possession de ces données conceptuelles, que l'on peut
|
Une fois en possession de ces données conceptuelles, que l'on peut
|
||||||
aisément voire comme un cheminement, nous allons demander
|
aisément voir comme un cheminement, nous allons demander
|
||||||
au crayon de se promener sur notre feuille virtuelle en suivant
|
au crayon de se promener sur notre feuille virtuelle en suivant
|
||||||
ce chemin, et enfin de s'arreter de dessiner~:
|
ce chemin, et enfin de s'arreter de dessiner~:
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ Vous voilà prévenus, la suite bientôt\dots
|
|||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
|
\section{Les sockets Unix} \index{socket}
|
||||||
|
|
||||||
|
Les sockets de la famille AF\_UNIX sont utilisés pour
|
||||||
|
les communications locales entre applications sur une même machine.
|
||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
|
|||||||
91
chap/OSC.tex
91
chap/OSC.tex
@@ -1,7 +1,15 @@
|
|||||||
\chapter{Open Sound Control}
|
\chapter{Open Sound Control}
|
||||||
\index{OSC} \label{chap:OSC}
|
\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,
|
\textsl{OSC est un format de transmission de données entre ordinateurs,
|
||||||
synthétiseurs, robots ou tout autre matériel ou logiciel compatible,
|
synthétiseurs, robots ou tout autre matériel ou logiciel compatible,
|
||||||
conçu pour le contrôle en temps réel.
|
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
|
améliorations en termes de rapidité et de flexibilité par rapport
|
||||||
à l'ancienne norme MIDI\index{MIDI}\dots}
|
à l'ancienne norme MIDI\index{MIDI}\dots}
|
||||||
|
|
||||||
|
|
||||||
|
% ================================================================
|
||||||
|
\section{Programmation}
|
||||||
|
|
||||||
Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
|
Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
|
||||||
qui reste simple
|
qui reste simple à utiliser
|
||||||
à utiliser tout en permettant de descendre à un bas niveau.
|
tout en permettant de descendre à un bas niveau.
|
||||||
Cette bibliothèque est livrée avec deux outils que nous
|
Elle fonctionne sur un modèle asynchrone
|
||||||
allons voir maintenant.
|
(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 :}
|
\textbf{Envoyer :}
|
||||||
|
|
||||||
Pour envoyer, il faut bien définir une destination. Une fois
|
Pour envoyer des données, il faut bien définir une destination. Une fois
|
||||||
de plus, le couple IP adresse/port est utilisé. Ce sont les
|
de plus, le triplet IP adresse/port/chemin est utilisé.
|
||||||
deux premiers paramètres.
|
Ce sont les trois premiers paramètres de la commande~:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@debian:~$ oscsend localhost 1664 /tmp/kmem is 61 'meg, efface !'
|
tth@debian:~$ oscsend localhost 1664 /tmp/kmem 'is' 61 'meg, efface !'
|
||||||
tth@debian:~$
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
La chaine \texttt{is} que vous voyez dans la ligne de commande
|
La chaine \texttt{is} que vous voyez dans la ligne de commande
|
||||||
décrit le type des paramètres qui suivent~:
|
décrit le type des paramètres qui suivent~:
|
||||||
\texttt{i} est pour un integer et \texttt{s} pour une
|
\texttt{i} est pour un integer et \texttt{s} pour une
|
||||||
chaine (notez les simples quotes pour passer les caractères
|
chaine de caractères
|
||||||
speciaux du shell).
|
(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}
|
\begin{verbatim}
|
||||||
tth@debian:~$ oscdump 1664
|
tth@debian:~$ oscdump 1664
|
||||||
/tmp/kmem is 61 "meg, efface !"
|
/tmp/kmem is 61 "meg, efface !"
|
||||||
^C
|
^C
|
||||||
tth@debian:~$
|
|
||||||
\end{verbatim}
|
\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}
|
\section{Exemple de code}
|
||||||
@@ -58,19 +98,26 @@ utilise un thread d'écoute qui appelle des
|
|||||||
\textsl{callbacks} préalablement "accrochés",
|
\textsl{callbacks} préalablement "accrochés",
|
||||||
\textsl{hooked} en vrai langue.
|
\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.
|
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
|
J'avoue ne pas encore savoir ce que veut bien dire la
|
||||||
valeur de retour.
|
valeur de retour.
|
||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
|
\section{La trame OSC} \label{trameosc}
|
||||||
|
|
||||||
|
\textsf{Après tout, ce ne sont que quelques octets.}
|
||||||
|
|
||||||
|
% ================================================================
|
||||||
|
|
||||||
|
|
||||||
\section{En Perl} \index{Perl}
|
\section{En Perl} \index{Perl}
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@@ -86,9 +133,9 @@ $client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
|
|||||||
% ================================================================
|
% ================================================================
|
||||||
% nouveau: Sat Jul 15 07:14:10 UTC 2023
|
% 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
|
Beaucoup d'autres logiciels peuvent être controlés par OSC, ou
|
||||||
générer des trames OSC : on peut citer
|
générer des trames OSC : on peut citer
|
||||||
Processing\index{Processing},
|
Processing\index{processing},
|
||||||
Chuck\index{Chuck} (page \pageref{chuck-osc}),
|
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
|
\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
|
données textuelles et contient d'énormes facilités d'utilisation
|
||||||
des expressions régulières.
|
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
|
incontesté du Web\index{web} interactif, de par son intégration
|
||||||
dans le serveur Apache\index{Apache},
|
dans le serveur Apache\index{Apache}
|
||||||
et de modules d'écriture de clients http\index{http}.
|
(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,
|
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.
|
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
|
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
|
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 ?}
|
\section {Et en vrai ?}
|
||||||
|
|
||||||
|
Quels logiciels sont écrits en Perl ?
|
||||||
|
|
||||||
\texttt{exiftool - Read and write meta information in files} \index{exiftool}
|
\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.
|
certains même font de choses très avancées.
|
||||||
Et beaucoup de ces gens essayent de me convaincre que c'est
|
Et beaucoup de ces gens essayent de me convaincre que c'est
|
||||||
un langage vraiment trop bien, trop moderne, trop dans la
|
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
|
Quelques uns d'entre eux vont même jusqu'à me parler d'un
|
||||||
certain \textbf{canard} qui faciliterait bien la vie
|
certain \textbf{canard} qui faciliterait bien la vie
|
||||||
des preogrammeurs.
|
des preogrammeurs.
|
||||||
|
|
||||||
Je ne suis pas convaincu.
|
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...}
|
\section{Mais quand même...}
|
||||||
@@ -28,3 +34,19 @@ Je ne suis pas convaincu.
|
|||||||
\end{figure}
|
\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
|
Je n'ai certainement pas la prétention de vous enseigner
|
||||||
les arcanes du \textsl{R project},
|
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,
|
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.
|
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.
|
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
|
On peut définir des variables, leur donner une valeur et faire des calculs
|
||||||
avec ces variables,
|
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}
|
\begin{verbatim}
|
||||||
> a <- 22
|
> a <- 22
|
||||||
> b <- 7
|
> b <- 7
|
||||||
> a ; b
|
> a ; b
|
||||||
[1] 22
|
[1] 22
|
||||||
[1] 7
|
[1] 7
|
||||||
> a / b
|
> a / b
|
||||||
[1] 3.142857
|
[1] 3.142857
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Les choses semblent simples, nous avons approximé $\pi$.
|
Les choses semblent simples, nous avons approximé $\pi$.
|
||||||
@@ -96,7 +97,7 @@ La magie du shebang\index{shebang}
|
|||||||
Nous disposons d'un fichier SSV
|
Nous disposons d'un fichier SSV
|
||||||
(Space Separated Values)\footnote{C'est nouveau, ça vient de sortir.}
|
(Space Separated Values)\footnote{C'est nouveau, ça vient de sortir.}
|
||||||
provenant d'un système optico-numérique bi-dimensionnel multi-planaire
|
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
|
Et nous voulons en tirer quelques chiffres et graphiques bien
|
||||||
clinquants,
|
clinquants,
|
||||||
par exemple les éventuels rapports entre le rouge et le bleu.
|
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)
|
hist(datas\$V3, breaks=50)
|
||||||
|
|
||||||
|
|
||||||
% ======================================================================
|
% ======================================================================
|
||||||
|
|
||||||
\section{Interface avec l'OS}
|
\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
|
Cisco sauvage de la salle d'AG, hein, mais ça ne sera
|
||||||
pas le même nameserver.} peut facilement
|
pas le même nameserver.} peut facilement
|
||||||
faire translateur d'adresse pour un réseau branché sur
|
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
|
incantations magiques
|
||||||
(qui sont ici très linuxisantes) :
|
(qui sont ici très linuxisantes) :
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ modprobe iptable_nat
|
|||||||
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
|
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
|
||||||
\end{verbatim}
|
\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 :
|
il faut incanter ce genre de trucs :
|
||||||
|
|
||||||
\begin{verbatim}
|
\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/
|
% https://jichu4n.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i/
|
||||||
%
|
%
|
||||||
|
|
||||||
|
Twm, Fvwm, Mwm... nous avons le choix.
|
||||||
|
|
||||||
%-------------------------------------------------------------------
|
%-------------------------------------------------------------------
|
||||||
|
|
||||||
\section{XCB}\index{XCB}
|
\section{XCB}\index{XCB}
|
||||||
|
|||||||
48
chap/bdd.tex
48
chap/bdd.tex
@@ -7,17 +7,22 @@
|
|||||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
\section{sqlite} \index{sqlite}
|
\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}
|
\subsection{CLI} \index{cli}
|
||||||
|
|
||||||
Commandes internes:
|
Commandes internes (\textsl{meta-commands})~:
|
||||||
|
|
||||||
|
Utilisez \textbf{.help} en premier secours !
|
||||||
|
|
||||||
% ----------------------------------------------------------------
|
% ----------------------------------------------------------------
|
||||||
\subsection{Libreoffice} \index{Libreoffice}
|
\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
|
de données. Chacune de ces clefs doit être unique, et doit être
|
||||||
liée avec une seule valeur\footnote{Peut-on alors parler
|
liée avec une seule valeur\footnote{Peut-on alors parler
|
||||||
de bijection relationnelle ?}.
|
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}
|
\subsection{Exemple en Perl} \index{Perl}
|
||||||
|
|
||||||
\begin{verbatim}
|
Nous allons extraire une donnée du fichier \texttt{/etc/passwd}
|
||||||
#!/usr/bin/perl -w
|
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;
|
\lstinputlisting[language=perl]{code/bdd/mkgdbm.pl}
|
||||||
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}
|
|
||||||
|
|
||||||
Vous remarquerez que pour cet exemple, nous avons clef et valeur qui
|
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
|
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
|
par un hypothétique\footnote{Oui, je vais l'écrire bientôt.} programme
|
||||||
en C, le programme Perl rajoute un \texttt{'\textbackslash0'}
|
en C, le programme Perl rajoute un \texttt{'\textbackslash0'}
|
||||||
(fin de chaine) aux deux champs concernés.
|
(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}
|
\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 ».
|
Vous allez bien dire : « Encore un truc de vieux\dots ».
|
||||||
Oui, peut-être, mais il y a quand même pas mal d'usages
|
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.
|
en explorer quelques uns.
|
||||||
|
|
||||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
@@ -12,14 +14,43 @@ en explorer quelques uns.
|
|||||||
|
|
||||||
\section{CD Audio}
|
\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}
|
\subsection {Riping}
|
||||||
|
\index{abcde} \index{cdparanoia}
|
||||||
|
|
||||||
Le \textsl{ripage} est l'action d'extraire les pistes d'un
|
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
|
Un des outils utilisés est \texttt{cdparanoia}. Les nombreuses
|
||||||
options décrites dans la manpage montrent à quel point ce logiciel
|
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{||}
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ de la taille de l'écran physique) connus sous les noms de
|
|||||||
Le premier est celui que voit l'application, et qu'il peut manipuler
|
Le premier est celui que voit l'application, et qu'il peut manipuler
|
||||||
avec les fonctions (genre \texttt{mvaddstr})
|
avec les fonctions (genre \texttt{mvaddstr})
|
||||||
que nous verrons très bientôt.
|
que nous verrons très bientôt.
|
||||||
Et le second est l'image que se fait la mécanique de l'écran
|
Et le second est l'image interne que se fait la mécanique de l'écran
|
||||||
physique, donc ce que voit le yuser.
|
physique, donc ce que voit le yuser.
|
||||||
|
|
||||||
|
|
||||||
@@ -87,6 +87,8 @@ ce que ça donne.
|
|||||||
|
|
||||||
\section{Bell and whistles}
|
\section{Bell and whistles}
|
||||||
|
|
||||||
|
\subsection{Attributs}
|
||||||
|
|
||||||
Voici comment centrer sur la ligne du haut
|
Voici comment centrer sur la ligne du haut
|
||||||
un texte écrit en \textbf{gras} grace à l'attribut
|
un texte écrit en \textbf{gras} grace à l'attribut
|
||||||
\texttt{A\_BOLD} :
|
\texttt{A\_BOLD} :
|
||||||
@@ -114,18 +116,29 @@ de fonctions spécialisées dans le traitement des attributs.
|
|||||||
|
|
||||||
\section{Astuces}
|
\section{Astuces}
|
||||||
|
|
||||||
|
\subsection{kbhit} \index{kbhit} \label{kbhit}
|
||||||
|
|
||||||
Dans une boucle interactive, on va utiliser \texttt{getch()}, qui va
|
Dans une boucle interactive, on va utiliser \texttt{getch()}, qui va
|
||||||
bloquer tant qu'on n'a pas tapé sur une touche. Mais que faire si
|
bloquer tant qu'on n'a pas tapé sur une touche. Mais que faire si
|
||||||
on veut utiliser, en plus du clavier, un autre périphérique de
|
on veut utiliser, en plus du clavier, un autre périphérique de
|
||||||
saisie, genre un Joystick\index{joystick} ?
|
saisie (genre un Joystick\index{joystick}) sans rester en attente ?
|
||||||
|
|
||||||
Bien entendu, on peut utiliser \texttt{select(2)}, mais cela nécessite
|
Bien entendu, on peut utiliser \texttt{select(2)}, mais cela nécessite
|
||||||
de connaitre le \textit{file descriptor} auquel est attaché le clavier.
|
de connaitre le \textit{file descriptor} auquel est attaché le clavier.
|
||||||
Dans le contexte classique, on peut assumer que ce sera le \texttt{fd}
|
Dans le contexte classique, on peut assumer que ce sera le \texttt{fd}
|
||||||
associé à \textit{stdin}, mais il est imprudent de compter là-dessus.
|
associé à \textit{stdin}, mais il est imprudent de compter là-dessus.
|
||||||
|
|
||||||
---> voir \texttt{newterm(3)}
|
Sauf que, Unix, c'est bien foutu ---> voir \texttt{fileno(3)}
|
||||||
|
|
||||||
|
% =========================================================
|
||||||
|
|
||||||
|
\section{Et pour continuer ?}
|
||||||
|
|
||||||
|
Il existe des bibliothèques pour faire des interfaces
|
||||||
|
\textsl{wimp}\footnote{Window, Icon, Mouse, Pulldown}
|
||||||
|
assez avancées.
|
||||||
|
|
||||||
|
% =========================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ Comme vous le savez tous, un appel système
|
|||||||
est \textbf{le} moyen de communication qu'utilise un process
|
est \textbf{le} moyen de communication qu'utilise un process
|
||||||
utilisateur pôur demander un service au noyau.
|
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
|
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
|
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:~$
|
tth@redlady:~$
|
||||||
\end{verbatim}
|
\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
|
% TRUCS DE VIEUX
|
||||||
|
|
||||||
\chapter{trucs de dino}
|
\chapter{Trucs de dino}
|
||||||
\label{chap:dino}
|
\label{chap:dino}
|
||||||
|
|
||||||
Je vais, dans ce chapitre, parler de choses que les moins de vingt
|
Je vais, dans ce chapitre, parler de choses que les moins de vingt
|
||||||
ans ne peuvent pas connaitre. Des choses qui existaient
|
ans ne peuvent pas connaitre. Des choses qui existaient
|
||||||
\textsl{bien avant} le Web\index{www}, et pour lesquelles on
|
\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
|
Aussi connu sous le nom de « superserveur Internet », ce démon
|
||||||
a fait ses premiers pas dans l'Unix 4.3BSD
|
a fait ses premiers pas dans l'Unix 4.3BSD
|
||||||
et depuis est maintenant remplacé par
|
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,
|
Inetd a pour but de gérer l'accès à des services réseaux,
|
||||||
qui peuvent être internes ou externes. Un service interne
|
qui peuvent être internes ou externes. Un service interne
|
||||||
est entièrement géré par Inetd : on y trouve par exempme
|
est entièrement géré par Inetd : on y trouve par exemple
|
||||||
daytime qui permet de connaitre l'heure qu'il est à
|
\textsl{daytime} qui permet de connaitre l'heure qu'il est à
|
||||||
l'autre bout du monde :
|
l'autre bout du monde :
|
||||||
|
|
||||||
\begin{verbatim}
|
\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
|
un exemple très ancien\footnote{Août 1998, lors d'une
|
||||||
réunion du CULTe, à Toulouse}, et très simple à
|
réunion du CULTe, à Toulouse}, et très simple à
|
||||||
comprendre.
|
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}
|
\subsection{qotd}
|
||||||
\index{qotd}
|
\index{qotd} \label{qotd}
|
||||||
|
|
||||||
Le protocole « Quote Of The Day » (\texttt{qotd}) a été
|
Le protocole « Quote Of The Day » (\texttt{qotd}) a été
|
||||||
normalise dans le \texttt{rfc865}, écrit en 1983 par John Postel.
|
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}
|
\index{fortune}
|
||||||
\begin{lstlisting}[language=sh]
|
\lstinputlisting[language=sh]{code/inet/qotd.sh}
|
||||||
#!/bin/sh
|
|
||||||
/usr/games/fortune -a -n 500
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
Maintenant, il nous faut dire à Inetd d'appeler ce moteur
|
Maintenant, il nous faut dire à Inetd d'appeler ce moteur
|
||||||
chaque fois qu'une connection tcp entrante arrive sur le
|
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}
|
\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}
|
\section{Fortune}
|
||||||
@@ -17,10 +22,9 @@ You are deeply attached to your friends and acquaintances.
|
|||||||
tth@plop:~$
|
tth@plop:~$
|
||||||
\end{verbatim}
|
\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
|
trucs plus ou
|
||||||
moins aléatoires\footnote{et jamais revenus, il faut bien le
|
moins aléatoires. Il y a tout un tas d'options intéressantes,
|
||||||
préciser.}. Il y a tout un tas d'options intéressantes,
|
|
||||||
la principale étant \texttt{-o} pour avoir les fortunes
|
la principale étant \texttt{-o} pour avoir les fortunes
|
||||||
offensives\index{porn} qui peuvent choquer les âmes
|
offensives\index{porn} qui peuvent choquer les âmes
|
||||||
sensibles.
|
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
|
Un exemple réel, issu d'un projet d'élevage d'algues
|
||||||
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
|
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
|
||||||
fort sympathique.
|
fort sympathique avec l'aide du Tetalab\index{tetalab}.
|
||||||
|
|
||||||
Le fichier des données contient cinq champs séparés par des espaces
|
Le fichier des données contient cinq champs séparés par des espaces
|
||||||
ou des tabulations.
|
ou des tabulations.
|
||||||
|
|||||||
@@ -1,56 +1,123 @@
|
|||||||
\chapter{Graphisme}
|
\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}
|
\lstinputlisting[language=c]{code/SDL2/strangebug.c}
|
||||||
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}
|
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
|
% Fri Sep 27 14:09:45 UTC 2024
|
||||||
bad_parms -100000
|
% la section sur flydram est partie dans les unused
|
||||||
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
|
|
||||||
|
|
||||||
%====================================================================
|
%====================================================================
|
||||||
|
|
||||||
\section{Povray}\index{Povray}
|
\section{Povray}\index{Povray}\label{Povray}
|
||||||
|
|
||||||
\textbf{Persistence Of Vision} est un logiciel de raytracing qui
|
\textbf{Persistence Of Vision} est un logiciel de raytracing qui
|
||||||
existe depuis plus de trente ans. C'est un lointain descendant
|
existe depuis plus de trente ans. C'est un lointain descendant
|
||||||
de DKBtrace. Mais le raytracing, c'est quoi ?
|
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}
|
\subsection{Caméra}
|
||||||
|
|
||||||
Vous avez des problèmes pour caler les mouvement de la 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
|
\texttt{location} et le \texttt{look\_at}, et rien ne tombe
|
||||||
en face de l'objectif ? Voici une approche de solution.
|
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~:
|
lors du calcul de la séquence~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
#if (0 = clock)
|
#if (0 = clock)
|
||||||
#fopen CL "cam.log" create
|
#fopen CL "WS/cam.log" write
|
||||||
#else
|
#else
|
||||||
#fopen CL "cam.log" append
|
#fopen CL "WS/cam.log" append
|
||||||
#end
|
#end
|
||||||
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
|
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
|
||||||
" ", LatX, " ", LatY, " ", LatZ,"\n")
|
" ", LatX, " ", LatY, " ", LatZ,"\n")
|
||||||
#fclose CL
|
#fclose CL
|
||||||
\end{verbatim}
|
\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}~:
|
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
FILE="cam.log"
|
FILE="WS/cam.log"
|
||||||
TMPF="/dev/shm/cam.data"
|
TMPF="/dev/shm/cam.data"
|
||||||
IMAGE="graphe.png"
|
IMAGE="graphe.png"
|
||||||
tail -360 ${FILE} | sort -n > ${TMPF}
|
tail -360 ${FILE} | sort -n > ${TMPF}
|
||||||
gnuplot << __EOC__
|
gnuplot << __EOC__
|
||||||
set term png size 720,720
|
set term png size 720,720
|
||||||
set output "${IMAGE}"
|
set output "${IMAGE}"
|
||||||
set ytics 2
|
set ytics 2
|
||||||
set xtics 2
|
set xtics 2
|
||||||
set grid front
|
set grid front
|
||||||
set title "Rush Camera"
|
set title "Rush Camera"
|
||||||
plot "${TMPF}" using 2:4 title "Cam", \
|
plot "${TMPF}" using 2:4 title "Cam", \
|
||||||
"${TMPF}" using 5:7 title "Lat" with dots
|
"${TMPF}" using 5:7 title "Lat" with dots
|
||||||
__EOC__
|
__EOC__
|
||||||
display "${IMAGE}" &
|
display "${IMAGE}" &
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique
|
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
|
\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
|
coordonnées X et Z, dans le repère POVray, qui n'est pas le même que
|
||||||
celui de Gnuplot.
|
celui de Gnuplot.
|
||||||
|
|
||||||
|
|
||||||
% ------------------------------------------------
|
% ------------------------------------------------
|
||||||
|
% updated Fri Sep 27 13:41:54 UTC 2024
|
||||||
\subsection{image\_map}
|
\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}
|
||||||
|
|
||||||
% ------------------------------------------------
|
% ------------------------------------------------
|
||||||
|
|
||||||
@@ -169,6 +263,8 @@ nous aurons toujours la même séquence en sortie.
|
|||||||
|
|
||||||
\subsection{Trucs à voir}
|
\subsection{Trucs à voir}
|
||||||
|
|
||||||
|
Des bouts de code piochés à droite et à gauche...
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
#declare VIRGINIA =
|
#declare VIRGINIA =
|
||||||
transform {
|
transform {
|
||||||
@@ -177,17 +273,34 @@ matrix < 1, 1, 0,
|
|||||||
0, 0, 1,
|
0, 0, 1,
|
||||||
0, 0, 0 >
|
0, 0, 0 >
|
||||||
}
|
}
|
||||||
|
|
||||||
box { 0, 1
|
box { 0, 1
|
||||||
transform {VIRGINIA}
|
transform {VIRGINIA}
|
||||||
}
|
}
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
Pour faire un vaisseau spatial (Thomas de Groot dans povray.binaries.images)
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
// the color bleeding is done by emission color:
|
||||||
|
material {
|
||||||
|
texture {
|
||||||
|
pigment {rgb <0.50, 1.00, 1.00>}
|
||||||
|
finish {
|
||||||
|
specular 0 roughness 0.001
|
||||||
|
emission rgb <0.50, 1.00, 1.00>*5
|
||||||
|
diffuse 1
|
||||||
|
reflection {0} conserve_energy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
% ================================================
|
% ================================================
|
||||||
|
|
||||||
\section{Avec Fortran}
|
\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
|
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
|
y a des accrocs dans le plan, que le résultat n'est
|
||||||
qu'une video totalement noire de 17 minutes.
|
qu'une video totalement noire de 17 minutes, que des
|
||||||
dmesg, lshw, lsusb, lspci\dots
|
octets incongrus arrivent depuis l'Arduino.
|
||||||
|
dmesg, lscpu, lshw, lsusb, lspci\dots
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
% new: Fri Sep 22 11:13:36 UTC 2023
|
% 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}
|
\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}
|
\section{Ports série}
|
||||||
\index{rs232} \label{rs232}
|
\index{rs232} \label{rs232}
|
||||||
|
|
||||||
@@ -50,7 +65,9 @@ ainsi que la norme ISO 2110 pour la connectique.
|
|||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
Comment détecter si un \textit{device} correspond bien
|
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]
|
\begin{lstlisting}[language=C]
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -76,6 +93,11 @@ return 0;
|
|||||||
}
|
}
|
||||||
\end{lstlisting}
|
\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
|
Et la question qui, je le sens, va venir~: « à quoi peut bien
|
||||||
servir un port série ? » appelle un réponse presque évidente~:
|
servir un port série ? » appelle un réponse presque évidente~:
|
||||||
« à plusieurs choses ». Une petite liste~:
|
« à plusieurs choses ». Une petite liste~:
|
||||||
@@ -83,13 +105,14 @@ Connecter un Minitel\index{MINITEL}
|
|||||||
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
|
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
|
||||||
Sportster 14400 pour retrouver Fidonet\index{Fidonet} ?
|
Sportster 14400 pour retrouver Fidonet\index{Fidonet} ?
|
||||||
Discuter avec un équipement avionnique ? Rediriger
|
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
|
Les possibilités sont infinies. C'est votre imagination qui
|
||||||
est la limite\footnote{Comme à peu près tout dans la vie.}
|
est la limite\footnote{Comme à peu près tout dans la vie.}
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
\section{Ports //} \label{portparallele}
|
\section{Ports \textbf{//}} \label{portparallele}
|
||||||
\index{port //}
|
\index{port //}
|
||||||
|
|
||||||
% http://people.redhat.com/twaugh/parport/html/x623.html
|
% 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} ?
|
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}
|
\section{Disques durs}
|
||||||
@@ -158,8 +198,8 @@ idéal, la prédiction des pannes.
|
|||||||
|
|
||||||
\textsl{Check and repair a Linux filesystem}
|
\textsl{Check and repair a Linux filesystem}
|
||||||
|
|
||||||
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne la
|
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne
|
||||||
tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
la tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
\subsection{tune2fs}\index{tune2fs}
|
\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
|
\textsl{Adjust tunable filesystem parameters on ext2/ext3/ext4
|
||||||
filesystems}\footnote{You can tune a fs, but you can't tuna fish}.
|
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}
|
\section{Sensors} \index{sensors}
|
||||||
@@ -195,7 +255,7 @@ int retcode;
|
|||||||
struct ifreq req;
|
struct ifreq req;
|
||||||
|
|
||||||
#if DEBUG_LEVEL
|
#if DEBUG_LEVEL
|
||||||
fprintf(stderr, ">>> %s \"%s\" to %p\n", \
|
fprintf(stderr, ">>> %s ( \"%s\" to %p )\n", \
|
||||||
__func__, ifname, p_flags);
|
__func__, ifname, p_flags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -225,8 +285,7 @@ if (retcode < 0)
|
|||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#if DEBUG_LEVEL
|
#if DEBUG_LEVEL /* display the result */
|
||||||
/* display the result */
|
|
||||||
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
||||||
#endif
|
#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
|
et je vous propose de ne pas trop lui faire confiance pour une
|
||||||
application critique...
|
application critique...
|
||||||
|
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
|
|
||||||
Le traitement des images est un art à part entière. Nous allons
|
Le traitement des images est un art à part entière. Nous allons
|
||||||
voir quelques grands classiques de la catégorie pas du tout
|
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.
|
d'un script shell pour le réutiliser la semaine prochaine.
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@@ -27,7 +28,8 @@ et leurs interactions parfois troublantes\dots
|
|||||||
Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
|
Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
|
||||||
la plupart des traitements,
|
la plupart des traitements,
|
||||||
\texttt{display} et \texttt{animate} pour visualiser des images,
|
\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.
|
Ils partagent un certain nombre d'options communes.
|
||||||
Certains d'entre eux peuvent avoir un effet destructif%
|
Certains d'entre eux peuvent avoir un effet destructif%
|
||||||
@@ -104,9 +106,7 @@ Code & Signification \\
|
|||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
Pour avoir la liste des couleurs disponibles : \texttt{convert -list color}
|
Pour avoir la liste des couleurs disponibles : \texttt{convert -list color}
|
||||||
et celles des fontes : \texttt{convert -list font}.
|
et celles des polices de caractère : \texttt{convert -list font}.
|
||||||
|
|
||||||
\subsubsection{Questions...}
|
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item{Comment mettre une couleur de fond à ce texte ?}
|
\item{Comment mettre une couleur de fond à ce texte ?}
|
||||||
@@ -192,6 +192,10 @@ On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
|
|||||||
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
|
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
|
||||||
\end{verbatim}
|
\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}
|
\subsection{identify}\index{identify}
|
||||||
@@ -214,6 +218,10 @@ Et ces données peuvent être utilisé pour rajouter une simili
|
|||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
|
%
|
||||||
|
% http://al.howardknight.net/?ID=170228531600
|
||||||
|
%
|
||||||
|
|
||||||
\subsection{Configuration}
|
\subsection{Configuration}
|
||||||
|
|
||||||
La configuration est dans le répertoire \texttt{/etc/ImageMagick-6/}, et
|
La configuration est dans le répertoire \texttt{/etc/ImageMagick-6/}, et
|
||||||
@@ -237,8 +245,8 @@ Resource limits:
|
|||||||
Time: unlimited
|
Time: unlimited
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Vous pouvez aussi essayer de comprendre le contenu du fichier
|
Vous pouvez aussi tenter de comprendre le contenu du fichier
|
||||||
\texttt{thresholds.xml} et venir me l'expliquer juste après
|
\texttt{thresholds.xml} puis revenir me l'expliquer juste après
|
||||||
ma sieste, je pense que ça permet de jouer sur différentes méthodes
|
ma sieste, je pense que ça permet de jouer sur différentes méthodes
|
||||||
de \textsl{dithering}, par exemple pour faire du Bayer.
|
de \textsl{dithering}, par exemple pour faire du Bayer.
|
||||||
|
|
||||||
@@ -248,19 +256,21 @@ de \textsl{dithering}, par exemple pour faire du Bayer.
|
|||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item{convert -average frame*.png output.png}
|
\item{convert -average frame*.png output.png}
|
||||||
|
\item{convert -brightness-contrast 20\% foo.png bar.png}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Il y en plein d'autres, des tricks \textsl{àlc} à découvrir.
|
Il y en plein d'autres, des tricks \textsl{àlc} à découvrir.
|
||||||
Ce sera, pour vous amis lecteurs, une dure mission à assumer.
|
Ce sera, pour vous amis lecteurs, une dure mission à assumer.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
\subsection{Ressources}
|
\subsection{Ressources}
|
||||||
|
|
||||||
Le futur livre de Brunus.
|
Le futur livre de Brunus.
|
||||||
|
|
||||||
Réclamez les prmiers drafts dans
|
Réclamez les premiers drafts dans
|
||||||
l'IRC\index{IRC} \texttt{libera.chat\#paulla} \textit{:)}
|
l'IRC\index{IRC} \texttt{libera.chat\#paulla} \textit{:)}
|
||||||
|
|
||||||
\texttt{http://www.fmwconcepts.com/imagemagick/index.php}
|
\texttt{http://www.fmwconcepts.com/imagemagick/index.php}
|
||||||
@@ -307,7 +317,7 @@ for ((y=0; y<250; y++)) {
|
|||||||
|
|
||||||
Comment faire un \textsl{resize} avec NetPBM ?
|
Comment faire un \textsl{resize} avec NetPBM ?
|
||||||
Est-il nécessaire d'apprendre la bibliothèque de fonctions
|
Est-il nécessaire d'apprendre la bibliothèque de fonctions
|
||||||
\texttt{libnetpbm}\footnote{Réponse: oui.} ?
|
\texttt{libnetpbm}\footnote{Réponse: certainement oui.} ?
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -336,11 +346,11 @@ use it heavily.
|
|||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tiffcp combines one or more files created according to the Tag Image
|
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 Format, Revision 6.0 into a single TIFF file. Because the output
|
||||||
file may be compressed using a different algorithm than the input
|
file may be compressed using a different algorithm than the input
|
||||||
files, tiffcp is most often used to convert between different compres‐
|
files, tiffcp is most often used to convert between different compres‐
|
||||||
sion schemes.
|
sion schemes.
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|||||||
@@ -21,13 +21,15 @@ fprintf(stderr, "Name: \"%s\"\n", joy_name);
|
|||||||
La macro \texttt{JSIOCGNAME} étant définie dans le fichier
|
La macro \texttt{JSIOCGNAME} étant définie dans le fichier
|
||||||
\texttt{/usr/include/linux/joystick.h} comme
|
\texttt{/usr/include/linux/joystick.h} comme
|
||||||
\texttt{\_IOC(\_IOC\_READ, 'j', 0x13, len)}.
|
\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
|
mais vous avez capté le principe\dots
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
\vspace{5em}
|
\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}
|
\index{man}
|
||||||
\label{chap:manpages}
|
\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
|
normally the name of a program, utility or function. The manual page
|
||||||
associated with each of these arguments is then found and displayed. A
|
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
|
section, if provided, will direct man to look only in that section of
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
\chapter{Photographie}
|
\chapter{Photographie}
|
||||||
|
\label{chap:photos}
|
||||||
\index{Photo}
|
\index{Photo}
|
||||||
|
|
||||||
Le domaine de la photographie numérique est vaste.
|
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 :)
|
appareil connecté, si il est sous tension, bien entendu :)
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@redlady:~/Photos/Canon600D/2022-12$ gphoto2 --auto-detect
|
tth@redlady:~/Photos$ gphoto2 --auto-detect
|
||||||
Model Port
|
Model Port
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
Canon EOS 600D usb:002,005
|
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.
|
L'impression sour Linux semble avoir plusieurs personnalités.
|
||||||
La chaine logicielle mise en œuvre est parfois étonnament
|
La chaine logicielle mise en œuvre est parfois étonnament
|
||||||
complexe, et ls système par defaut, \texttt{CUPS}, se contrôle
|
complexe (il en existe même plusieurs) et ls système par défaut,
|
||||||
par une interface Web.
|
\texttt{CUPS} (page \pageref{CUPS}), se contrôle
|
||||||
Les aspects matériels sont vus dans le chapitré adéquat,
|
avec une interface Web et/ou des outils en cli..
|
||||||
en page \pageref{portparallele}.
|
|
||||||
|
|
||||||
\section{CUPS} \index{CUPS}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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}.
|
\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}
|
\label{chap:reseau} \index{Internet}
|
||||||
|
|
||||||
Ah, le grand Internet sauvage, il serait temps qu'on en parle un peu.
|
Ah, le grand Internet sauvage, il serait temps qu'on en parle un peu.
|
||||||
Nous allons voir dans ce chapitre quelques utilisations
|
Nous allons voir dans ce chapitre des logiciels peu connus,
|
||||||
que l'on peut qualifier de «~créatives~».
|
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
|
Si vous attendiez des choses plus sérieuses, j'ai aussi ça
|
||||||
en magasin : \textsc{dns} page \pageref{chap:DNS},
|
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},
|
étrange basé sur \textsl{systemd}\index{systemd},
|
||||||
puisque l'important
|
puisque l'important
|
||||||
ça n'est pas que ça soit mieux, mais que ce soit
|
ç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
|
À titre d'exercice, nous allons reprendre l'exemple du serveur
|
||||||
de \textsl{quote of the day} que nous avons déja utilisé avec
|
de \textsl{quote of the day} que nous avons déja utilisé avec
|
||||||
Inetd\index{inetd}, et lancer le
|
Inetd\index{inetd} (page \pageref{qotd}),
|
||||||
petit script par l'intermédiaire de Xinetd.
|
et lancer notre petit script par l'intermédiaire de Xinetd.
|
||||||
|
|
||||||
Pour cela, il faut créer dans le répertoire
|
Pour cela, il faut créer dans le répertoire
|
||||||
\texttt{/etc/xinetd.d/}\footnote{Attention, ce 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}
|
\begin{verbatim}
|
||||||
service qotd
|
service qotd
|
||||||
{
|
{
|
||||||
disable = yes
|
disable = no
|
||||||
type = UNLISTED
|
type = UNLISTED
|
||||||
|
socket_type = stream
|
||||||
socket_type = stream
|
protocol = tcp
|
||||||
protocol = tcp
|
user = nobody
|
||||||
|
server = /usr/local/bin/qotd.sh
|
||||||
user = nobody
|
}
|
||||||
server = /usr/local/bin/qotd.sh
|
|
||||||
}
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Bien entendu, le script \texttt{qotd.sh} décrit en page
|
Bien entendu, le script \texttt{qotd.sh} décrit en page
|
||||||
\pageref{inetd} sera placé dans le bon répertoire.
|
\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
|
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
|
Ah, on me murmure dans l'oreille que Xinetd n'existe plus dans
|
||||||
les Linux modernes, et qu'il existe quelque chose de
|
les Linux modernes, et qu'il existe quelque chose de
|
||||||
\textit{beaucoup mieux}. Je ne sais pas quoi.
|
\textit{beaucoup mieux}. Je ne sais pas quoi.
|
||||||
Je demande à voir\footnote{Parce que c'est écrit par LP ?}.
|
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
|
avec \texttt{iptables} et \texttt{pfctl} est une source de trolls
|
||||||
sans fin.
|
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}
|
\section{Outils de diagnostic}
|
||||||
|
|
||||||
@@ -152,6 +113,8 @@ iftop\index{iftop},
|
|||||||
iptraf\index{iptraf}
|
iptraf\index{iptraf}
|
||||||
\dots
|
\dots
|
||||||
|
|
||||||
|
Mais c'est toujours la faute du \textsc{dns}\index{dns}.
|
||||||
|
|
||||||
% -------------------------------------------------------------
|
% -------------------------------------------------------------
|
||||||
\subsection{iperf}
|
\subsection{iperf}
|
||||||
\index{iperf}
|
\index{iperf}
|
||||||
|
|||||||
@@ -1,7 +1,28 @@
|
|||||||
\chapter{scripting}
|
\chapter{scripting}
|
||||||
|
|
||||||
XXX
|
Qu'est-ce que le \textsl{scripting} ?
|
||||||
|
C'est l'art de coller entre eux divers outils logiciels
|
||||||
|
afin de réaliser une tache donnée.
|
||||||
|
Le "collage" est fait par un \textbf{script},
|
||||||
|
lequel est un fichier texte, écrit dans divers
|
||||||
|
langages (plus ou moins spécifiques) et qui sera lu et exécuté
|
||||||
|
par un interpréteur.
|
||||||
|
|
||||||
|
Je ne vais pas revenir sur l'art du shebang, si vous ne
|
||||||
|
le connaissez pas, c'est expliqué page \pageref{shebang}.
|
||||||
|
En bref, c'est la manière dont le script sélectionne
|
||||||
|
le bon interpréteur lors de son lancement.
|
||||||
|
|
||||||
|
Quels sont les langages courrament utilisés pour faire du
|
||||||
|
script ? Il y a une bonne poignée de réponses à ça.
|
||||||
|
La première étant souvent « Use The Shell ! »,
|
||||||
|
et la seconde « tu as songé à awk ? »,
|
||||||
|
ce qui est tout aussi sensé.
|
||||||
|
Le shell étant dégrossi page \pageref{chap:shell},
|
||||||
|
passons directement au langage Awk.
|
||||||
|
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
\section{Awk} \index{Awk}
|
\section{Awk} \index{Awk}
|
||||||
|
|
||||||
Awk est un langage de programmation crée
|
Awk est un langage de programmation crée
|
||||||
@@ -9,9 +30,12 @@ par Aho, Kernighan, and Weinberger%
|
|||||||
\footnote{The AWK Programming Language, Alfred V. Aho,
|
\footnote{The AWK Programming Language, Alfred V. Aho,
|
||||||
Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988.
|
Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988.
|
||||||
ISBN 0-201-07981-X. }.
|
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
|
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}
|
\begin{verbatim}
|
||||||
cat { print $0 } or just 1
|
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}
|
\subsection{Un exemple simple}
|
||||||
|
|
||||||
À partir d'un jeu de données structurées, nous allons générer un
|
À 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
|
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}
|
\lstinputlisting[]{code/awk/dataset}
|
||||||
|
|
||||||
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
|
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
|
||||||
petite collection de bubulles. Pratiquement, une représentation
|
petite collection de bubulles. Pratiquement, une représentation
|
||||||
sommaire d'une sphère de povray\footnote{SDL keyword: \texttt{Sphere}}.
|
sommaire d'une sphère de povray.
|
||||||
|
|
||||||
Le fichier à générer est en trois partie : l'en-tête, la liste
|
Le fichier à générer est en trois partie : l'en-tête, la liste
|
||||||
des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord
|
des bubulles\index{bubulle} et l'en-pied, ce qui est bien raccord
|
||||||
@@ -49,7 +75,129 @@ le voir ici-même~:
|
|||||||
|
|
||||||
\lstinputlisting[]{code/awk/mkunion.awk}
|
\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:~$
|
tth@redlady:~$
|
||||||
\end{verbatim}
|
\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
|
Le shell est aussi, et surtout, un langage de programmation
|
||||||
appelé \textsl{glue-language} parce qu'il permet de "coller" ensemble
|
à part entière.
|
||||||
plusieurs opérations élémentaires, d'abord avec ses opérateurs internes
|
Il est parfois appelé \textsl{glue-language} parce qu'il permet de
|
||||||
et ensuite l'utilisation d'outils
|
"coller" ensemble plusieurs opérations élémentaires, d'abord avec
|
||||||
extérieurs\footnote{Grep, Sed, Awk, BwBasic...}
|
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.
|
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
|
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
|
||||||
au tout début d'un script shell.
|
au tout début d'un script shell.
|
||||||
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{\#}.
|
probablement une allusion aux cotés tranchants du \texttt{\#}.
|
||||||
Quand au 'bang', c'est le point d'exclamation après l'explosion
|
Quand au 'bang', c'est le point d'exclamation après l'explosion
|
||||||
de la forkbomb.
|
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,
|
de la première ligne sera interprété pour lancer un autre exécutable,
|
||||||
avec un traitement particuler des options.
|
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}
|
\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}
|
\end{verbatim}
|
||||||
|
|
||||||
Bien entendu, on peut utiliser plusieurs tuyaux pour construire
|
Bien entendu, on peut utiliser plusieurs tuyaux pour construire
|
||||||
une chaine de traitements\footnote{La
|
une chaine de traitements%
|
||||||
chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
|
\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.
|
On peut même « intercepter » ce qui transite par un des tuyaux.
|
||||||
|
|
||||||
\begin{verbatim}
|
\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}
|
\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}
|
\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}
|
\subsection {Les tests}
|
||||||
|
|
||||||
Deux éléments sont ils-égaux ?
|
Deux éléments sont ils égaux ? Et d'abord, ces deux éléments
|
||||||
|
sont-ils comparables ?
|
||||||
|
|
||||||
% --------------------------------------------------------------
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
\subsection {Les boucles}
|
\subsection {Les boucles}
|
||||||
|
|
||||||
|
Exemple très simple~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
for foo in A B C D
|
||||||
|
do
|
||||||
|
echo ${foo}
|
||||||
|
done
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Autre exemple, un peu moins simple~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
for foo in $(seq 0 37 133)
|
||||||
|
do
|
||||||
|
printf "foo = %3d\n" ${foo}
|
||||||
|
done
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
\section{Les fonctions}
|
\section{Les fonctions}
|
||||||
|
|
||||||
Une bonne manière de rendre votre code modulaire, et de réutiliser
|
Une bonne manière de rendre votre code modulaire, et de réutiliser
|
||||||
des bouts de code à volonté depuis plusieurs programmes.
|
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}
|
\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}
|
\lstinputlisting{code/shell/demofonctions.sh}
|
||||||
|
|
||||||
|
XXX expliquer "source" \index{XXX}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
% https://bwog-notes.chagratt.site/2023/le-heredoc/
|
% https://bwog-notes.chagratt.site/2023/le-heredoc/
|
||||||
@@ -128,37 +228,49 @@ Et comment les utiliser~:
|
|||||||
\section{Heredoc}
|
\section{Heredoc}
|
||||||
|
|
||||||
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
||||||
|
C'est un moyen simple et efficace de mettre des données textuelles
|
||||||
|
(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}
|
\lstinputlisting{code/shell/heredoc.sh}
|
||||||
|
|
||||||
\begin{verbatim}
|
Après le \textsl{shebang}, nous avons la création de la variable
|
||||||
tth@redlady:~/Devel/TetaTricks$ code/shell/heredoc.sh
|
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
|
... et la démonstration~:
|
||||||
|
|
||||||
1 +--------------------------------------------------------------------+
|
\begin{verbatim}
|
||||||
| +** *** + + + + |
|
tth@redlady:~/Devel/TetaTricks/code/shell$ ./heredoc.sh
|
||||||
0.8 |-+.......**..........:.**.......:..........:.........sin(x).*******-|
|
|
||||||
| ** : : * : : : : |
|
Here Doc (9946)
|
||||||
0.6 |-+....**..:..........:....**....:..........:..........:..........:+-|
|
|
||||||
| * : : * : : : : |
|
1 +-------------------------------------------------------------+
|
||||||
0.4 |-+.**.....:..........:.......*..:..........:..........:..........:+-|
|
| + + + + + + + + + |
|
||||||
| * : : * : : : : |
|
| 0.7*sin(x) ******* |
|
||||||
0.2 |-*........:..........:.........**..........:..........:..........:+-|
|
| ****** ****** |
|
||||||
|* : : * : : : |
|
0.5 |-+ ** ** ** ** +-|
|
||||||
0 |-+........:..........:..........:**........:..........:..........:+-|
|
| ** * * ** |
|
||||||
| : : : * : : : *|
|
| ** ** ** ** |
|
||||||
-0.2 |-+........:..........:..........:..**......:..........:..........:*-|
|
| ** ** ** ** |
|
||||||
| : : : * : : * |
|
|* ** ** *|
|
||||||
-0.4 |-+........:..........:..........:.....*....:..........:........**:+-|
|
0 |-+ * * +-|
|
||||||
| : : : * : : * : |
|
| ** ** |
|
||||||
-0.6 |-+........:..........:..........:.......**.:..........:.....**...:+-|
|
| * * |
|
||||||
| : : : *: : ** : |
|
| * * |
|
||||||
-0.8 |-+........:..........:..........:..........**.........:..**......:+-|
|
-0.5 |-+ ** ** +-|
|
||||||
| + + + + *** +** + |
|
| *** *** |
|
||||||
-1 +--------------------------------------------------------------------+
|
| ******* |
|
||||||
0 1 2 3 4 5 6
|
| |
|
||||||
|
| + + + + + + + + + |
|
||||||
|
-1 +-------------------------------------------------------------+
|
||||||
|
0 1 2 3 4 5 6 7 8 9
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Je pense que l'exemple est assez parlant.
|
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} ?
|
\texttt{C.UTF-8} ?
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
% https://wiki.fiat-tux.fr/books/d%C3%A9veloppement/page/ajouter-des-couleurs-a-ses-scripts-shell
|
||||||
|
|
||||||
|
\section{Écrire en couleur} \index{ANSI} \index{escape}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
BLACK='\033[0;30m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[0;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
PURPLE='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
WHITE='\033[0;37m'
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
\section{Questions à voir}
|
\section{Questions à voir}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
|
|||||||
28
chap/son.tex
28
chap/son.tex
@@ -2,10 +2,19 @@
|
|||||||
\label{chap:son}
|
\label{chap:son}
|
||||||
|
|
||||||
Abordons maintenant un sujet complexe :
|
Abordons maintenant un sujet complexe :
|
||||||
le son en général,
|
le son en général, et en particulier avec Linux.
|
||||||
|
Vous pouvez aussi regarder
|
||||||
la musique (p. \pageref{chap:musique}) et la
|
la musique (p. \pageref{chap:musique}) et la
|
||||||
synthèse de sons (p. \pageref{chap:modular}).
|
synthèse de sons (p. \pageref{chap:modular}).
|
||||||
|
|
||||||
|
Complexe, parce que, il faut bien se le dire
|
||||||
|
entre nous, je me permet d'affirmer avec vigueur que la gestion du son
|
||||||
|
dans Linux est horriblement compliquée, pour ne pas dire
|
||||||
|
totalement bordélique.
|
||||||
|
C'est un empilement de couches logicielles, chacune destinée à
|
||||||
|
un usage particulier, et qui passent leur temps à se marcher
|
||||||
|
sur les pieds.
|
||||||
|
|
||||||
%------------------------------------------------------------------
|
%------------------------------------------------------------------
|
||||||
|
|
||||||
\section{ALSA}
|
\section{ALSA}
|
||||||
@@ -33,6 +42,8 @@ Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
|
|||||||
qui permettent d'écouter et d'enregistrer les sets de
|
qui permettent d'écouter et d'enregistrer les sets de
|
||||||
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
||||||
|
|
||||||
|
Ils partagent beaucoup d'options communes.
|
||||||
|
|
||||||
\subsection{arecord}
|
\subsection{arecord}
|
||||||
|
|
||||||
Si vous avez plusieurs cartes son, la sélection du
|
Si vous avez plusieurs cartes son, la sélection du
|
||||||
@@ -48,6 +59,13 @@ arecord -D plughw:CARD=Snowball,DEV=0 -v -r 22050 foo.wav
|
|||||||
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
|
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
\subsection{aplay} \index{aplay}
|
||||||
|
|
||||||
|
C'est le pendant de arecord pour écouter des fichiers sonores.
|
||||||
|
Avec pas mal d'options communes.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Du code...}
|
\subsection{Du code...}
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@@ -129,8 +147,8 @@ serveur de stream comme Icecast\index{icecast}
|
|||||||
Libsndfile est essentiellement une très complète bibliothèque
|
Libsndfile est essentiellement une très complète bibliothèque
|
||||||
de lecture et écriture de fichiers sons.
|
de lecture et écriture de fichiers sons.
|
||||||
Elle permet de gérer facilement un nombre
|
Elle permet de gérer facilement un nombre
|
||||||
considérable de formats de fichiers\footnote{Mais ceci est une autre
|
considérable de formats de fichiers,
|
||||||
histoire, que nous verrons peut-être un de ces jours\dots}.
|
que nous verrons peut-être un de ces jours\dots.
|
||||||
|
|
||||||
Elle arrive avec une floppée d'outils en ligne de
|
Elle arrive avec une floppée d'outils en ligne de
|
||||||
commande, dont certains sont assez performants.
|
commande, dont certains sont assez performants.
|
||||||
@@ -164,11 +182,11 @@ https://www.xiph.org/ao/doc/drivers.html
|
|||||||
Pour choisr comment et vers quelle prise physique libao va envoyer
|
Pour choisr comment et vers quelle prise physique libao va envoyer
|
||||||
le son, il y a deux choix à faire. La partie logicielle d'une part
|
le son, il y a deux choix à faire. La partie logicielle d'une part
|
||||||
(aixs, oss, alsa, jack, sndio\dots)
|
(aixs, oss, alsa, jack, sndio\dots)
|
||||||
et la partie matérielle (jack standard, casque audio USB\dots).
|
et la partie matérielle (jack 3.5 standard, casque audio USB\dots).
|
||||||
|
|
||||||
%------------------------------------------------------------------
|
%------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Portaudio} \label{Portaudio} \index{Portaudio}
|
\section{Portaudio} \label{Portaudio} \index{portaudio}
|
||||||
|
|
||||||
Une suggestion de Wargreen pour avancer un peu dans la construction
|
Une suggestion de Wargreen pour avancer un peu dans la construction
|
||||||
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
|
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
|
||||||
|
|||||||
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
|
fait, avec des outils divers et variés et des résultats parfois
|
||||||
(ou souvent) hasardeux.
|
(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}
|
\section{fmt et ses copains}
|
||||||
\index{fmt}\index{tr}
|
\index{fmt}\index{tr}
|
||||||
|
|
||||||
@@ -33,19 +37,20 @@ condimentum ante in metus iaculis quis congue diam commodo.
|
|||||||
|
|
||||||
%-------------------------------------------------------------
|
%-------------------------------------------------------------
|
||||||
|
|
||||||
\section{roff}
|
\section{La famille \texttt{roff}}
|
||||||
\index{roff}\label{roff}
|
\index{roff}\label{roff} \index{groff}\index{troff}
|
||||||
|
|
||||||
%
|
%
|
||||||
% https://linuxfr.org/users/karchnu/journaux/redecouverte-roff
|
% https://linuxfr.org/users/karchnu/journaux/redecouverte-roff
|
||||||
% https://pjfichet.github.io/utroff/
|
% 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
|
\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 justifier auprès de leur hiérarchie le développement d'une machine
|
||||||
de jeu, il est donc légitime d'en parler, non ?
|
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
|
Il semble bien que \texttt{groff} ne sache pas lire les fichiers
|
||||||
encodés en \textbf{utf8}\index{utf8}. Il faut donc utiliser
|
encodés en \textbf{utf8}\index{utf8}. Il faut donc utiliser
|
||||||
un hack avec \texttt{recode} en prenant bien soin d'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.
|
les pages du manuel Unix. La documentation, c'est important.
|
||||||
C'est pour ça que j'en cause page \pageref{chap:manpages}.
|
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}
|
\subsection{eqn}
|
||||||
|
|
||||||
@@ -82,6 +128,10 @@ input files into commands that are understood by troff.
|
|||||||
input files into commands that are understood by troff.
|
input files into commands that are understood by troff.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
|
\subsection{Autres trucs...}
|
||||||
|
|
||||||
|
\texttt{colcrt} : filter nroff output for CRT previewing
|
||||||
|
|
||||||
%-------------------------------------------------------------
|
%-------------------------------------------------------------
|
||||||
\section{yodl}
|
\section{yodl}
|
||||||
\index{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...
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
|
|
||||||
@@ -53,9 +53,15 @@ avec d'ignobles logiciels~:
|
|||||||
|
|
||||||
\texttt{ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-\%03d.jpeg}
|
\texttt{ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-\%03d.jpeg}
|
||||||
|
|
||||||
|
J'avoue ne pas avoir tout saisi : l'option\texttt{-r N} qui fixe le
|
||||||
|
\textsl{frame rate} sert à quoi ???
|
||||||
|
|
||||||
|
|
||||||
|
Il existe bien une alternative, mais je n'ai pas encore essayé~:
|
||||||
\texttt{mplayer -vo png -ss 3:46 -frames 20 stairs.mp4}
|
\texttt{mplayer -vo png -ss 3:46 -frames 20 stairs.mp4}
|
||||||
\# Write out 20 png format frames from a video starting at 3 minutes, 46 seconds.
|
\# 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
|
Tu peux générer les images de transition avec
|
||||||
ImageMagick\index{ImageMagick} :
|
ImageMagick\index{ImageMagick} :
|
||||||
\texttt{convert a.png b.png -alpha set -channel A
|
\texttt{convert a.png b.png -alpha set -channel A
|
||||||
@@ -142,8 +148,6 @@ OMFG! Il manque le son.
|
|||||||
% mais où ai-je bien pu trouver ça ?
|
% mais où ai-je bien pu trouver ça ?
|
||||||
%
|
%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
read -p "*** Press Enter to start recording ***"
|
read -p "*** Press Enter to start recording ***"
|
||||||
"$FFMPEGBIN" \
|
"$FFMPEGBIN" \
|
||||||
@@ -217,11 +221,11 @@ Et avec du \textbf{Zenitram} dedans \textit{:)}
|
|||||||
\section{MPV} \index{MPV}
|
\section{MPV} \index{MPV}
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
mpv is a media player based on MPlayer and mplayer2. It supports a wide
|
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
|
variety of video file formats, audio and video codecs, and subtitle
|
||||||
types. Special input URL types are available to read input from a vari‐
|
types. Special input URL types are available to read input from a variety
|
||||||
ety of sources other than disk files. Depending on platform, a variety
|
of sources other than disk files. Depending on platform, a variety
|
||||||
of different video and audio output methods are supported.
|
of different video and audio output methods are supported.
|
||||||
\end {quote}
|
\end {quote}
|
||||||
|
|
||||||
Un avantage de Mpv sur ses camarades (Mplayer, Ffplay\dots) est évident
|
Un avantage de Mpv sur ses camarades (Mplayer, Ffplay\dots) est évident
|
||||||
@@ -237,9 +241,11 @@ de codecs, la foultitude de containers, et les nombreuses variantes de
|
|||||||
combinaisons codec/container rendent la compréhension de cet univers
|
combinaisons codec/container rendent la compréhension de cet univers
|
||||||
assez perturbante.
|
assez perturbante.
|
||||||
|
|
||||||
\subsection{rtmp} \index{rtmp}
|
|
||||||
|
|
||||||
\texttt{flvstreamer -r rtmp://lacantine.live-fstreams.cdn02.rambla.be:1935/live-lacantine/live-lacantine-2 | mplayer -}
|
\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.}
|
\textsl{Video For Linux, second edition.}
|
||||||
|
|
||||||
|
%
|
||||||
|
% PLEASE EXPLAIN !
|
||||||
|
%
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@delirium:~/Essais/Fonderie$ v4l2-ctl --list-formats-ext
|
tth@delirium:~$ v4l2-ctl --list-formats-ext
|
||||||
ioctl: VIDIOC_ENUM_FMT
|
ioctl: VIDIOC_ENUM_FMT
|
||||||
Type: Video Capture
|
Type: Video Capture
|
||||||
|
|
||||||
@@ -38,8 +42,81 @@ ioctl: VIDIOC_ENUM_FMT
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Question : quelle méthode utiliser pour avoir la même chose avec
|
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
|
des lignes de code écrites en C ?
|
||||||
\texttt{ioctl}\index{ioctl}.
|
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}
|
\index{vgrabbj}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
D'après la manpage :
|
D'après la manpage :
|
||||||
« \textit{
|
« \textit{%
|
||||||
vgrabbj is a program that will grab images from any v4l-capable device
|
vgrabbj is a program that will grab images from any v4l-capable device
|
||||||
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
|
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
|
||||||
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
|
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
|
||||||
} »
|
} »
|
||||||
|
|
||||||
Quelques options à connaitre : \texttt{-S} échange des
|
Quelques options à connaitre :
|
||||||
deux composantes R et B; \texttt{-s <device>} affiche
|
\texttt{-S} échange des
|
||||||
les capacités du périphérique v4l\index{v4l}.
|
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}
|
\section{Cheese}
|
||||||
|
|||||||
@@ -4,20 +4,26 @@
|
|||||||
\chapter{Web servers}
|
\chapter{Web servers}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
\section{Apache, Nginx} \index{Apache} ìndex{nginx}
|
\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.
|
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
|
Que nous ne verrons pas pour le moment. Je vais plutôt me concentrer
|
||||||
sur un autre serveur : \texttt{lighthttp}, pour passer ensuite à quelque
|
sur un autre serveur : \texttt{lighthttp}, pour passer ensuite à quelque
|
||||||
chose d'encore plus bas-niveau.
|
chose d'encore plus bas-niveau qui demandera quelques connaissances en C.
|
||||||
|
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
\section{Lighttpd} \index{Lighttpd}
|
\section{Lighttpd} \index{Lighttpd}
|
||||||
|
|
||||||
Un outsider ?
|
Un outsider ? Non, pas vraiment. Probablement plus léger que
|
||||||
|
les classiques, il a quelques fonctions assez interessantes.
|
||||||
|
Je vais faire un rapide survol des \textsl{tricks} à connaitre
|
||||||
|
pour une mise en œuvre de bon aloi. Et pour ça, je vais
|
||||||
|
d'abord me concentrer sur un cas précis~:
|
||||||
|
l'exécution de scripts CGI\index{CGI} écrits en Perl\index{Perl}
|
||||||
|
depuis le répertoire \texttt{\$HOME/public\_html/} des yusers.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
root@ramen:~# lighty-enable-mod userdir
|
root@ramen:~# lighty-enable-mod userdir
|
||||||
@@ -28,7 +34,7 @@ root@ramen:~#
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
\textbf{Q:} Sur une installation fraiche, la racine du site est
|
\textbf{Q:} Sur une installation fraiche, la racine du site est
|
||||||
en erreur 403\index{403} ?\linebreak
|
en erreur 403\index{403} ?
|
||||||
\textbf{R:} Par défaut le listing des répertoires vides
|
\textbf{R:} Par défaut le listing des répertoires vides
|
||||||
(sans \texttt{index.html}) est interdit. Pour changer ça, il faut
|
(sans \texttt{index.html}) est interdit. Pour changer ça, il faut
|
||||||
\texttt{\# lighttpd-enable-mod dir-listing} et
|
\texttt{\# lighttpd-enable-mod dir-listing} et
|
||||||
@@ -37,6 +43,14 @@ en erreur 403\index{403} ?\linebreak
|
|||||||
Question : comment forcer le \texttt{Content-Type} pour un type particulier
|
Question : comment forcer le \texttt{Content-Type} pour un type particulier
|
||||||
de fichier ? Par exemple text/plain pour les fichiers \texttt{.POV} ?
|
de fichier ? Par exemple text/plain pour les fichiers \texttt{.POV} ?
|
||||||
|
|
||||||
|
% ------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Filtrages}
|
||||||
|
|
||||||
|
In case you need to do this with lighttpd (you can have multiple of
|
||||||
|
these for each useragent you want to match, or you can make one big regex
|
||||||
|
if you want):
|
||||||
|
\texttt{\$HTTP["useragent"] =~ "Amazonbot" \{ url.access-deny = ("") \}}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
@@ -46,34 +60,21 @@ de fichier ? Par exemple text/plain pour les fichiers \texttt{.POV} ?
|
|||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
tth@ramen:~/Houba/Fractales90$ apt show libmicrohttpd12
|
tth@ramen:~/Houba/Fractales90$ apt show libmicrohttpd12
|
||||||
Package: 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
|
Description: library embedding HTTP server functionality
|
||||||
GNU libmicrohttpd is a small C library that is supposed to make it
|
GNU libmicrohttpd is a small C library that is supposed to make it
|
||||||
easy to run an HTTP server as part of another application.
|
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}
|
\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.
|
||||||
|
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Le BASIC
|
||||||
|
|
||||||
|
Un des premiers langages abordable par tout le monde,
|
||||||
|
crée il y a très longtemps à Dartmouth. Il a eu ensuite
|
||||||
|
une longue et fructueuse carrière, surtout à l'époque
|
||||||
|
des ordinateurs personnels de la regrettée famille des
|
||||||
|
8 bits : Apple ][, Amstrad CPC6128, la série des MSX,
|
||||||
|
l'Oric...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
10 CLEAR
|
10 CLEAR
|
||||||
20 FOR I=1 TO 10
|
20 FOR I=2 TO 5
|
||||||
30 PRINT I, I*I
|
30 PRINT I, I*I
|
||||||
40 NEXT I
|
40 NEXT I
|
||||||
|
50 SYSTEM
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
open window 511,511
|
open window 511,511
|
||||||
for x=10 to 495 step 5:for y=10 to 495 step 5
|
for x=10 to 495 step 5:for y=10 to 495 step 5
|
||||||
colour x/2,y/2,0
|
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
|
next y:next x
|
||||||
|
|||||||
2
code/C/.gitignore
vendored
2
code/C/.gitignore
vendored
@@ -1,2 +1,4 @@
|
|||||||
fgets-simple
|
fgets-simple
|
||||||
demo-strtok
|
demo-strtok
|
||||||
|
packtest
|
||||||
|
use_envp
|
||||||
|
|||||||
@@ -2,7 +2,16 @@
|
|||||||
# exemples pour le chapitre sur le C
|
# exemples pour le chapitre sur le C
|
||||||
# new Sat Feb 11 12:06:34 CET 2023
|
# new Sat Feb 11 12:06:34 CET 2023
|
||||||
|
|
||||||
all: no-op slowprint fgets-simple
|
|
||||||
|
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
|
no-op: no-op.c Makefile
|
||||||
gcc -Wall $< -o $@
|
gcc -Wall $< -o $@
|
||||||
@@ -15,3 +24,12 @@ fgets-simple: fgets-simple.c Makefile
|
|||||||
|
|
||||||
demo-strtok: demo-strtok.c Makefile
|
demo-strtok: demo-strtok.c Makefile
|
||||||
gcc -Wall $< -o $@
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
|
# 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 $@
|
||||||
|
|
||||||
|
|||||||
8
code/C/hacks.txt
Normal file
8
code/C/hacks.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
inline int
|
||||||
|
usleep(useconds_t microseconds)
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
ts.tv_sec = microseconds / (useconds_t)1000000;
|
||||||
|
ts.tv_nsec = (long)(microseconds % (useconds_t)1000000) * 1000L;
|
||||||
|
return nanosleep(&ts, NULL);
|
||||||
|
}
|
||||||
116
code/C/packtest.c
Executable file
116
code/C/packtest.c
Executable file
@@ -0,0 +1,116 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* found in the good old Usenet
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The expected sizes in these comments assime a 64-bit machine */
|
||||||
|
|
||||||
|
struct foo1 {
|
||||||
|
char *p;
|
||||||
|
char c;
|
||||||
|
long x;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo2 {
|
||||||
|
char c; /* 1 byte */
|
||||||
|
char pad[7]; /* 7 bytes */
|
||||||
|
char *p; /* 8 bytes */
|
||||||
|
long x; /* 8 bytes */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo3 {
|
||||||
|
char *p; /* 8 bytes */
|
||||||
|
char c; /* 1 byte */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo4 {
|
||||||
|
short s; /* 2 bytes */
|
||||||
|
char c; /* 1 byte */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo5 {
|
||||||
|
char c;
|
||||||
|
struct foo5_inner {
|
||||||
|
char *p;
|
||||||
|
short x;
|
||||||
|
} inner;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo6 {
|
||||||
|
short s;
|
||||||
|
char c;
|
||||||
|
int flip:1;
|
||||||
|
int nybble:4;
|
||||||
|
int septet:7;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo7 {
|
||||||
|
int bigfield:31;
|
||||||
|
int littlefield:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo8 {
|
||||||
|
int bigfield1:31;
|
||||||
|
int littlefield1:1;
|
||||||
|
int bigfield2:31;
|
||||||
|
int littlefield2:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo9 {
|
||||||
|
int bigfield1:31;
|
||||||
|
int bigfield2:31;
|
||||||
|
int littlefield1:1;
|
||||||
|
int littlefield2:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo10 {
|
||||||
|
char c;
|
||||||
|
struct foo10 *p;
|
||||||
|
short x;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo11 {
|
||||||
|
struct foo11 *p;
|
||||||
|
short x;
|
||||||
|
char c;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct foo12 {
|
||||||
|
struct foo12_inner {
|
||||||
|
char *p;
|
||||||
|
short x;
|
||||||
|
} inner;
|
||||||
|
char c;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
printf("sizeof(char *) = %zu\n", sizeof(char *));
|
||||||
|
printf("sizeof(long) = %zu\n", sizeof(long));
|
||||||
|
printf("sizeof(int) = %zu\n", sizeof(int));
|
||||||
|
printf("sizeof(short) = %zu\n", sizeof(short));
|
||||||
|
printf("sizeof(char) = %zu\n", sizeof(char));
|
||||||
|
printf("sizeof(float) = %zu\n", sizeof(float));
|
||||||
|
printf("sizeof(double) = %zu\n", sizeof(double));
|
||||||
|
printf("sizeof(struct foo1) = %zu\n", sizeof(struct foo1));
|
||||||
|
printf("sizeof(struct foo2) = %zu\n", sizeof(struct foo2));
|
||||||
|
printf("sizeof(struct foo3) = %zu\n", sizeof(struct foo3));
|
||||||
|
printf("sizeof(struct foo4) = %zu\n", sizeof(struct foo4));
|
||||||
|
printf("sizeof(struct foo5) = %zu\n", sizeof(struct foo5));
|
||||||
|
printf("sizeof(struct foo6) = %zu\n", sizeof(struct foo6));
|
||||||
|
printf("sizeof(struct foo7) = %zu\n", sizeof(struct foo7));
|
||||||
|
printf("sizeof(struct foo8) = %zu\n", sizeof(struct foo8));
|
||||||
|
printf("sizeof(struct foo9) = %zu\n", sizeof(struct foo9));
|
||||||
|
printf("sizeof(struct foo10) = %zu\n", sizeof(struct foo10));
|
||||||
|
printf("sizeof(struct foo11) = %zu\n", sizeof(struct foo11));
|
||||||
|
printf("sizeof(struct foo12) = %zu\n", sizeof(struct foo12));
|
||||||
|
|
||||||
|
if (sizeof(struct foo3) == 16) {
|
||||||
|
puts("This looks like a 64-bit machine.");
|
||||||
|
} else if (sizeof(struct foo3) == 6) {
|
||||||
|
puts("This looks like a 32-bit machine.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,18 +1,40 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int c;
|
int c, sec, nano;
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
int slowdown = 300; /* set a default value */
|
||||||
|
float delay;
|
||||||
|
/*
|
||||||
|
* get the desired slowdown from command-line
|
||||||
|
*/
|
||||||
|
if (2 == argc) {
|
||||||
|
if (1 != sscanf(argv[1], "%d", &slowdown)) {
|
||||||
|
fprintf(stderr, "%s: bad arg, sorry\n",
|
||||||
|
argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (slowdown < 1) {
|
||||||
|
fprintf(stderr, "%d is invalid\n",
|
||||||
|
slowdown);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ts.tv_sec = 0;
|
/* convert the slowdown value to delay */
|
||||||
ts.tv_nsec = 115 * 1000 * 1000;
|
delay = 1.0 / (float)slowdown;
|
||||||
|
sec = (int)delay;
|
||||||
|
nano = (int)(1000*1000*1000*(delay - (int)delay));
|
||||||
|
|
||||||
|
ts.tv_sec = sec;
|
||||||
|
ts.tv_nsec = nano;
|
||||||
while ( EOF != (c=getchar()) )
|
while ( EOF != (c=getchar()) )
|
||||||
{
|
{
|
||||||
putchar(c);
|
putchar(c), fflush(stdout);
|
||||||
fflush(stdout);
|
|
||||||
nanosleep(&ts, NULL);
|
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
|
thread-demo: thread-demo.c Makefile
|
||||||
gcc -Wall -pthread $< -o $@
|
gcc -Wall -pthread $< -o $@
|
||||||
|
|
||||||
hello: hello.c Makefile
|
|
||||||
gcc -Wall $< -o $@
|
|
||||||
|
|
||||||
arguments: arguments.c Makefile
|
|
||||||
gcc -Wall $< -o $@
|
|
||||||
|
|
||||||
voirenv: voirenv.c Makefile
|
voirenv: voirenv.c Makefile
|
||||||
gcc -Wall $< -o $@
|
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 -----------------------
|
#------------- 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;
|
lo_address loana;
|
||||||
int foo;
|
int foo;
|
||||||
|
|
||||||
|
fprintf(stderr, "sending to %s:%s\n", REMOTE_HOST, REMOTE_PORT);
|
||||||
loana = lo_address_new(REMOTE_HOST, REMOTE_PORT);
|
loana = lo_address_new(REMOTE_HOST, REMOTE_PORT);
|
||||||
foo = lo_send(loana, "/dev/kmem", "is", 61, "meg, efface !");
|
foo = lo_send(loana, "/demo", "is", 61, "meg, efface !");
|
||||||
fprintf(stderr, "foo %d\n", foo);
|
fprintf(stderr, "got a %d return code ?\n", foo);
|
||||||
return 0;
|
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
|
#!/usr/bin/awk -f
|
||||||
|
|
||||||
|
# create the sdl object: an union of sphere
|
||||||
BEGIN {
|
BEGIN {
|
||||||
print "#declare Bubules = object"
|
nbre = 0
|
||||||
|
print "#declare Bubulles = object"
|
||||||
print "{ \nunion { "
|
print "{ \nunion { "
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# active portion of the code
|
||||||
{
|
{
|
||||||
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
||||||
$1, $2, $3, $4 )
|
$1, $2, $3, $4 )
|
||||||
|
nbre++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# closing sdl structure
|
||||||
END {
|
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
|
* spy_getenv.so: spy_getenv.c Makefile
|
||||||
* gcc -Wall -shared -fPIC $< -ldl -o $@
|
* gcc -Wall -shared -fPIC $< -ldl -o $@
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define __USE_GNU
|
#define __USE_GNU
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
@@ -18,15 +14,12 @@ char *getenv(char *envname)
|
|||||||
{
|
{
|
||||||
static char *arrow = "--getenv--> ";
|
static char *arrow = "--getenv--> ";
|
||||||
static char *wtf = " --> (nil)";
|
static char *wtf = " --> (nil)";
|
||||||
|
|
||||||
char *content;
|
char *content;
|
||||||
original_getenv orig_getenv;
|
original_getenv orig_getenv;
|
||||||
|
|
||||||
orig_getenv = (original_getenv)dlsym(RTLD_NEXT, "getenv");
|
orig_getenv = (original_getenv)dlsym(RTLD_NEXT, "getenv");
|
||||||
|
|
||||||
write(STDERR_FILENO, arrow, strlen(arrow));
|
write(STDERR_FILENO, arrow, strlen(arrow));
|
||||||
write(STDERR_FILENO, envname, strlen(envname));
|
write(STDERR_FILENO, envname, strlen(envname));
|
||||||
|
|
||||||
content = orig_getenv(envname);
|
content = orig_getenv(envname);
|
||||||
if (NULL != content) {
|
if (NULL != content) {
|
||||||
write(STDERR_FILENO, "=", 1);
|
write(STDERR_FILENO, "=", 1);
|
||||||
@@ -35,9 +28,7 @@ if (NULL != content) {
|
|||||||
else {
|
else {
|
||||||
write(STDERR_FILENO, wtf, strlen(wtf));
|
write(STDERR_FILENO, wtf, strlen(wtf));
|
||||||
}
|
}
|
||||||
|
|
||||||
write(STDERR_FILENO, "\n", 1);
|
write(STDERR_FILENO, "\n", 1);
|
||||||
|
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
code/fortran/.gitignore
vendored
1
code/fortran/.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
plplotting
|
plplotting
|
||||||
dessiner
|
dessiner
|
||||||
|
printty
|
||||||
|
|
||||||
*.png
|
*.png
|
||||||
*.gif
|
*.gif
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
|
|
||||||
INCS = -I/usr/include/plplot -I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot
|
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
|
plplotting: plplotting.f90 Makefile
|
||||||
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
||||||
|
|
||||||
@@ -11,4 +19,5 @@ dessiner: dessiner.f90 Makefile
|
|||||||
plot89a.gif: dessiner Makefile
|
plot89a.gif: dessiner Makefile
|
||||||
rm -f WS/A????.png
|
rm -f WS/A????.png
|
||||||
./dessiner
|
./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
|
Pour les explications, il faut aller lire le livre ou
|
||||||
les codes source.
|
les codes source.
|
||||||
|
|
||||||
|
## Dessiner...
|
||||||
|
|
||||||
|
Je pense qe l'on devrait parler ici de plplot.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ program dessiner
|
|||||||
|
|
||||||
character(len=80) :: version
|
character(len=80) :: version
|
||||||
call plgver(version)
|
call plgver(version)
|
||||||
write (*,'(a,a)') 'plPlot version: ', trim(version)
|
write (*,'(" ",a,a)') 'plPlot version: ', trim(version)
|
||||||
|
|
||||||
! call dessin_X11 (0.00, 1.51, 11)
|
!! call dessin_X11 (0.12, 1.51, 11)
|
||||||
call dessin_dans_un_fichier ()
|
call dessin_dans_un_fichier ()
|
||||||
|
|
||||||
contains ! -----------------------------
|
contains ! -----------------------------
|
||||||
@@ -33,13 +33,13 @@ subroutine dessin_X11 (sha, shb, color)
|
|||||||
|
|
||||||
call plsdev('xwin')
|
call plsdev('xwin')
|
||||||
call plinit ()
|
call plinit ()
|
||||||
call plenv (-2.1, 2.1, -2.1, 2.1, 1, 2)
|
call plenv (-2.5, 2.5, -2.5, 2.5, 1, 1)
|
||||||
|
|
||||||
amp = 2.16
|
amp = 2.06
|
||||||
do i = 1, lg
|
do i = 1, lg
|
||||||
k = real(i)/real(lg) * 6.2832 * 4.0
|
k = real(i)/real(lg) * 6.2832 * 2.0
|
||||||
x(i) = amp * sin((k+sha)*5)
|
x(i) = amp * sin((k+sha))
|
||||||
y(i) = amp * cos((k+shb)*3)
|
y(i) = amp * cos((k+shb))
|
||||||
enddo
|
enddo
|
||||||
! print *, k, x(i), y(i)
|
! print *, k, x(i), y(i)
|
||||||
|
|
||||||
@@ -52,47 +52,67 @@ subroutine dessin_X11 (sha, shb, color)
|
|||||||
|
|
||||||
end subroutine
|
end subroutine
|
||||||
!------------------------------------------------------
|
!------------------------------------------------------
|
||||||
!- _ __ ___ ___ ___
|
!- _ __ ___ ___
|
||||||
!- __ _ (_) / _| ( _ ) / _ \ __ _ |__ \
|
!- __ _ (_) / _| ( _ ) / _ \ __ _
|
||||||
!- / _` | | | | |_ / _ \ | (_) | / _` | / /
|
!- / _` | | | | |_ / _ \ | (_) | / _` |
|
||||||
!- | (_| | | | | _| | (_) | \__, | | (_| | |_|
|
!- | (_| | | | | _| | (_) | \__, | | (_| |
|
||||||
!- \__, | |_| |_| \___/ /_/ \__,_| (_)
|
!- \__, | |_| |_| \___/ /_/ \__,_|
|
||||||
!- |___/
|
!- |___/
|
||||||
|
!-
|
||||||
|
|
||||||
subroutine dessin_dans_un_fichier ()
|
subroutine dessin_dans_un_fichier ()
|
||||||
|
|
||||||
integer, parameter :: nbpts = 20
|
integer, parameter :: nbpts = 179
|
||||||
real, parameter :: usz = 15.0 ! univers size
|
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)
|
real :: x(nbpts), y(nbpts)
|
||||||
|
|
||||||
integer :: frame, i
|
integer :: frame, i
|
||||||
|
real :: coef
|
||||||
|
|
||||||
character(len=89) :: filename
|
character(len=89) :: filename
|
||||||
character(len=89) :: buffer
|
character(len=89) :: buffer
|
||||||
character(len=3) :: str
|
character(len=3) :: str
|
||||||
|
|
||||||
print *, 'Dessin dans un fichier'
|
print *, 'Dessin dans un fichier'
|
||||||
|
|
||||||
|
! build the startup conditions
|
||||||
do i=1, nbpts
|
do i=1, nbpts
|
||||||
x(i) = usz * (rand() - 0.5000)
|
coef = real(i) * 0.051
|
||||||
y(i) = usz * (rand() - 0.5000) * 0.50
|
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
|
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"
|
write (filename, "(a, i4.4, a)") "WS/A", frame, ".png"
|
||||||
print *, frame, ' => ', trim(filename)
|
! print *, frame, "!", coef, ' => ', trim(filename)
|
||||||
|
|
||||||
call plsdev ('pngcairo')
|
call plsdev ('pngcairo')
|
||||||
call plsfnam (trim(filename))
|
call plsfnam (trim(filename))
|
||||||
call plinit ()
|
call plinit ()
|
||||||
call plenv (-10., 10., -10., 10., 0, 1)
|
call plenv (-usz, usz, -usz, usz, 0, 1)
|
||||||
call plcol0 (3)
|
call plcol0 (3)
|
||||||
|
|
||||||
|
! compute the real picture...
|
||||||
do i=1, nbpts
|
do i=1, nbpts
|
||||||
x(i) = x(i) + 1.2 * (rand() - 0.5000)
|
x(i) = xa(i)*coef - xb(i)*(1.0-coef)
|
||||||
y(i) = y(i) + 1.2 * (rand() - 0.5000)
|
y(i) = ya(i)*coef - yb(i)*(1.0-coef)
|
||||||
call plline (x, y)
|
enddo
|
||||||
enddo
|
|
||||||
write(buffer, "(i3.3)") frame
|
! ... and plot it *now*
|
||||||
str = trim(buffer)
|
call plline (x, y)
|
||||||
call plcol0 (15)
|
|
||||||
call plstring (x, y, buffer)
|
call plcol0 (15) ! 15 is pure white
|
||||||
|
call pllab("Apéro level", "Choupitude", "-- Philosophie de comptoir --")
|
||||||
|
|
||||||
call plend ()
|
call plend ()
|
||||||
enddo
|
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;
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Outils divers
|
# Outils divers
|
||||||
|
|
||||||
|
|
||||||
OK, let's go for a few nice tools.
|
*OK, let's go for a few nice tools.*
|
||||||
|
|
||||||
## non ascii ?
|
## non ascii ?
|
||||||
|
|
||||||
|
|||||||
@@ -10,26 +10,29 @@
|
|||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
int check_a_file_by_fp(FILE *fp, char *filename)
|
int check_a_file_by_fp(FILE *fp, char *filename)
|
||||||
{
|
{
|
||||||
int input, linenum, count;
|
int input, linenum, colnum, count;
|
||||||
int flagline;
|
int flagline;
|
||||||
|
|
||||||
linenum = 1; /* humans start line count at 1 */
|
linenum = 1; /* humans start line count at 1 */
|
||||||
|
colnum = 1;
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
while (EOF != (input=getc(stdin))) {
|
while (EOF != (input=getc(stdin))) {
|
||||||
if ('\n' == input) {
|
if ('\n' == input) {
|
||||||
linenum++;
|
linenum++;
|
||||||
flagline = 0;
|
flagline = 0;
|
||||||
|
colnum = 1;
|
||||||
}
|
}
|
||||||
if ((input < 0) || (input>127)) {
|
if ((input < 0) || (input>127)) {
|
||||||
if (!flagline) {
|
if (!flagline) {
|
||||||
fprintf(stderr, "%s: non ascii 0x%x line %d\n",
|
fprintf(stderr, "%s: nonascii 0x%x line %d, col %d\n",
|
||||||
filename,
|
filename,
|
||||||
input, linenum);
|
input, linenum, colum);
|
||||||
flagline = 1;
|
flagline = 1;
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
colnum++;
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|||||||
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
|
#!/bin/sh
|
||||||
. ./fonctions.sh
|
source ./fonctions.sh
|
||||||
message "hello world"
|
message "hello world"
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
TITLE="Here Doc"
|
TITLE="Here Doc ($$)"
|
||||||
|
|
||||||
gnuplot << __EOC__
|
gnuplot << __EOC__
|
||||||
set term dumb
|
set term dumb size 72,24
|
||||||
set grid
|
# set grid
|
||||||
set title "$TITLE"
|
set title "$TITLE"
|
||||||
plot [x=0:pi*2] sin(x)
|
plot [x=0:pi*3] [-1:1] 0.7*sin(x)
|
||||||
__EOC__
|
__EOC__
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/awk -f
|
|
||||||
|
|
||||||
{ printf "%5d\t%s\n", NR, $0; }
|
|
||||||
|
|
||||||
@@ -24,11 +24,12 @@
|
|||||||
|
|
||||||
\makeindex
|
\makeindex
|
||||||
|
|
||||||
\setlength \parindent {2em}
|
\setlength \parindent {1.5em}
|
||||||
\setlength \parskip {0.30em} % XXX
|
\setlength \parskip {0.25em} % XXX
|
||||||
|
|
||||||
%------ reglages des 'listings'
|
%------ 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{basicstyle=\ttfamily\small}
|
||||||
\lstset{aboveskip=0.7em,belowskip=0.7em}
|
\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,
|
d'une très ancienne version (circa 2011) et donc,
|
||||||
peut-être pas vraiment d'actualité.
|
peut-être pas vraiment d'actualité.
|
||||||
|
|
||||||
\vspace{3em}
|
\vspace{1em}
|
||||||
|
|
||||||
|
|
||||||
Cependant, toute cette ouvrage est en cours de
|
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,
|
Citons, par exemple, le K\&R, ceux de Christophe Blaess,
|
||||||
le Christian Pelissier, et bien d'autres.
|
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}
|
\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/modular}
|
||||||
\input{chap/MIDI}
|
\input{chap/MIDI}
|
||||||
\input{chap/OSC}
|
\input{chap/OSC}
|
||||||
|
\input{chap/DMX512} % nouveau 2 juin 2024
|
||||||
\input{chap/image}
|
\input{chap/image}
|
||||||
\input{chap/reseau}
|
\input{chap/reseau}
|
||||||
\input{chap/Perl}
|
\input{chap/Perl}
|
||||||
@@ -119,15 +133,16 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
|||||||
|
|
||||||
\input{chap/video}
|
\input{chap/video}
|
||||||
\input{chap/graphisme}
|
\input{chap/graphisme}
|
||||||
|
% \input{chap/dessin} % nouveau 5 septembre 2024
|
||||||
\input{chap/gnuplot}
|
\input{chap/gnuplot}
|
||||||
% \input{chap/print}
|
\input{chap/print}
|
||||||
\input{chap/webcam}
|
\input{chap/webcam}
|
||||||
% \input{chap/SCSI}
|
% \input{chap/SCSI}
|
||||||
\input{chap/X11}
|
\input{chap/X11}
|
||||||
\input{chap/wayland} % nouveau septembre 2023
|
% \input{chap/wayland} % nouveau septembre 2023
|
||||||
\input{chap/Fortran}
|
\input{chap/Fortran}
|
||||||
\input{chap/scripting}
|
\input{chap/scripting}
|
||||||
\input{chap/Arduino}
|
% \input{chap/Arduino}
|
||||||
\input{chap/Basic}
|
\input{chap/Basic}
|
||||||
\input{chap/R} % new octobre 2023
|
\input{chap/R} % new octobre 2023
|
||||||
% \input{chap/GMP}
|
% \input{chap/GMP}
|
||||||
@@ -140,20 +155,20 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
|||||||
% \input{chap/MINITEL}
|
% \input{chap/MINITEL}
|
||||||
% \input{chap/Raspberry}
|
% \input{chap/Raspberry}
|
||||||
% \input{chap/Fedora}
|
% \input{chap/Fedora}
|
||||||
% \input{chap/IPv6}
|
\input{chap/IPv6}
|
||||||
\input{chap/threads}
|
\input{chap/threads}
|
||||||
\input{chap/IPC}
|
\input{chap/IPC}
|
||||||
\input{chap/dosbox}
|
\input{chap/dosbox}
|
||||||
\input{chap/manpages}
|
\input{chap/manpages}
|
||||||
\input{chap/grub}
|
% \input{chap/grub}
|
||||||
\input{chap/photos}
|
\input{chap/photos}
|
||||||
\input{chap/plugins}
|
\input{chap/plugins}
|
||||||
\input{chap/Bonjour}
|
% \input{chap/Bonjour}
|
||||||
\input{chap/ioctl}
|
\input{chap/ioctl}
|
||||||
\input{chap/debug}
|
\input{chap/debug}
|
||||||
% \input{chap/buzybox}
|
% \input{chap/buzybox}
|
||||||
\input{chap/gif89a}
|
\input{chap/gif89a}
|
||||||
\input{chap/IRC}
|
% \input{chap/IRC}
|
||||||
% \input{chap/SCCS} % nouveau 18 mars 2021
|
% \input{chap/SCCS} % nouveau 18 mars 2021
|
||||||
\input{chap/Usenet}
|
\input{chap/Usenet}
|
||||||
\input{chap/DNS}
|
\input{chap/DNS}
|
||||||
@@ -161,15 +176,16 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
|
|||||||
\input{chap/webserver}
|
\input{chap/webserver}
|
||||||
\input{chap/hardware}
|
\input{chap/hardware}
|
||||||
\input{chap/gadgets}
|
\input{chap/gadgets}
|
||||||
\input{chap/sdr}
|
% \input{chap/sdr}
|
||||||
\input{chap/bdd} % nouveau 26 octobre 2022
|
\input{chap/bdd} % nouveau 26 octobre 2022
|
||||||
\input{chap/slang}
|
% \input{chap/slang}
|
||||||
\input{chap/curses}
|
\input{chap/curses}
|
||||||
% \input{chap/openwrt}
|
% \input{chap/openwrt}
|
||||||
\input{chap/WiFi}
|
\input{chap/WiFi}
|
||||||
% \input{chap/GIT}
|
% \input{chap/GIT}
|
||||||
\input{chap/divers}
|
\input{chap/divers}
|
||||||
% \input{chap/peer2peer}
|
% \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.}
|
\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 ?)
|
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.
|
parcouru cet ouvrage, et constaté à quel point il est en friche.
|
||||||
Beaucoup de chapitres sont vraiment incomplets, voire cruellement
|
Beaucoup de chapitres sont vraiment incomplets, voire cruellement
|
||||||
|
|||||||
Reference in New Issue
Block a user