Compare commits
121 Commits
73a611e55f
...
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 | ||
|
|
c09df69af3 | ||
|
|
95c17583f5 | ||
|
|
2a24703136 | ||
|
|
da080e47e3 | ||
|
|
72892afeff | ||
|
|
c3e227f472 | ||
|
|
c6fe2224bf | ||
|
|
42ead5b695 | ||
|
|
ef609cbb57 | ||
|
|
b404dde88b | ||
|
|
9d08631b32 | ||
|
|
db14adeb86 | ||
|
|
bfef02de49 | ||
|
|
a1f8b096e3 | ||
|
|
8ba88d2b8d | ||
|
|
aeeefe061d | ||
|
|
07ae0d5a8a | ||
|
|
97909fdcd4 | ||
|
|
52b7bbe6ef | ||
|
|
28c260ea5e | ||
|
|
0db76fef58 | ||
|
|
aa4f0664cb | ||
|
|
04eeae6de9 | ||
|
|
aa3d078e21 | ||
|
|
6c2d6476b8 | ||
|
|
6546d1d5c0 | ||
|
|
a47c1f6d7a | ||
|
|
43202ab62e | ||
|
|
51395297e7 | ||
|
|
c52abb9fda | ||
|
|
87fb8ed834 | ||
|
|
75a94fc6c7 | ||
|
|
d8369bef0a | ||
|
|
9e8a6b3411 | ||
|
|
5a610e0926 | ||
|
|
14b3ef6c3b | ||
|
|
11d559eade | ||
|
|
cb76c0350f |
19
.gitignore
vendored
19
.gitignore
vendored
@@ -13,22 +13,3 @@ tetatricks.log
|
|||||||
tetatricks.pdf
|
tetatricks.pdf
|
||||||
tetatricks.toc
|
tetatricks.toc
|
||||||
|
|
||||||
code/a.out
|
|
||||||
code/*.o
|
|
||||||
code/foo
|
|
||||||
code/thread-demo
|
|
||||||
code/ex_curses
|
|
||||||
code/hello
|
|
||||||
code/arguments
|
|
||||||
code/no-op
|
|
||||||
code/get-signal
|
|
||||||
code/fifo-tx
|
|
||||||
code/fifo-rx
|
|
||||||
code/send-osc
|
|
||||||
code/listen-osc
|
|
||||||
code/plugiciel.so
|
|
||||||
code/appelant
|
|
||||||
code/flydraw.png
|
|
||||||
code/flydraw.gif
|
|
||||||
code/xform/yesyno
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ Astuces diverses pour utiliser un ordinateur sous Linux...
|
|||||||
|
|
||||||
Un travail à l'évolution (trop) lente.
|
Un travail à l'évolution (trop) lente.
|
||||||
|
|
||||||
|
`pdfbook2 tetatricks.pdf --paper=a4paper --short-edge --no-crop`
|
||||||
|
|||||||
24
chap/Arduino.tex
Normal file
24
chap/Arduino.tex
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
\chapter{Arduino}
|
||||||
|
\label{chap:arduino} \index{Arduino}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
\section{Installation de l'IDE}\index{IDE}
|
||||||
|
|
||||||
|
Elle semble un peu plus \textit{tricky} que celle de son cousin Processing.
|
||||||
|
|
||||||
|
Pour commencer, allez donc chercher le logiciel dans une version adaptée
|
||||||
|
à votre système dans \texttt{http://arduino.cc/}.
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
\section{Hello blinky}
|
||||||
|
|
||||||
|
La première étape est évident : faire clignoter une LED\index{LED}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------------------
|
||||||
|
\section{Beep Beep}
|
||||||
|
|
||||||
|
La seconde étape ne l'est pas moins.
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------------------
|
||||||
166
chap/Basic.tex
Normal file
166
chap/Basic.tex
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
% ----------------------------------------------------------
|
||||||
|
\chapter{Basic}
|
||||||
|
\label{chap:Basic}
|
||||||
|
\index{dosbox}\index{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}
|
||||||
|
|
||||||
|
C'est probablement un des premiers langages interactifs utilisable par le
|
||||||
|
peuple et les gens. Déja, à ce titre, dénonce que ce langage
|
||||||
|
demande un peu de curiosité, il a traversé soixante ans
|
||||||
|
d'informatique, et il existe encore.
|
||||||
|
Mais pour moi, le véritable intérèt
|
||||||
|
est dans la multitude et la diversité des implémentations.
|
||||||
|
Des minis catatoniques des années 60 aux micros-ordinateurs 8 bits,
|
||||||
|
des dizaines de versions souvent incompatibles ont vues le jour.
|
||||||
|
Un nom pour citer un exemple ? « Locomotive », ça ira ?
|
||||||
|
|
||||||
|
Dans un premier temps, je vais les lister sommairement, et
|
||||||
|
ensuite j'aurais une idée sur lesquels seront les plus funs
|
||||||
|
à explorer, voire sauront trouver leur place dans un
|
||||||
|
environnement dédié à la techno-futilité, concept très
|
||||||
|
tendance dans certains milieux.
|
||||||
|
|
||||||
|
Pour en savoir plus : \textsc{Dartmouth Time Sharing System}
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
|
\section{Bywater} \index{bywater}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
The Bywater BASIC Interpreter (bwBASIC) implements a large superset of the
|
||||||
|
ANSI\index{ANSI} Standard for Minimal BASIC (X3.60-1978)
|
||||||
|
and a significant subset of the ANSI Standard for
|
||||||
|
Full BASIC (X3.113-1987) in C.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
Bywater BASIC Interpreter/Shell, version 2.10
|
||||||
|
---------------------------------------------
|
||||||
|
Copyright (c) 1993, Ted A. Campbell
|
||||||
|
for bwBASIC version 2.10, 11 October 1993
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Le mode interactif me semble un peu rustre, mais utilisable à l'ancienne.
|
||||||
|
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
|
||||||
|
renoncé au bout de 30 secondes}, ce qui limite son \textsl{utilisability}.
|
||||||
|
|
||||||
|
Heureusement, on peut utiliser son éditeur de texte favori pour écrire
|
||||||
|
le code source, et le lancer en mode batch. Voici un exemple rudimentaire
|
||||||
|
mais canonique~:
|
||||||
|
|
||||||
|
\lstinputlisting{code/Basic/bywater-1.bas}
|
||||||
|
|
||||||
|
Ce qui nous donne à l'exécution~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Devel/TetaTricks$ bwbasic code/Basic/bywater-1.bas
|
||||||
|
Bywater BASIC Interpreter/Shell, version 2.20 patch level 2
|
||||||
|
Copyright (c) 1993, Ted A. Campbell
|
||||||
|
Copyright (c) 1995-1997, Jon B. Volkoff
|
||||||
|
|
||||||
|
2 4
|
||||||
|
3 9
|
||||||
|
4 16
|
||||||
|
5 25
|
||||||
|
|
||||||
|
tth@redlady:~/Devel/TetaTricks$
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Première conclusion : affaire à suivre.
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
|
\section{Yabasic} \index{yabasic}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
Yabasic implements the most common and simple elements of the BASIC
|
||||||
|
language; it comes with for-loops and goto with while-loops and
|
||||||
|
procedures. yabasic does monochrome line graphics, and printing
|
||||||
|
comes with no extra effort. yabasic runs under Unix and Windows;
|
||||||
|
it is small (less than 200 KB) and free.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
Première innovation, les numéros de ligne ne sont plus obligatoires.
|
||||||
|
|
||||||
|
\lstinputlisting{code/Basic/yabasic-1.bas}
|
||||||
|
|
||||||
|
Et on peut faire des images qui clignotent :)
|
||||||
|
|
||||||
|
\lstinputlisting{code/Basic/yabasic-2.bas}
|
||||||
|
|
||||||
|
C'est vraiment dommage que l'on ne puisse mettre de gif89a\index{gif89a}
|
||||||
|
dans un livre imprimé\dots
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
|
|
||||||
|
\section{sdlBasic} \index{sdlBasic}
|
||||||
|
|
||||||
|
http://www.sdlbasic.altervista.org/main/
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
|
\section{Brandy}
|
||||||
|
|
||||||
|
\index{BBC} \index{Acorn}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
Brandy is an interpreter for BBC BASIC V, the dialect of BASIC that
|
||||||
|
Acorn Computers supplied with their ranges of desktop computers that
|
||||||
|
use the ARM processor such as the Archimedes and Risc PC, and is still
|
||||||
|
in use on these and compatibles.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
https://www.bbcbasic.co.uk/index.html
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
|
|
||||||
|
\section{FreeBASIC} \index{FreeBASIC}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
When used in its "QB" language mode, FreeBASIC provides a high level
|
||||||
|
of support for programs written for QuickBASIC\index{QuickBASIC}.
|
||||||
|
Many programs written for QuickBASIC will compile and run in this mode
|
||||||
|
with no changes needed.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
https://www.freebasic.net/
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
|
|
||||||
|
\section{BASIC-256} \index{BASIC-256}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
BASIC-256 is an easy to use version of BASIC designed to teach anybody
|
||||||
|
(especially middle and high-school students) the basics of computer
|
||||||
|
programming.
|
||||||
|
It uses traditional control structures like gosub, for/next, and goto,
|
||||||
|
which helps kids easily see how program flow-control works.
|
||||||
|
It has a built-in graphics mode which lets them draw pictures
|
||||||
|
on screen in minutes, and a set of detailed, easy-to-follow tutorials
|
||||||
|
that introduce programming concepts through fun exercises.
|
||||||
|
\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 ?}
|
||||||
|
|
||||||
|
L'interpréteur \texttt{Qbasic} de Microsoft fonctionne très bien
|
||||||
|
dans Dosbox~: à lire en page \pageref{Qbasic}. Son prédécesseur,
|
||||||
|
\texttt{GWBASIC} marche très bien aussi.
|
||||||
|
|
||||||
|
% ====================================================================
|
||||||
396
chap/C.tex
396
chap/C.tex
@@ -11,31 +11,36 @@ les erreurs classiques. La futilité des exemples est assumée.
|
|||||||
|
|
||||||
Les détails nécessaires seront présentés dans la suite.
|
Les détails nécessaires seront présentés dans la suite.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Hello World}
|
\section{Hello World}
|
||||||
|
|
||||||
Hop, on y va...
|
Hop, on y va...
|
||||||
|
|
||||||
Le tout début d'un programme en C est l'appel par
|
Le tout début de la vie d'un programme écrit en C est l'appel par
|
||||||
le \textsl{runtime} d'une fonction
|
le \textsl{runtime}\footnote{\texttt{crt0.s}} d'une fonction
|
||||||
nommée \texttt{main} qui reçoit deux paramètres
|
nommée \texttt{main} qui recevra deux paramètres\footnote{%
|
||||||
|
En fait trois, mais restons simple.}
|
||||||
dont l'utilisation est décrite un peu plus bas.
|
dont l'utilisation est décrite un peu plus bas.
|
||||||
Ces paramètres sont fournis par le système d'exploitation.
|
Ces paramètres sont fournis par des mécanismes planquées
|
||||||
|
dans la soute du système d'exploitation, et n'ont pas
|
||||||
|
d'importance pour le moment..
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/hello.c}
|
\lstinputlisting[language=c]{code/C/hello.c}
|
||||||
|
|
||||||
Un fois passé l'entrée, nous somme dans la partie active.
|
Un fois passé l'entrée, nous sommes dans la partie active.
|
||||||
Nous appelons à ce moment la fonction \texttt{printf}
|
Nous appelons à ce moment une fonction de la bibliothèque
|
||||||
|
standard : \texttt{puts}
|
||||||
qui a pour but d'afficher sur l'écran le texte
|
qui a pour but d'afficher sur l'écran le texte
|
||||||
passé en paramètre.
|
passé en paramètre.
|
||||||
|
|
||||||
Voila, c'est fait. Nous savons dire bonjour au monde.
|
Voila, c'est fait. Dans les règles de l'art.
|
||||||
Point suivant~: dire boujour à quelqu'un d'autre. Et pour
|
Nous savons dire « bonjour » au monde.
|
||||||
|
Point suivant~: dire bonjour à quelqu'un d'autre. Et pour
|
||||||
cela il nous fait récupérer un argument depuis la ligne
|
cela il nous fait récupérer un argument depuis la ligne
|
||||||
de commande.
|
de commande.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Arguments}
|
\section{Arguments}
|
||||||
|
|
||||||
@@ -48,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}
|
||||||
|
|
||||||
@@ -70,7 +75,16 @@ 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}
|
||||||
|
|
||||||
En gros, une variable du C est une zone de mémoire destinée
|
En gros, une variable du C est une zone de mémoire destinée
|
||||||
@@ -88,20 +102,32 @@ que l'on peut stocker dans une variable.
|
|||||||
|
|
||||||
\textbf{La portée} :
|
\textbf{La portée} :
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
\section{Les fonctions}
|
\section{Les fonctions}
|
||||||
|
|
||||||
Nous avons vu brièvement dans la première section de ce chapitre
|
Nous avons vu brièvement dans la première section de ce chapitre
|
||||||
la fonction \texttt{main} et ses deux paramètres.
|
la fonction \texttt{main} et ses deux paramètres.
|
||||||
Il est temps de préciser les détails.
|
Il est temps de préciser les détails.
|
||||||
|
Une fonction a un unique point d'entrée\footnote{Qui a déja joué
|
||||||
|
avec le ENTRY du Fortran ?}, avec une éventuelle liste
|
||||||
|
de paramètres,
|
||||||
|
et une tout aussi éventuelle unique valeur de retour.
|
||||||
|
|
||||||
XXX\index{XXX}
|
XXX\index{XXX}
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Entrées / Sorties}
|
\section{Entrées / Sorties}
|
||||||
\index{stdin} \index{stdout} \index{stderr}
|
\index{stdin} \index{stdout} \index{stderr}
|
||||||
|
|
||||||
|
Il est évident qu'un logiciel qui n'a aucun moyen de communiquer
|
||||||
|
avec le monde extérieur a bien moins d'utilité qu'un bon ed.
|
||||||
|
Dans le schéma «~classique~» d'une utilisation interactive,
|
||||||
|
ces échanges ont lieu par
|
||||||
|
le truchement d'un terminal, qui peut tout aussi bien
|
||||||
|
être une \textsl{real glasstty} ou une fenêtre d'un émulateur
|
||||||
|
graphique de terminal, comme \texttt{xterm}.
|
||||||
|
|
||||||
\subsection{Les trois flux canoniques}
|
\subsection{Les trois flux canoniques}
|
||||||
|
|
||||||
\texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots
|
\texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots
|
||||||
@@ -145,9 +171,12 @@ un peu plus loin.
|
|||||||
\subsection{Écrire : \texttt{printf}}
|
\subsection{Écrire : \texttt{printf}}
|
||||||
\index{printf}
|
\index{printf}
|
||||||
|
|
||||||
La fonction \texttt{printf} permet d'afficher le contenu d'une
|
La fonction \texttt{printf} permet d'afficher sur la sortie
|
||||||
(ou plusieurs)
|
standard le contenu d'une (ou plusieurs)
|
||||||
variable sous divers formats contrôlables par un petit DSL.
|
variable sous diverses présentations,
|
||||||
|
qui sont contrôlables par un tout petit
|
||||||
|
DSL\footnote{\textsl{domain specific language}}\index{DSL}~:
|
||||||
|
la chaine de format.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int bar, foo = 42;
|
int bar, foo = 42;
|
||||||
@@ -160,17 +189,18 @@ la fonction '\texttt{printf}' avec les paramêtres appropriés et
|
|||||||
conserve la valeur de retour de celle-ci.
|
conserve la valeur de retour de celle-ci.
|
||||||
|
|
||||||
Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"},
|
Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"},
|
||||||
est appelé \emph{chaine de format}. C'est une chaine de caractères
|
est appelé \emph{chaine de format}. C'est une chaine de caractères,
|
||||||
que l'on peut classer en trois catégories~:
|
que l'on peut classer en trois catégories~:
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize} % ------------
|
||||||
|
|
||||||
\item{\textsl{caractères crus} : ils sont directements poussés vers
|
\item{\textsl{caractères crus} : ils sont directements poussés vers
|
||||||
la sortie. La plupart d'entre eux donnent le résultat attendu.}
|
la sortie. La plupart d'entre eux donnent le résultat attendu.}
|
||||||
|
|
||||||
\item{\textsl{codes de format} : les fragments qui commencent par le
|
\item{\textsl{codes de format} : les fragments qui commencent par le
|
||||||
caractère '\%'. Ils servent à contrôler l'apparence de ce qui va
|
caractère '\%'. Ils servent à contrôler l'apparence de ce qui va
|
||||||
suivre. Par exemple \texttt{\%x} va afficher un int en hexadécimal}
|
suivre.
|
||||||
|
Par exemple \texttt{\%x} va afficher un \texttt{int} en hexadécimal}.
|
||||||
|
|
||||||
\item{\textsl{échappements} : les caractères précédés d'un
|
\item{\textsl{échappements} : les caractères précédés d'un
|
||||||
'\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8}
|
'\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8}
|
||||||
@@ -180,14 +210,14 @@ Par exemple, \texttt{'\textbackslash{}n'} va générer le caractère
|
|||||||
\textsl{newline} qui marque la fin d'une ligne de texte.
|
\textsl{newline} qui marque la fin d'une ligne de texte.
|
||||||
}
|
}
|
||||||
|
|
||||||
\end{itemize}
|
\end{itemize} % ------------
|
||||||
|
|
||||||
Quand à la valeur de retour, elle contient le nombre de caractères
|
Quand à la valeur de retour, elle contient le nombre de caractères
|
||||||
efectivement écrits. Ce nombre peut être différent du nombre attendu,
|
effectivement écrits. Ce nombre peut être différent du nombre attendu
|
||||||
par exemple si le disque est saturé.
|
en cas d'erreur, par exemple si le disque est saturé.
|
||||||
|
|
||||||
Ce nombre peut être utilisé pour un affichage de multiples données
|
Ce nombre, que beaucoup de gens négligent, peut être utilisé pour un
|
||||||
en limitant la taille des lignes.
|
affichage de multiples données en limitant la longueur des lignes~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int foo, nbre = 0;
|
int foo, nbre = 0;
|
||||||
@@ -199,15 +229,110 @@ for (foo=0; foo<1000; foo++) {
|
|||||||
}
|
}
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------
|
||||||
|
%
|
||||||
|
% voir aussi ~/code/network/README.md
|
||||||
|
%
|
||||||
|
\subsection{Lire : \texttt{fgets}}
|
||||||
|
\index{fgets}
|
||||||
|
|
||||||
|
Cette fonction a pour but de lire une ligne de texte depuis
|
||||||
|
une entrée (stdin, fichier, socket\index{socket}...)
|
||||||
|
et de la ranger en mémoire.
|
||||||
|
Mais commençons par lire la documentation\index{RTFM} de cette fonction,
|
||||||
|
en nous concentrant sur ces deux passages, avant de passer à
|
||||||
|
un exemple\footnote{encore en phase de méditation}.
|
||||||
|
|
||||||
|
Voici deux extraits de ce que nous affirme la page du manuel~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
DESCRIPTION
|
||||||
|
fgets() reads in at most one less than size characters from stream and
|
||||||
|
stores them into the buffer pointed to by s. Reading stops after an
|
||||||
|
EOF or a newline. If a newline is read, it is stored into the buffer.
|
||||||
|
A terminating null byte ('\0') is stored after the last character in
|
||||||
|
the buffer.
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
fgets() returns s on success, and NULL on error or when end of file oc‐
|
||||||
|
curs while no characters have been read.
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Prenez le temps d'y réfléchir, et essayons un cas simple d'utilisation
|
||||||
|
pour examiner le comportement de cette fonction. Nous allons
|
||||||
|
boucler sur la lecture d'une ligne depuis l'entrée standard dans
|
||||||
|
un buffer d'une taille fixée, puis afficher le nombre de caractères
|
||||||
|
que nous avons reçus.
|
||||||
|
|
||||||
|
\lstinputlisting[language=c]{code/C/fgets-simple.c}
|
||||||
|
|
||||||
|
|
||||||
|
% ---------------------------------------------------------
|
||||||
|
%
|
||||||
|
%
|
||||||
|
|
||||||
\subsection{Lire : \texttt{scanf}}
|
\subsection{Lire : \texttt{scanf}}
|
||||||
\index{scanf}
|
\index{scanf}
|
||||||
|
|
||||||
Avez-vous bien révisé la section qui cause des pointeurs ?
|
Avez-vous bien révisé la section qui cause des pointeurs ?
|
||||||
Êtes-vous prèt à d'étranges comportements ?
|
Êtes-vous prèt à d'étranges comportements ?
|
||||||
Alors les subtilités de scanf vont vous plaire.
|
À ne plus savoir où peut être la tête de lecture ?
|
||||||
|
Alors les subtilités de \texttt{scanf} vont vous plaire.
|
||||||
|
|
||||||
|
Nous allons commencer par un exemple simple~: la lecture
|
||||||
|
de deux nombres entiers depuis l'entrée standard.
|
||||||
|
Les valeurs lues seront stockée dans deux variables
|
||||||
|
de type \texttt{int}.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
#include <stdio.h>
|
||||||
|
...
|
||||||
|
int foo, bar, nbread;
|
||||||
|
nbread = scanf("%d %d", &foo, &bar);
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Le premier argument est une chaine de caractères contenant
|
||||||
|
des directives de conversion, semblables à celles
|
||||||
|
du printf.
|
||||||
|
Dans cette exemple, nous avons deux fois \texttt{"\%d"}
|
||||||
|
séparées par une espace. Cette directive veut dire
|
||||||
|
« lire les chiffres qui arrivent et les convertir
|
||||||
|
en nombre entier quand il n'y en a plus », une
|
||||||
|
simple règle de conversion.
|
||||||
|
|
||||||
|
Les deux arguments suivants sont les adresses des deux variables
|
||||||
|
destinées à recevoir les valeurs lues,
|
||||||
|
ou, en langage commun « faut mettre ÇA LÀ ».
|
||||||
|
Ce sont donc des pointeurs, on les reconnait au
|
||||||
|
caractère \& qui précède leur nom.
|
||||||
|
|
||||||
|
Quand à la valeur retournée par la fonction scanf, elle
|
||||||
|
présente un grand intérêt car elle contient le nombre
|
||||||
|
de lectures élémentaires qui se sont bien passées.
|
||||||
|
Tous les cas d'erreur ne sont pas couvert, mais c'est
|
||||||
|
suffisant pour traiter les cas simples de la discipline.
|
||||||
|
|
||||||
|
Donc, en toute rigueur, le code que nous venons de voir
|
||||||
|
devrait s'écrire, en utilisant comme il se doit
|
||||||
|
le \textsl{yoda coding} pour le test de cette valeur
|
||||||
|
de retour~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
...
|
||||||
|
int foo, bard;
|
||||||
|
if (2 != scanf("%d %d", &foo, &bar)) {
|
||||||
|
fputs("FAIL\n", stderr)
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
...
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
\textit{To be continued...}
|
\textit{To be continued...}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
\subsection{Les fichiers}\index{fopen}\index{fclose}
|
\subsection{Les fichiers}\index{fopen}\index{fclose}
|
||||||
|
|
||||||
Lire et écrire depuis les flux gérés par le système, c'est bien, mais
|
Lire et écrire depuis les flux gérés par le système, c'est bien, mais
|
||||||
@@ -244,20 +369,19 @@ par \texttt{fopen}~:
|
|||||||
int fprintf(FILE *stream, const char *format, ...);
|
int fprintf(FILE *stream, const char *format, ...);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
% =========================================================
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
\section{Quelques filtres Unix}\label{filtre-unix}
|
||||||
|
|
||||||
\section{Un filtre 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,
|
||||||
comme d'habitude, est un exemple. Il est un peu artificiel,
|
comme d'habitude, est un exemple. Il est un peu artificiel,
|
||||||
il s'agit d'éliminer les lettres \textsc{o} et \textsc{p}.
|
car il s'agit d'éliminer les lettres \textsc{o} et \textsc{p},
|
||||||
Le voici~:
|
sans raison valable. Le voici~:
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/no-op.c}
|
\lstinputlisting[language=c]{code/C/no-op.c}
|
||||||
|
|
||||||
Démonstration~:
|
Démonstration immédiate~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
$ echo apopoz | ./no-op
|
$ echo apopoz | ./no-op
|
||||||
@@ -271,23 +395,41 @@ $ ./no-op < no-op.c | head -5
|
|||||||
$
|
$
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
Vous voulez un autre exemple ? En voici un, parfois utile pour des
|
||||||
|
simulations de terminal de \textsl{tipiak}\footnote{Le texte vert ou
|
||||||
|
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
|
||||||
|
en série Z.
|
||||||
|
|
||||||
|
\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)}.
|
||||||
|
|
||||||
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
|
||||||
page \pageref{pipeline}.
|
page \pageref{pipeline}.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Les pointeurs}\label{pointeur}\index{pointeur}
|
\section{Les pointeurs}\label{pointeur}\index{pointeur}
|
||||||
|
|
||||||
\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}
|
||||||
@@ -297,11 +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}
|
||||||
|
|
||||||
|
\index{XXX}
|
||||||
|
XXX il y a encore beaucoup à dire, et de quoi bien rire \textsl{:)}
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% https://hackthedeveloper.com/function-pointer-in-c/
|
||||||
|
|
||||||
|
\subsection{Pointeurs et chaines}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
char *text = "this is a text";
|
||||||
|
char text[] = "this is a text";
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Vous le voyez, le piège ?
|
||||||
|
|
||||||
|
\subsection{Pointeurs et fonctions}
|
||||||
|
|
||||||
|
Exemple classique : qsort.
|
||||||
|
|
||||||
|
% =========================================================
|
||||||
|
|
||||||
\section{Le préprocesseur}\index{cpp}
|
\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{\#}.
|
||||||
@@ -328,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
|
||||||
@@ -353,10 +518,10 @@ pris en compte.
|
|||||||
Une chose très fourbe dont voici un exemple ?
|
Une chose très fourbe dont voici un exemple ?
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
#define pixidx(fi,x,y) (((y)*fi->width)+(x))
|
#define pixidx (fi,x,y) (((y)*fi->width)+(x))
|
||||||
#define getRpix(fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ])
|
#define getRpix (fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ])
|
||||||
#define getGpix(fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ])
|
#define getGpix (fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ])
|
||||||
#define getBpix(fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ])
|
#define getBpix (fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ])
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Finalemant, ça n'est pas si compliqué que ça.
|
Finalemant, ça n'est pas si compliqué que ça.
|
||||||
@@ -378,18 +543,22 @@ seront ensuite \textbf{liés} pour obtenir l'exécutable final.
|
|||||||
|
|
||||||
Mais découper un gros logiciel en plusieurs fichiers source
|
Mais découper un gros logiciel en plusieurs fichiers source
|
||||||
a d'autres avantages.
|
a d'autres avantages.
|
||||||
|
Bien maitrisé, c'est une technique assez sereine.
|
||||||
|
Elle permet d'isoler des données spécifiques qu'il serait
|
||||||
|
bien plus lourd et périlleux d'utiliser d'une autre façon.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Les structures}
|
\section{Les structures}
|
||||||
|
|
||||||
Une structure est une sorte de boite dans laquelle on peut
|
Une structure est une sorte de boite dans laquelle on peut
|
||||||
ranger plusieurs variables afin de les manipuler comme
|
ranger plusieurs variables afin de les manipuler comme
|
||||||
une seule entité.
|
une seule entité. Les utilisateurs de 80 colonnes voient
|
||||||
|
tout de suite de quoi il s'agit.
|
||||||
|
|
||||||
XXX
|
XXX trouver un exemple parlant et décalé\dots
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Gestion de la mémoire}
|
\section{Gestion de la mémoire}
|
||||||
\index{malloc} \index{free}
|
\index{malloc} \index{free}
|
||||||
@@ -399,9 +568,9 @@ avec les variables locales. Il est temps de passer à une gestion
|
|||||||
explicite de celle-ci~:
|
explicite de celle-ci~:
|
||||||
les fonctions \texttt{malloc} et \texttt{free} sont là pour ça.
|
les fonctions \texttt{malloc} et \texttt{free} sont là pour ça.
|
||||||
|
|
||||||
La première demande au mc/p de nous préter une certaine quantité
|
La première fonction demande au mc/p de nous préter une certaine quantité
|
||||||
de mémoire, que nous pourront utiliser à notre guise.
|
de mémoire, que nous pourront utiliser à notre guise.
|
||||||
Et la seconde restitue la zone mémoire au système sous-jacent.
|
Et la seconde restitue cette zone mémoire au système sous-jacent.
|
||||||
|
|
||||||
Un rapide synopsis minimal d'utilisation~:
|
Un rapide synopsis minimal d'utilisation~:
|
||||||
|
|
||||||
@@ -442,7 +611,7 @@ Et finalement, nous avons réussi à générer un \textsl{useless number}.
|
|||||||
Notre mission est terminée, nous rendons notre bloc de mémoire
|
Notre mission est terminée, nous rendons notre bloc de mémoire
|
||||||
au mc/p avec \texttt{free(ptr);}.
|
au mc/p avec \texttt{free(ptr);}.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
|
||||||
\section{Gérer les options}\index{getopt}\label{getopt}
|
\section{Gérer les options}\index{getopt}\label{getopt}
|
||||||
|
|
||||||
@@ -456,10 +625,81 @@ extern int optind, opterr, optopt;
|
|||||||
La page de man de getopt(3) contient des explications détaillées
|
La page de man de getopt(3) contient des explications détaillées
|
||||||
et un exemple simple d'utilisation.
|
et un exemple simple d'utilisation.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% =========================================================
|
||||||
|
% Sun Sep 3 05:48:37 UTC 2023
|
||||||
|
%
|
||||||
|
%
|
||||||
|
\section{Analyser une ligne de texte} \index{parser}
|
||||||
|
|
||||||
|
Nous désirons implémenter une interface en ligne de commande
|
||||||
|
(aka CLI\index{cli}) pour un enchainement simple d'intructions
|
||||||
|
assez semblables. On peut aussi voir ça comme la création
|
||||||
|
d'un \textsl{domain specific language} (aka DSL\index{DSL}).
|
||||||
|
|
||||||
|
Pour être cohérent avec le shell, nous allons utiliser la
|
||||||
|
même méthode de séparation des mots sur la ligne à
|
||||||
|
décomposer~:
|
||||||
|
utiliser une liste pré-définie de séparateur de champs,
|
||||||
|
comme le \$IFS du shell.
|
||||||
|
|
||||||
|
Pour simplifier l'exemple, toutes les commandes susceptibles d'être
|
||||||
|
tapées
|
||||||
|
seront structurées de la même manière.
|
||||||
|
|
||||||
|
\subsection{la fonction \texttt{strtok}} \index{strtok}
|
||||||
|
|
||||||
|
Cette fonction nous permet de « découper » notre ligne de commande
|
||||||
|
en \textsl{tokens} par un ensemble de
|
||||||
|
caractères de séparation appelé \texttt{delim} dans cet extrait
|
||||||
|
du man\index{man}.
|
||||||
|
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
#include <string.h>
|
||||||
|
char *strtok(char *str, const char *delim);
|
||||||
|
|
||||||
|
The strtok() function breaks a string into a sequence of zero or more
|
||||||
|
nonempty tokens. On the first call to strtok(), the string to be
|
||||||
|
parsed should be specified in str. In each subsequent call that should
|
||||||
|
parse the same string, str must be NULL.
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Concrètement, nous allons utiliser deux séparateurs très classiques,
|
||||||
|
l'espace et la tabulation \texttt{ delim = "\symbol{92}t ";}.
|
||||||
|
on peut ensuite aller regarder dans la mémoire ce qui s'y passe~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
--- chaine d'origine
|
||||||
|
66 6f 6f 20 20 20 62 61 72 09 71 75 75 78 20 77 69 7a 00
|
||||||
|
f o o b a r q u u x w i z
|
||||||
|
--- 1er strtok
|
||||||
|
66 6f 6f \0 20 20 62 61 72 09 71 75 75 78 20 77 69 7a 00
|
||||||
|
f o o b a r q u u x w i z
|
||||||
|
got [foo]
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Donc, \texttt{strtok} a détecté le premier caractère de séparation,
|
||||||
|
ici un espace, qui est juste après le premier mot de la ligne à analyser,
|
||||||
|
et l'a remplacé par un '\symbol{92}0', le marqueur de fin de chaine.
|
||||||
|
Le premier mot (foo) a bien été isolé.
|
||||||
|
|
||||||
|
on peut constater que la chaine de départ est modifiée, ce qui
|
||||||
|
risque de causer des soucis, mais on en parlera plus tard.
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Le programme complet}
|
||||||
|
|
||||||
|
\lstinputlisting[language=c]{code/C/demo-strtok.c}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% =========================================================
|
||||||
|
|
||||||
\section{Erreurs classiques}
|
\section{Erreurs classiques}
|
||||||
|
|
||||||
|
Le C est un langage parsemé de fosses, de chausse-trapes et de
|
||||||
|
pièges fourbes et sournois. Sans parler des UBs, hein\dots
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item{Variables non initialisées.}
|
\item{Variables non initialisées.}
|
||||||
|
|
||||||
@@ -478,6 +718,8 @@ et un exemple simple d'utilisation.
|
|||||||
|
|
||||||
XXX \index{XXX}
|
XXX \index{XXX}
|
||||||
|
|
||||||
|
Un ordinateur est déterministe.
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
\section{Debug} \index{Debug}
|
\section{Debug} \index{Debug}
|
||||||
@@ -508,11 +750,14 @@ any strictly conforming program in which the use of the features
|
|||||||
specified in the header <string.h> , except the following functions:
|
specified in the header <string.h> , except the following functions:
|
||||||
strdup , strndup , strcoll , strxfrm , strerror ." (4p6)
|
strdup , strndup , strcoll , strxfrm , strerror ." (4p6)
|
||||||
|
|
||||||
|
https://devblogs.microsoft.com/oldnewthing/20230109-00/?p=107685
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
\section{Dessiner}
|
\section{Dessiner}
|
||||||
|
|
||||||
|
% XXX insert blabla here
|
||||||
|
|
||||||
\subsection{G2} \index{g2} \label{g2}
|
\subsection{G2} \index{g2} \label{g2}
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
@@ -524,6 +769,50 @@ types of devices.
|
|||||||
|
|
||||||
\lstinputlisting[language=c]{code/g2/un_dessin.c}
|
\lstinputlisting[language=c]{code/g2/un_dessin.c}
|
||||||
|
|
||||||
|
%
|
||||||
|
% 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.
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
@@ -534,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}
|
||||||
|
|||||||
334
chap/Fortran.tex
334
chap/Fortran.tex
@@ -1,28 +1,48 @@
|
|||||||
\chapter{Fortran} \label{chap:Fortran} \index{Fortran}
|
\chapter{Fortran} \label{chap:Fortran} \index{Fortran}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
Fortran (\textsc{FORmula TRANslator}) est, avec le Cobol\index{Cobol},
|
Fortran (\textsc{FORmula TRANslator}) est, avec le Cobol\index{Cobol},
|
||||||
un des premiers langages évolués. Il a été conçu après la seconde
|
un des premiers langages évolués. Il a été conçu après la seconde
|
||||||
guerre mondiale, en 1954, par
|
guerre mondiale, en 1954, par
|
||||||
John Warner Backus, ingénieur en radiophonie chez IBM\index{IBM},
|
John Warner Backus, ingénieur en radiophonie chez IBM\index{IBM},
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
Pourquoi j'ai redécouvert un langage de ma jeunesse, et pourquoi
|
||||||
|
vous devriez vous aussi y jeter un regard attentif. Il y a plein
|
||||||
|
de bonnes choses, la septième va vous tenir compagnie.
|
||||||
|
|
||||||
% ========================================
|
% ========================================
|
||||||
|
|
||||||
\section{F77}
|
%
|
||||||
|
% un petit historique ?
|
||||||
|
%
|
||||||
|
\section{On the big irons}
|
||||||
|
|
||||||
|
TODO\index{XXX}
|
||||||
|
|
||||||
|
\section{FORTRAN77}
|
||||||
|
|
||||||
Dernière version à exiger le format '80 colonnes' des cartes perforées,
|
Dernière version à exiger le format '80 colonnes' des cartes perforées,
|
||||||
cette version est aussi (aux yeux de vieux dinos) la plus pure,
|
cette version est aussi (aux yeux de vieux dinos) la plus pure,
|
||||||
à cause d'instructions comme le \textsl{computed goto} ou le
|
à cause d'instructions comme le \textsl{computed goto} ou le
|
||||||
mythique \textsl{comefrom}. Nom officiel : \texttt{ANSI X3.9-1978}.
|
mythique \textsl{comefrom}\footnote{Keyword: Datamatic}.
|
||||||
|
Nom officiel : \texttt{ANSI X3.9-1978}.
|
||||||
|
|
||||||
|
L'incarnation \texttt{g77}\index{g77} n'existe plus, meis peut être
|
||||||
|
à-priori émulable en jouant avec les options de \texttt{gfortran}
|
||||||
|
et un brin de shell.
|
||||||
|
|
||||||
% ============****************===============
|
% ============****************===============
|
||||||
|
|
||||||
% https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran
|
% https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran
|
||||||
|
% https://en.wikipedia.org/wiki/Fortran_95_language_features
|
||||||
|
|
||||||
\section{Gfortan} \index{gfortran}
|
\section{Gfortan} \index{gfortran}
|
||||||
|
|
||||||
Puis ce langage du passé a subi une évolution lente vers quelque
|
Puis ce langage du passé a subi une évolution lente vers quelque
|
||||||
chose de bien plus moderne : le Fortran 90.
|
chose de bien plus moderne : le Fortran 90.
|
||||||
Les dinos vont devoir s'adapter. Et utiliser \texttt{gfortran},
|
Les dinos vont devoir s'adapter.
|
||||||
|
Et songer à utiliser un \texttt{gfortran} moderne,
|
||||||
un élément de la Gnu Compiler Collection\index{gcc}.
|
un élément de la Gnu Compiler Collection\index{gcc}.
|
||||||
|
|
||||||
Comme pour tous les langages de programmation,
|
Comme pour tous les langages de programmation,
|
||||||
@@ -31,7 +51,7 @@ Il faut l'enregister dans un fichier nommé \texttt{hello.f90}
|
|||||||
pour que le compilateur puisse admettre que c'est écrit
|
pour que le compilateur puisse admettre que c'est écrit
|
||||||
en \textsl{free form format}.
|
en \textsl{free form format}.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{lstlisting}
|
||||||
$ cat hello.f90
|
$ cat hello.f90
|
||||||
program hello
|
program hello
|
||||||
implicit none
|
implicit none
|
||||||
@@ -40,7 +60,7 @@ end
|
|||||||
$ gfortran -Wall hello.f90 -o hello && ./hello
|
$ gfortran -Wall hello.f90 -o hello && ./hello
|
||||||
hello world
|
hello world
|
||||||
$
|
$
|
||||||
\end{verbatim}
|
\end{lstlisting}
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
%
|
%
|
||||||
@@ -48,12 +68,13 @@ $
|
|||||||
%
|
%
|
||||||
\section{Args \& Env}
|
\section{Args \& Env}
|
||||||
|
|
||||||
Un fort beau programme, mais il est un peu fermé au monde extérieur.
|
Un fort beau programme que ce \textsc{helloworld}, mais il est un peu
|
||||||
|
fermé au monde extérieur.
|
||||||
Quand on lance un programme, il peut recevoir des instructions
|
Quand on lance un programme, il peut recevoir des instructions
|
||||||
par (mais pas que) deux canaux : les arguments de la ligne de commande
|
par (mais pas que) deux canaux : les arguments de la ligne de commande
|
||||||
et les variables d'environnement.
|
et les variables d'environnement.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{lstlisting}
|
||||||
program rum_me
|
program rum_me
|
||||||
implicit none
|
implicit none
|
||||||
integer :: nbarg, foo
|
integer :: nbarg, foo
|
||||||
@@ -67,17 +88,18 @@ program rum_me
|
|||||||
enddo
|
enddo
|
||||||
endif
|
endif
|
||||||
end
|
end
|
||||||
\end{verbatim}
|
\end{lstlisting}
|
||||||
|
|
||||||
Si un des arguments doir être vu comme une valeur numérique,
|
Si un des arguments doir être vu comme une valeur numérique,
|
||||||
il faut la convertir avant usage. Exemple pour un nombre
|
il faut convertir la chaine de caractères avant usage.
|
||||||
flottant~:
|
Exemple pour un nombre flottant~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{lstlisting}
|
||||||
character(len=89) :: arg
|
character(len=89) :: arg
|
||||||
real :: cx
|
real :: cx
|
||||||
call getarg(2, string) ; read (string, *) cx
|
call getarg(2, string)
|
||||||
\end{verbatim}
|
read (string, *) cx
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@@ -86,21 +108,131 @@ flottant~:
|
|||||||
Rank, Size, \textsc{allocatable}, toussa\dots
|
Rank, Size, \textsc{allocatable}, toussa\dots
|
||||||
|
|
||||||
Amies du C, soyez d'entrée prévenues, en Fortran, l'indice
|
Amies du C, soyez d'entrée prévenues, en Fortran, l'indice
|
||||||
par défaut du premier élément d'un tablesu est \textbf{1},
|
par défaut du premier élément d'un tableau est \textbf{1},
|
||||||
mais cette valeur peut être modifiée à la déclaration
|
mais cette valeur peut être modifiée à la déclaration
|
||||||
du tableau.
|
du tableau. Ce qui permet des \textsl{of-by-anynumber}
|
||||||
|
du plus bel effet.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
% new 29 decembre 2022
|
||||||
|
|
||||||
|
\section{Nombres complexes}
|
||||||
|
|
||||||
|
Partie imaginaire : \texttt{ipart = aimag(cmplx)}.
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
% nouveau 4 mars 2023
|
||||||
|
|
||||||
|
\section {Les structures}\index{type}
|
||||||
|
|
||||||
|
Une « structure », c'est comme une petite boite dans laquelle on peut
|
||||||
|
mettre des variables de différentes natures.
|
||||||
|
Les accès à chacune de ces variables sont idépendants les uns des autres.
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
type t_pixrgb
|
||||||
|
integer :: r, g, b
|
||||||
|
integer :: alpha = 0
|
||||||
|
end type
|
||||||
|
|
||||||
|
t_pixrgb :: pixel
|
||||||
|
pixel%r = 0x55
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Nous verrons plus loin l'importance de cette notion.
|
||||||
|
|
||||||
|
% ========================================
|
||||||
|
|
||||||
\section{Fichiers}
|
\section{Fichiers}
|
||||||
|
|
||||||
Pour qui vient du C et de la philosophie Unix, la gestion
|
Pour qui vient du C et de la philosophie Unix, la gestion
|
||||||
des fichiers en Fortran est assez déroutante%
|
des fichiers en Fortran est assez déroutante%
|
||||||
\footnote{Par contre, pour un dino des \textsl{big irons}\dots}.
|
\footnote{Par contre, pour un dino des \textsl{big irons}\dots}.
|
||||||
Il semble qu'il y ait deux concepts orthogonaux.
|
Il semble qu'il y ait deux concepts orthogonaux :
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item Direct access \textit{vs.} Sequential access
|
||||||
|
\item Formtated \textit{vs.} Unformated
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
\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}
|
||||||
|
|
||||||
|
XXX\index{XXX}
|
||||||
|
|
||||||
|
Pour faire simple, on accède à chaque unité de donnée l'une après l'autre,
|
||||||
|
comme quand on déroule une bande 6250bpi. Ces unités peuvent être
|
||||||
|
(restons simple pour commencer) des lignes entières de texte.
|
||||||
|
Dans l'ancien temps\footnote{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}
|
||||||
|
|
||||||
|
XXX\index{XXX}
|
||||||
|
|
||||||
|
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}
|
||||||
|
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
\section{Modules}
|
\section{Modules}
|
||||||
@@ -110,12 +242,51 @@ au-delà de 104 lignes. Oui, j'avoue, j'ai bien changé depuis
|
|||||||
l'époque où je confectionnait des procédures \textsl{monobloc}
|
l'époque où je confectionnait des procédures \textsl{monobloc}
|
||||||
de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans.
|
de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans.
|
||||||
|
|
||||||
|
Il serait bon de voir un exemple du monde réel. Ou juste un
|
||||||
|
exemple basique. Mais avec des explications. Parce que ce n'est pas
|
||||||
|
vraiment évident. Mais c'est un concept balaize.
|
||||||
|
|
||||||
|
Nous allons donc créer un module qui ne fait quasiment rien, ce qui
|
||||||
|
limitera le nombre de pannes possibles dans la suite des opérations.
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
module dummy
|
||||||
|
implicit none
|
||||||
|
contains
|
||||||
|
subroutine print_dummy
|
||||||
|
print *, 'this is the dummy subroutine'
|
||||||
|
end subroutine
|
||||||
|
end module
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Rien de bien compliqué~:
|
||||||
|
Un module peut être vu comme une boite qui contient (\texttt{contains})
|
||||||
|
des procédures (\texttt{function} ou \texttt{subroutine}),
|
||||||
|
et qui sera utilisé avec ce genre de petit programme~:
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
program t
|
||||||
|
use dummy
|
||||||
|
implicit none
|
||||||
|
print *, '=== programme de test ==='
|
||||||
|
call print_dummy
|
||||||
|
end program
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
La première ligne, \texttt{use dummy}, permet d'accéder aux fonctions disponibles
|
||||||
|
dans le module dummy.
|
||||||
|
Elle doit être suivie d'un \texttt{implicit none}, pour une raison à éclaircir.
|
||||||
|
Et ensuite nous pouvons appeler notre procédure.
|
||||||
|
|
||||||
|
Mais les modules permettent de faire bien d'autre choses.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
\section{Random et Aléa}
|
\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{verbatim}
|
\begin{lstlisting}
|
||||||
integer, dimension(3) :: tarray
|
integer, dimension(3) :: tarray
|
||||||
integer :: t3
|
integer :: t3
|
||||||
real :: dummy
|
real :: dummy
|
||||||
@@ -126,7 +297,23 @@ La dernière ligne va vous étonner.
|
|||||||
! after initializing the random generator engine,
|
! after initializing the random generator engine,
|
||||||
! you MUST use it for initializing the initializer
|
! you MUST use it for initializing the initializer
|
||||||
dummy = rand()
|
dummy = rand()
|
||||||
\end{verbatim}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Mais il y a d'autres manières plus rigoureuses d'utiliser les nombres
|
||||||
|
pseudo-aléàtoires avec le fortan moderne.
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
% new Thu 24 Nov 2022 02:27:05 AM CET
|
||||||
|
|
||||||
|
\section{Options de gfortran} \index{gfortran}
|
||||||
|
|
||||||
|
Comme d'habitude avec gcc\footnote{Giant Complicated Compilords}, les
|
||||||
|
options sont innombrables. J'ai essayé d'en dégager les plus importantes,
|
||||||
|
mais ce ne sont probablement pas les seules.
|
||||||
|
|
||||||
|
Pour commencer, la plus obligatoire de toutes ces options est sans contexte
|
||||||
|
le protecteur de base \texttt{-Wall} qui vous protégera de nombreux
|
||||||
|
maléfices.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
@@ -134,14 +321,16 @@ La dernière ligne va vous étonner.
|
|||||||
|
|
||||||
La bibliothèque \textbf{Plplot} semble être un bon choix pour commencer,
|
La bibliothèque \textbf{Plplot} semble être un bon choix pour commencer,
|
||||||
mais il existe bien d'autres options.
|
mais il existe bien d'autres options.
|
||||||
Par exemple \textbf{g2} (page \pageref{g2}) semble être utilisable
|
Par exemple \textbf{g2} (vue en page \pageref{g2}) semble être utilisable
|
||||||
avec les vieux F77, et possiblement avec un Fortran moderne, il faut juste
|
avec les vieux F77, et possiblement avec un Fortran moderne, il faut juste
|
||||||
un peu de \textsc{rtfm}.
|
un peu de \textsc{rtfm}.
|
||||||
|
|
||||||
Nous allons donc commencer par Plplot.
|
Nous allons donc commencer par PlPlot, pour envisager ensuite les alternatives.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
%
|
||||||
|
% $ dillo /usr/share/doc/plplot-doc/html/index.html &
|
||||||
|
%
|
||||||
\subsection{Plplot} \index{plplot} \label{ploplt}
|
\subsection{Plplot} \index{plplot} \label{ploplt}
|
||||||
|
|
||||||
Commençons directement par un EMC\footnote{Exemple Minimal Compilable}
|
Commençons directement par un EMC\footnote{Exemple Minimal Compilable}
|
||||||
@@ -152,29 +341,89 @@ qui gèrent pour vous les valeurs « par défaut ».
|
|||||||
Voyez cette exemple comme un \textsl{boilerplate} simple
|
Voyez cette exemple comme un \textsl{boilerplate} simple
|
||||||
ou un \textsc{HelloWorld}~:
|
ou un \textsc{HelloWorld}~:
|
||||||
|
|
||||||
|
\lstinputlisting{code/fortran/plplotting.f90}
|
||||||
|
|
||||||
|
Il ne se passe pas grand chose, sauf qu'on a une proposition de
|
||||||
|
choisir le type de sortie.
|
||||||
|
Dans la version que j'ai (XXX\index{XXX}), on a le choix entre
|
||||||
|
X-Window, PostScript mono ou couleur, Xfig, PNG, SVG, et bien
|
||||||
|
d'autres dont certains, pour moi, assez ésotériques.
|
||||||
|
D'autre part, avec cette méthode, il semble impossible de
|
||||||
|
préciser la taille de l'image.
|
||||||
|
Mais la démonstration est faite.
|
||||||
|
|
||||||
|
Il faut quand même regarder de plus près la subroutine
|
||||||
|
\texttt{plenv()} (\textsl{Set up standard window and draw box})
|
||||||
|
qui initialise simplement un contexte graphique 2D somme toute
|
||||||
|
assez classique. Elle prend six paramètres. Les quatre premiers
|
||||||
|
sont les coordonnées flottantes de deux coins du papier,
|
||||||
|
le cinquième controle l'échelle des axes, et le dernier
|
||||||
|
controle le tracé des boites autour du graphique.
|
||||||
|
|
||||||
|
Nous avons les bases, commençons donc à dessiner.
|
||||||
|
|
||||||
|
Premièrement, nous allons chosir de démarrer automatiquement
|
||||||
|
dans une fenètre X11,
|
||||||
|
en gardant le reste de la configuration avec ses valeurs par défaut.
|
||||||
|
Pour cela, il suffit de rajouter \texttt{call plsdev('xwin')} juste avant
|
||||||
|
l'appel à \texttt{plinit},
|
||||||
|
Ensuite, pour mettre en évidence notre art,
|
||||||
|
nous allons choisir une couleur pour l'encre (qui est d'un
|
||||||
|
rouge du meilleur effet par défaut en mode "xwin"),
|
||||||
|
puis écrire quelques légendes canoniques, donc inutiles, .
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
program dessine
|
call plcol0 (15) ! pure white
|
||||||
use plplot
|
call pllab ("Fuzzfactor", "Yoyodines", "Some nice plots")
|
||||||
implicit none
|
|
||||||
call plinit ()
|
|
||||||
call plenv(-2.1, 2.1, -2.1, 2.1, 0, 0)
|
|
||||||
call plend
|
|
||||||
end program
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Il ne se passe pas grand chose, sauf la proposition de choisir
|
Il est maintenant temps de poser un premier trait de crayon numérique
|
||||||
le type de sortie.
|
sur notre feuille blanche numérique\footnote{Actuellement noire, mais
|
||||||
Dans la version que j'ai (XXX\index{XXX}), on a le choix entre
|
nous trouverons bien comment changer ça}.
|
||||||
X-Window, PostScript mono ou couleur, Xfig, Null, UserMemory et SVG.
|
La forme de ce tracé sera donnée par une suite de coordonnées
|
||||||
C'est intriguant de ne pas avoir au moins \textbf{un} format
|
flottantes \textsl{x/y}
|
||||||
pixmap\index{pixmap}.
|
stockées dans deux tableaux parallèles que nous allons
|
||||||
|
immédiatement garnir de données pertinentes~:
|
||||||
|
|
||||||
Laissons cette question en suspens, et commençons à dessiner.
|
\begin{verbatim}
|
||||||
D'accord, mais dessiner quoi ?
|
integer, parameter :: lg = 500
|
||||||
|
real :: x(lg), y(lg)
|
||||||
|
real :: k
|
||||||
|
integer :: i
|
||||||
|
k = 0.1
|
||||||
|
do i = 1, lg
|
||||||
|
x(i) = k * sin(real(i)/3.0)
|
||||||
|
y(i) = k * cos(real(i)/5.0)
|
||||||
|
k = k * 1.006021
|
||||||
|
enddo
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Une fois en possession de ces données conceptuelles, que l'on peut
|
||||||
|
aisément voir comme un cheminement, nous allons demander
|
||||||
|
au crayon de se promener sur notre feuille virtuelle en suivant
|
||||||
|
ce chemin, et enfin de s'arreter de dessiner~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
call plcol0 (12)
|
||||||
|
call plline (x, y)
|
||||||
|
call plend ()
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Au passage, vous pouvez remarquer la magie du Fortran moderne~:
|
||||||
|
il n'est plus nécessaire de signifier la dimension des tableaux
|
||||||
|
lors de l'appel de la procédure.
|
||||||
|
|
||||||
|
Dans ce mode de fonctionnement interactif,
|
||||||
|
il vous faudra utiliser la touche
|
||||||
|
\textsl{<enter>} pour sortir\footnote{Une de mes prochaines tâche sera
|
||||||
|
de regarder comment quitter avec le '\textbf{q}' canonique}.
|
||||||
|
Nous verrons pas la suite comment écrire des fichiers 'image'
|
||||||
|
vectoriels ou bitmap en mode \textsl{batch}.
|
||||||
|
Enfin une ouverture vers les Gifs animées\index{gif89a}.
|
||||||
|
|
||||||
% --------------------------------------------------------
|
% --------------------------------------------------------
|
||||||
|
|
||||||
\section{Questions}
|
\section{Questions en attente}
|
||||||
|
|
||||||
\index{XXX}
|
\index{XXX}
|
||||||
|
|
||||||
@@ -182,6 +431,17 @@ D'accord, mais dessiner quoi ?
|
|||||||
\item Comment déclarer une variable statique dans une procédure ?
|
\item Comment déclarer une variable statique dans une procédure ?
|
||||||
\item Pourquoi ne pas parler de DISLIN ?
|
\item Pourquoi ne pas parler de DISLIN ?
|
||||||
\item Est-il possible de causer à \texttt{libsndfile} ?
|
\item Est-il possible de causer à \texttt{libsndfile} ?
|
||||||
|
\item Comment caler une chaine à gauche avec un \textsc{format} ?
|
||||||
|
\item Is there a \texttt{-fortran} option for making comments with
|
||||||
|
\texttt{boxes} + \texttt{figlet}\index{figlet} ?
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
% --------------------------------------------------------
|
||||||
|
\section{Réponses}
|
||||||
|
|
||||||
|
\textsl{<Pas de réponse>}
|
||||||
|
|
||||||
|
Voilà, c'est tout pour le moment\dots
|
||||||
|
|
||||||
|
|
||||||
% ========================================
|
% ========================================
|
||||||
|
|||||||
@@ -102,9 +102,11 @@ Comment exclure par \textsl{.gitignore} tous les fichiers \texttt{foo.html} ?
|
|||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
\section{Krkrkr...}
|
\section{Trucs}
|
||||||
|
|
||||||
Tout cela semble bien compliqué.
|
|
||||||
|
git archive --format tgz --prefix=my-project/
|
||||||
|
--output /tmp/my-project.tar.gz HEAD
|
||||||
|
|
||||||
% ====================================================================
|
% ====================================================================
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
% ================================================================
|
% ================================================================
|
||||||
|
|
||||||
@@ -135,6 +139,9 @@ la chose\dots
|
|||||||
\subsection{Timestamp} \index{timestamp}
|
\subsection{Timestamp} \index{timestamp}
|
||||||
|
|
||||||
Comme promis un peu plus haut, le code est très simple.
|
Comme promis un peu plus haut, le code est très simple.
|
||||||
|
C'est juste dommage qu'une fonction aussi utile ne fasse
|
||||||
|
pas partie de la \textsl{stdlib} du langage C\index{C},
|
||||||
|
alors qu'elle le mérite.
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/dtime.c}
|
\lstinputlisting[language=c]{code/dtime.c}
|
||||||
|
|
||||||
|
|||||||
@@ -218,6 +218,34 @@ d'un fichier \texttt{.mid} ?
|
|||||||
|
|
||||||
Voilà enfin du code qui n'est pas fini\dots
|
Voilà enfin du code qui n'est pas fini\dots
|
||||||
|
|
||||||
|
% ---------------------------------------------------------
|
||||||
|
% nouveau 4 octobre 2022
|
||||||
|
%
|
||||||
|
% https://wiki.linuxaudio.org/wiki/abcmiditutorial
|
||||||
|
|
||||||
|
\section {ABC notation} \index{ABC}
|
||||||
|
|
||||||
|
ABC, développé par Chris Walshaw, est un format conçu pour noter
|
||||||
|
la musique en utilisant du texte brut.
|
||||||
|
Il a été conçu à l'origine pour les airs folkloriques d'origine
|
||||||
|
ouest-européenne qui peuvent être écrits sur une seule portée,
|
||||||
|
mais a depuis été étendu à la notation de partitions complètes
|
||||||
|
de diverses musiques.
|
||||||
|
|
||||||
|
Un exemple :
|
||||||
|
|
||||||
|
\lstinputlisting{code/ABC/paddy.abc}
|
||||||
|
|
||||||
|
Je vous préviens d'entrée : je découvre l'univers ABC en même temps
|
||||||
|
que j'écris ces lignes.
|
||||||
|
Je vais donc raconter plein de bétises\footnote{Ça va, on est au courant.}
|
||||||
|
du genre \textsc{Ne faites pas ça à la maison}.
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Header}
|
||||||
|
|
||||||
|
\subsection{Partition}
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% ---------------------------------------------------------
|
||||||
|
|
||||||
\section{midish} \index{midish}
|
\section{midish} \index{midish}
|
||||||
|
|||||||
7
chap/Makefile.tex
Normal file
7
chap/Makefile.tex
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
\chapter{Makefile}
|
||||||
|
\label{chap:Makefile}
|
||||||
|
\index{Makefile} \index{make}
|
||||||
|
|
||||||
|
|
||||||
|
"make -C dir" tells "make" to change to the specified directory before
|
||||||
|
doing anything else.
|
||||||
105
chap/OSC.tex
105
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,40 +18,74 @@ 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.
|
||||||
|
|
||||||
|
% ================================================================
|
||||||
|
|
||||||
\section{oscdump \& oscsend}
|
\section{oscdump \& oscsend}
|
||||||
\index{oscdump}\index{oscsend}
|
\index{oscdump}\index{oscsend}
|
||||||
|
|
||||||
\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}
|
||||||
|
|
||||||
@@ -56,18 +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}
|
||||||
@@ -80,14 +130,27 @@ or die "Could not start client: $@\n";
|
|||||||
$client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
|
$client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
% ------------------------------------------------
|
% ================================================================
|
||||||
|
% nouveau: Sat Jul 15 07:14:10 UTC 2023
|
||||||
|
|
||||||
|
% \section{Le routage}
|
||||||
|
|
||||||
|
% WIP...\index{XXX}
|
||||||
|
|
||||||
|
|
||||||
|
% ================================================================
|
||||||
|
|
||||||
\section{Autres logiciels}
|
\section{Autres logiciels}
|
||||||
|
|
||||||
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,15 +111,11 @@ la ligne de commande feront l'affaire.
|
|||||||
|
|
||||||
% ------------------------------------------------------
|
% ------------------------------------------------------
|
||||||
|
|
||||||
\section{Gestion des modules} \index{CPAN}
|
\section {Et en vrai ?}
|
||||||
|
|
||||||
% ------------------------------------------------------
|
Quels logiciels sont écrits en Perl ?
|
||||||
|
|
||||||
\section{Le \texttt{http}}
|
\texttt{exiftool - Read and write meta information in files} \index{exiftool}
|
||||||
|
|
||||||
Scrapping de la patate en vue !
|
|
||||||
|
|
||||||
https://al.smeuh.org/cgi-bin/express.pritz
|
|
||||||
|
|
||||||
% ------------------------------------------------------
|
% ------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
239
chap/R.tex
Normal file
239
chap/R.tex
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
\chapter{R}
|
||||||
|
\index{R}
|
||||||
|
|
||||||
|
% new: Mon Oct 9 07:44:09 UTC 2023
|
||||||
|
|
||||||
|
% https://raw.githubusercontent.com/wurli/r-best-practice/main/cheatsheet.jpg
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
|
||||||
|
Je n'ai certainement pas la prétention de vous enseigner
|
||||||
|
les arcanes du \textsl{R project},
|
||||||
|
je suis (octobre 2023) en pleine période de découverte.
|
||||||
|
Mais j'ai déja un projet concret en tête, et ce chapitre sera,
|
||||||
|
dans un premier temps, composé de mes notes de voyage.
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
R is a language which bears a passing resemblance to the S language
|
||||||
|
developed at AT\&T Bell Laboratories.
|
||||||
|
It provides support for a variety of statistical and graphical analyses.
|
||||||
|
R is a true computer language which contains a number of control-flow
|
||||||
|
constructions for iteration and alternation.
|
||||||
|
It allows users to add additional functionality by defining new functions.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
\section{Les bases}
|
||||||
|
|
||||||
|
Le caractère \texttt{>} est le prompt de R, il vous invite à taper
|
||||||
|
des commandes afin qu'il vous explique le sens de la vie.
|
||||||
|
On peut définir des variables, leur donner une valeur et faire des calculs
|
||||||
|
avec ces variables,
|
||||||
|
ce qui est bien suffisant pour commencer.
|
||||||
|
Une rapide démonstration~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
> a <- 22
|
||||||
|
> b <- 7
|
||||||
|
> a ; b
|
||||||
|
[1] 22
|
||||||
|
[1] 7
|
||||||
|
> a / b
|
||||||
|
[1] 3.142857
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Les choses semblent simples, nous avons approximé $\pi$.
|
||||||
|
Les deux premières lignes affectent des valeurs aux variables a et b.
|
||||||
|
La troisième demande l'affichage de ces variables, et la quatrimème
|
||||||
|
fait le calcul du nombre qu'il faut apprendre aux sages..
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------------
|
||||||
|
\subsection{Variables}
|
||||||
|
|
||||||
|
Elles sont auto-vivifiantes\footnote{Si quelqu'un a un meilleur terme,
|
||||||
|
je sui preneur}, c'est-à-dire qu'elles existent dès qu'elles
|
||||||
|
sont référencées, il n'y a pas de déclaration préalable à faire.
|
||||||
|
|
||||||
|
Enfin, avec R, il ne faudrait pas parler de variables, mais
|
||||||
|
d'objets, lesquels contenant les variables.
|
||||||
|
|
||||||
|
Ces objets/variables peuvent être de différents types : chaines de caractères,
|
||||||
|
valeurs numériques, booléens\dots
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Builtins}
|
||||||
|
|
||||||
|
Quelques fonctions de base, plus ou moins vaguement expliquées.
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
|
\begin{tabular}{|l|p{7cm}|}
|
||||||
|
\hline
|
||||||
|
\textbf{Fonction} & \textbf{Signification} \\
|
||||||
|
\hline
|
||||||
|
foo <- 3.14159 & Affectation d'une valeur à une variable \\
|
||||||
|
ls() & Liste les objets actuellement chargé. \\
|
||||||
|
help(foobar) & Avoir de l'aide sur la chose \textsl{foobar}, %
|
||||||
|
abréviation: ?foobar \\
|
||||||
|
class(pixel) & Classe de l'objet (numeric, data.frame, ...) \\
|
||||||
|
str(foobar) & Information sur l'objet 'foobar' \\
|
||||||
|
\hline
|
||||||
|
\end{tabular}
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Scripting}
|
||||||
|
|
||||||
|
\textbf{R --vanilla --quiet < mon-script.R}
|
||||||
|
|
||||||
|
La magie du shebang\index{shebang}
|
||||||
|
|
||||||
|
% Heredoc ?
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
\section{Un cas concret}
|
||||||
|
|
||||||
|
Nous disposons d'un fichier SSV
|
||||||
|
(Space Separated Values)\footnote{C'est nouveau, ça vient de sortir.}
|
||||||
|
provenant d'un système optico-numérique bi-dimensionnel multi-planaire
|
||||||
|
(aka Webcam\index{webcam}).
|
||||||
|
Et nous voulons en tirer quelques chiffres et graphiques bien
|
||||||
|
clinquants,
|
||||||
|
par exemple les éventuels rapports entre le rouge et le bleu.
|
||||||
|
Pour la facilité de la mise en page, nous allons utiliser un fichier
|
||||||
|
contenant seulement huit lignes de données,
|
||||||
|
alors qu'un cas réel en comprend quelques centaines de milliers.
|
||||||
|
|
||||||
|
Voici les quelques lignes de ce fichier~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
X Y R G B
|
||||||
|
0 0 0.000000 0.000000 0.000000
|
||||||
|
240 0 3967.814941 1983.907471 0.000000
|
||||||
|
480 0 7935.629883 3967.814941 0.000000
|
||||||
|
720 0 11903.445312 5951.722656 0.000000
|
||||||
|
0 240 0.000000 3967.814941 7935.629883
|
||||||
|
240 240 3967.814941 5951.722656 7935.629883
|
||||||
|
480 240 7935.629883 7935.629883 7935.629883
|
||||||
|
720 240 11903.445312 9919.537109 7935.629883
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Vous pouvez remarquer que les noms de colonnes sont sur la première
|
||||||
|
ligne du fichier, et qu'il y a deux types de données~:
|
||||||
|
les coordonnées x/y qui sont des nombres entiers, et les composantes
|
||||||
|
de couleur (r/g/b) qui sont des valeurs flottantes.
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------------
|
||||||
|
Il nous faut maintenant charger ces données dans le logiciel.
|
||||||
|
La fonction \texttt{read.delim} est là pour ça, il faut juste lui
|
||||||
|
passer les options convenantes pour notre fichier de données~:
|
||||||
|
signaler la présence de l'entête avec les noms de colonnes et
|
||||||
|
le type du séparateur entre champs.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
> pixels <- read.delim("foo.txt", header=TRUE, sep=' ')
|
||||||
|
> pixels
|
||||||
|
X Y R G B
|
||||||
|
1 0 0 0.000 0.000 0.00
|
||||||
|
2 240 0 3967.815 1983.907 0.00
|
||||||
|
3 480 0 7935.630 3967.815 0.00
|
||||||
|
4 720 0 11903.445 5951.723 0.00
|
||||||
|
5 0 240 0.000 3967.815 7935.63
|
||||||
|
6 240 240 3967.815 5951.723 7935.63
|
||||||
|
7 480 240 7935.630 7935.630 7935.63
|
||||||
|
8 720 240 11903.445 9919.537 7935.63
|
||||||
|
> class(pixels)
|
||||||
|
[1] "data.frame"
|
||||||
|
> pixels$G
|
||||||
|
[1] 0.000 1983.907 3967.815 5951.723 3967.815 5951.723 7935.630 9919.537
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Si vous avez fait cette manipulation, bravo, vous êtes maintenant
|
||||||
|
un \textsl{data-scientist} reconnu. Mais il nous reste beaucoup
|
||||||
|
de choses à apprendre. Le voyage n'est pas fini.
|
||||||
|
Il est temps d'explorer (ou exploiter ?) un peu nos données.
|
||||||
|
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
|
||||||
|
\section{Statistiques}
|
||||||
|
|
||||||
|
Oui, c'est un peu pour ça que \textbf{R} a été conçu.
|
||||||
|
Hélas ce n'est pas un domaine qui m'est familier, alors ce que
|
||||||
|
vous allez lire doit être pris avec des pincettes aussi bien
|
||||||
|
du coté des maths sous-jacentes que de la méthodologie.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
> mean(pixels$R) ; mean(pixels$G)
|
||||||
|
[1] 5951.723
|
||||||
|
[1] 4959.769
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
\section{Graphiques}
|
||||||
|
|
||||||
|
Bah c'est pas simple, alors j'ai activé le \textsl{rach-system} et je
|
||||||
|
suis arrivé à ce petit truc qui me permet de faire de la
|
||||||
|
\texttt{gif89a}\index{gif89a}, donc je suis content.
|
||||||
|
Vous allez voir, c'est assez simple, mais le diable\index{Prada}
|
||||||
|
se cache dans les détails, et un peu aussi dans la doc tortueuse.
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------------
|
||||||
|
\subsection{x/y}
|
||||||
|
|
||||||
|
Un des classiques du genre.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
R --vanilla --quiet << __EOR__
|
||||||
|
pixels <- read.delim("cumul.txt", header=TRUE, sep=' ')
|
||||||
|
png(filename="cumul.png", width=640, height=480)
|
||||||
|
plot(pixels\$X, pixels\$B, pch=".",
|
||||||
|
main="$title", sub="tTh 2023",
|
||||||
|
xlab="composante rouge",
|
||||||
|
ylab="composante bleu")
|
||||||
|
quit(save="no")
|
||||||
|
__EOR__
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Détaillons un peu le script~:
|
||||||
|
comme dans l'exemple précédent, nous chargeons nos données dans un
|
||||||
|
\textsl{data.frame}. Ensuite nous spécifions une sortie vers un
|
||||||
|
fichier image au format PNG\index{PNG}, avec une taille d'image fixée.
|
||||||
|
Finalement, nous traçons notre image avec l'instruction \texttt{plot}
|
||||||
|
et ses nombreux paramêtres.
|
||||||
|
Je vais détailler ceux qui sont utilisés dans cet exemple, et je vous rappelle
|
||||||
|
que \texttt{help(plot)} est là pour vous aider.
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{pch} : type de la plume utilisée
|
||||||
|
\item \texttt{main} : titre principal de la page
|
||||||
|
\item \texttt{sub} : sous-titre, placé tout en bas
|
||||||
|
\item \texttt{xlab} : label de l'axe des X
|
||||||
|
\item \texttt{ylab} : label de l'axe des Y
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Avec ça, nous pouvons déja faire quelgues diagrammes corrects
|
||||||
|
\footnote{Voire même on peut tenter de la gif89a\index{gif89a}},
|
||||||
|
mais d'autres paramêtres devraient retenir notre attention, comme
|
||||||
|
la gestion des marges et des couleurs, comment exporter proprement
|
||||||
|
vers \LaTeX, peut-on faire de la 3D\index{3D}, \dots
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Histogramme}
|
||||||
|
|
||||||
|
hist(datas\$V3, breaks=50)
|
||||||
|
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
|
||||||
|
\section{Interface avec l'OS}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
|
||||||
@@ -17,6 +17,8 @@ in the United States used for the purposes of trading information,
|
|||||||
sharing news, discussing new and exciting developments,
|
sharing news, discussing new and exciting developments,
|
||||||
and collaborating on research results and projects.}
|
and collaborating on research results and projects.}
|
||||||
|
|
||||||
|
% ==================================================================
|
||||||
|
|
||||||
\section{slrn}
|
\section{slrn}
|
||||||
\index{slrn}
|
\index{slrn}
|
||||||
\label{slrn}
|
\label{slrn}
|
||||||
@@ -31,11 +33,18 @@ be extended using the embedded S-Lang interpreter.
|
|||||||
printf 'set wrap_flags 7\nset wrap_width 72\n' >> .slrnrc
|
printf 'set wrap_flags 7\nset wrap_width 72\n' >> .slrnrc
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ==================================================================
|
||||||
|
|
||||||
\section{leafnode}
|
\section{leafnode}
|
||||||
\index{leafnode}
|
\index{leafnode}
|
||||||
|
|
||||||
Leafnode est l'outil essentiel si on désire troller au fond du jardin,
|
Leafnode est l'outil essentiel si on désire troller au fond du jardin,
|
||||||
en dehors du rayon d'action de sa box.\index{troll}
|
en dehors du rayon d'action de sa box.\index{troll} On peut le voir
|
||||||
|
comme une sorte de proxy, mais pas que. Il permet aussi d'agréguer
|
||||||
|
plusieurs feeds, ce qui permet de combler les trous, et de donner accès
|
||||||
|
à Usenet à votre réseau local.
|
||||||
|
|
||||||
|
% ==================================================================
|
||||||
|
|
||||||
\section{INN}
|
\section{INN}
|
||||||
\index{INN}
|
\index{INN}
|
||||||
@@ -43,3 +52,11 @@ en dehors du rayon d'action de sa box.\index{troll}
|
|||||||
Voilà, c'est le moment de parler de l'engin fondamental de ce réseau
|
Voilà, c'est le moment de parler de l'engin fondamental de ce réseau
|
||||||
de discussions. INN.
|
de discussions. INN.
|
||||||
|
|
||||||
|
% ==================================================================
|
||||||
|
|
||||||
|
\section{fufe} \index{fufe}
|
||||||
|
|
||||||
|
N'y allez pas, \textbf{It's a trap !}
|
||||||
|
|
||||||
|
|
||||||
|
% ==================================================================
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
18
chap/X11.tex
18
chap/X11.tex
@@ -1,6 +1,18 @@
|
|||||||
\chapter{X11}
|
\chapter{X11}
|
||||||
\label{chap:X11}\index{X11}
|
\label{chap:X11}\index{X11}
|
||||||
|
|
||||||
|
L'écosysteme X11 semble être en fin de carrière pour plusieurs
|
||||||
|
raisons~: sa complexité
|
||||||
|
\textsl{mille-feuilles} accumulée au fil des décennies, ses
|
||||||
|
failles de sécurité réelles ou potentielles, la difficulté
|
||||||
|
de sa maintenance; raisons qui trainent depuis trop
|
||||||
|
longtemps\dots
|
||||||
|
|
||||||
|
À l'heure actuelle (Octobre 2023) le successeur/remplaçant du
|
||||||
|
vénérable X11 « \texttt{Wayland}\index{wayland} » commence tout
|
||||||
|
juste à arriver dans les distributions Linux et à la
|
||||||
|
page \pageref{chap:wayland}. Mais il reste un long chemin
|
||||||
|
à parcourir pour une transition sans larme.
|
||||||
|
|
||||||
%-------------------------------------------------------------------
|
%-------------------------------------------------------------------
|
||||||
\section{Les fontes}
|
\section{Les fontes}
|
||||||
@@ -117,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}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
\index{backup}
|
\index{backup}
|
||||||
|
|
||||||
|
% https://blog.flozz.fr/2023/10/15/borgbackup-sauvegarde-sur-une-machine-distante-via-ssh/
|
||||||
|
|
||||||
|
|
||||||
% ===============================================================
|
% ===============================================================
|
||||||
\section{Geb...}
|
\section{Geb...}
|
||||||
|
|||||||
81
chap/bdd.tex
Normal file
81
chap/bdd.tex
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
\chapter{Bases de données}
|
||||||
|
\label{chap:bdd} \index{SQL}
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
\section{sqlite} \index{sqlite}
|
||||||
|
|
||||||
|
Avantages : un produit éprouvé depuis longtemps, toutes
|
||||||
|
les données placées dans un fichier unique facilement
|
||||||
|
transportable, vraiment multi-plateforme.
|
||||||
|
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------
|
||||||
|
\subsection{CLI} \index{cli}
|
||||||
|
|
||||||
|
Commandes internes (\textsl{meta-commands})~:
|
||||||
|
|
||||||
|
Utilisez \textbf{.help} en premier secours !
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------
|
||||||
|
\subsection{Libreoffice} \index{Libreoffice}
|
||||||
|
|
||||||
|
Il peut utiliser des bases en SQLite.
|
||||||
|
|
||||||
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
\section{GDBM} \index{GDBM}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
GDBM - The GNU database manager. Includes dbm and ndbm compatibility.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
Gnu DBM permet de stocker des paires clef/valeur dans un fichier
|
||||||
|
de données. Chacune de ces clefs doit être unique, et doit être
|
||||||
|
liée avec une seule valeur\footnote{Peut-on alors parler
|
||||||
|
de bijection relationnelle ?}.
|
||||||
|
On peut appeler ça une table associative,
|
||||||
|
ou en anglais une \textsl{hashtable},
|
||||||
|
un terme qui rappelle le principe sous-jacent.
|
||||||
|
|
||||||
|
% ----------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Exemple en Perl} \index{Perl}
|
||||||
|
|
||||||
|
Nous allons extraire une donnée du fichier \texttt{/etc/passwd}
|
||||||
|
et la stocker en utilisant le nom du \textsl{yuser}
|
||||||
|
comme clef d'accès.
|
||||||
|
Une tâche pour laquelle Perl est optimal\footnote{krkrkr}
|
||||||
|
grâce au mécanisme du \texttt{tie} que je songe à
|
||||||
|
expliquer\footnote{un de ces jours...} dans le chapitre approprié
|
||||||
|
vers la page \pageref{chap:Perl}.
|
||||||
|
|
||||||
|
\lstinputlisting[language=perl]{code/bdd/mkgdbm.pl}
|
||||||
|
|
||||||
|
Vous remarquerez que pour cet exemple, nous avons clef et valeur qui
|
||||||
|
sont du texte. Alors que DBM est prévu pour stocker des blocs de
|
||||||
|
binaire. Pour faciliter la récupération de ces chaines de caractères
|
||||||
|
par un hypothétique\footnote{Oui, je vais l'écrire bientôt.} programme
|
||||||
|
en C, le programme Perl rajoute un \texttt{'\textbackslash0'}
|
||||||
|
(fin de chaine) aux deux champs concernés.
|
||||||
|
% ----------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Exemple en C} \index{C}
|
||||||
|
|
||||||
|
XXX \index{XXX}
|
||||||
|
|
||||||
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
\section{Postgresql}
|
||||||
|
|
||||||
|
Le poids lourd du domaine.
|
||||||
|
|
||||||
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
\section{Et le "NoSQL" ?} \index{nosql} \index{troll}
|
||||||
|
|
||||||
|
Pour parler de ça, je préfère attendre Vendredi.
|
||||||
|
|
||||||
|
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
@@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
Vous allez bien dire : « Encore un truc de vieux\dots ».
|
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
|
||||||
@@ -180,13 +180,30 @@ oh surprise, contient votre nom de login.
|
|||||||
|
|
||||||
Et justement, vous avez un programme sous la main que vous suspecter
|
Et justement, vous avez un programme sous la main que vous suspecter
|
||||||
d'avoir un problème relationnel avec cette variable.
|
d'avoir un problème relationnel avec cette variable.
|
||||||
Il nius faut donc remplacer le getenv de la libc par notre propre
|
Il nous faut donc remplacer le getenv de la libc par notre propre
|
||||||
version qui va écouter et exfiltrer l'utilisation de cette
|
version qui va écouter et exfiltrer l'utilisation de cette
|
||||||
fonction.
|
fonction.
|
||||||
|
|
||||||
\lstinputlisting[language=C]{code/debug/spy_getenv.c}
|
\lstinputlisting[language=C]{code/debug/spy_getenv.c}
|
||||||
|
|
||||||
Simple et efficace.
|
Et à l'utilsation~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~$ LD_PRELOAD=~/Devel/TetaTricks/code/debug/spy_getenv date
|
||||||
|
--getenv--> TZ --> (nil)
|
||||||
|
--getenv--> TZ --> (nil)
|
||||||
|
Tue Oct 17 08:55:01 CEST 2023
|
||||||
|
tth@redlady:~$
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
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}.
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
%
|
%
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ le graphique. Il ne nécessite pas de système d'exploitation.
|
|||||||
\section{Configuration}
|
\section{Configuration}
|
||||||
|
|
||||||
La configuration de Dosbox est par défaut dans le fichier
|
La configuration de Dosbox est par défaut dans le fichier
|
||||||
\texttt{~/.dosbox/dosbox-0.74-2.conf}. Vous remarquerez
|
\texttt{\$HOME/.dosbox/dosbox-0.74-2.conf}. Vous remarquerez
|
||||||
que le numéro de version est \textbf{dans} le nom de
|
que le numéro de version est \textbf{dans} le nom de
|
||||||
ce fichier. Ce fichier est abondamment commenté.
|
ce fichier. Ce fichier est abondamment commenté.
|
||||||
|
|
||||||
@@ -31,7 +31,9 @@ keyb fr
|
|||||||
|
|
||||||
\section{In an Out}
|
\section{In an Out}
|
||||||
|
|
||||||
\textbf{Q:} J'ai téléchargé un warez de Qbasic pour jouer avec,
|
\textbf{Q:} J'ai téléchargé un warez de Qbasic\footnote{%
|
||||||
|
cf. page \pageref{chap:Basic}}
|
||||||
|
pour jouer avec,
|
||||||
le l'archive 7z ne contient qu'un fichier \texttt{.img}.
|
le l'archive 7z ne contient qu'un fichier \texttt{.img}.
|
||||||
Que puis-je faire pour jouer enfin à snake ?
|
Que puis-je faire pour jouer enfin à snake ?
|
||||||
|
|
||||||
@@ -75,6 +77,9 @@ juste pour constater que c'est un peu technique.
|
|||||||
merveilles de l'ancien temps.
|
merveilles de l'ancien temps.
|
||||||
|
|
||||||
|
|
||||||
|
% ----------------------------------------------------------
|
||||||
|
|
||||||
|
\section{Qbasic} \index{Qbasic} \label{Qbasic}
|
||||||
|
|
||||||
% ----------------------------------------------------------
|
% ----------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -47,7 +51,7 @@ Le pendant graphique est \texttt{xcowsay}.
|
|||||||
|
|
||||||
\textsl{Display large characters made up of ordinary screen characters.}
|
\textsl{Display large characters made up of ordinary screen characters.}
|
||||||
|
|
||||||
Il y a énormément d'option, en voice une première~:
|
Il y a énormément d'option, en voici une première~:
|
||||||
\texttt{-W} permet d'espacer un peu les caractères.
|
\texttt{-W} permet d'espacer un peu les caractères.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@@ -98,12 +102,28 @@ ___________
|
|||||||
| *** . * |
|
| *** . * |
|
||||||
| ** *.** |
|
| ** *.** |
|
||||||
___________
|
___________
|
||||||
|
tth@plop $ bcd "we make porn" | tr ']' 'x'
|
||||||
|
________________________________________________
|
||||||
|
/WE MAKE PORN |
|
||||||
|
| x x x |
|
||||||
|
| x x xxxx |
|
||||||
|
|x |
|
||||||
|
|1111x1111111111111111111111111111111111111111111|
|
||||||
|
|22222x222222222222222222222222222222222222222222|
|
||||||
|
|333333333333333333333333333333333333333333333333|
|
||||||
|
|444x44444444444444444444444444444444444444444444|
|
||||||
|
|5x5555x5555x555555555555555555555555555555555555|
|
||||||
|
|x66666666x66666666666666666666666666666666666666|
|
||||||
|
|77777777x777777777777777777777777777777777777777|
|
||||||
|
|888888888888888888888888888888888888888888888888|
|
||||||
|
|9999999999x9999999999999999999999999999999999999|
|
||||||
|
|________________________________________________|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Certains esprits ouverts pensent que
|
Certains esprits ouverts pensent que
|
||||||
\texttt{fortune}\index{fortune} est aussi un
|
\texttt{fortune}\index{fortune} est aussi un
|
||||||
générateur de données futilement complexes.
|
générateur de données futilement complexes.
|
||||||
D'autres songent à MXDoctor\index{emacs} ou Camélia.
|
D'autres penseront à MX-Doctor\index{emacs} ou Camélia.
|
||||||
|
|
||||||
\subsection{Les animations}
|
\subsection{Les animations}
|
||||||
|
|
||||||
@@ -112,6 +132,22 @@ vraiment\footnote{Enfin, si, j'essaye de confectionner
|
|||||||
un soft pour fabriquer des flipbooks à partir de portnawak}
|
un soft pour fabriquer des flipbooks à partir de portnawak}
|
||||||
faire d'animation imprimable.
|
faire d'animation imprimable.
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
|
|
||||||
|
\section{Faire \textsl{beep-beep}}
|
||||||
|
|
||||||
|
Dans le temps, les ordinateurs de type IBM-PC n'avaient qu'un tout
|
||||||
|
petit \textsl{buzzer} pour se faire entendre\footnote{Négligeons les
|
||||||
|
ventilateurs en première approche.} avec seulement 1 bit de résolution.
|
||||||
|
On pouvait quand même modifier la fréquence et jouer de petites
|
||||||
|
mélodies.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
$ beep -f 1000 -n -f 2000 -n -f 1500
|
||||||
|
$ beep -f 300.7 -r 2 -d 100 -l 400
|
||||||
|
$ cat codes.txt | beep -c -f 400 -D 50 -l 10
|
||||||
|
$ beep -f 1000 -r 2 -n -r 5 -l 10 --new
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% ===============================================================
|
% ===============================================================
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ et reçu le petit nom
|
|||||||
de \textsc{gif89a}. Il y a toujours la limitation à 256 couleurs
|
de \textsc{gif89a}. Il y a toujours la limitation à 256 couleurs
|
||||||
et un seul niveau de transparence. Contraintes qui n'étaient pas si
|
et un seul niveau de transparence. Contraintes qui n'étaient pas si
|
||||||
génantes que ça à l'époque vu les terminaux visés.
|
génantes que ça à l'époque vu les terminaux visés.
|
||||||
|
Contraintes qu'un artiste numérique peut comprendre et accepter.
|
||||||
|
|
||||||
% ==================================================================
|
% ==================================================================
|
||||||
|
|
||||||
@@ -46,21 +47,56 @@ convert -delay 20 -loop 0 a.png b.png c.png foo.gif
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Le \textsl{delay} est exprimé en millisecondes. On peut aussi
|
Le \textsl{delay} est exprimé en millisecondes. On peut aussi
|
||||||
rajouter l'option \texttt{-loop nnn}\footnote{ add Netscape loop
|
rajouter l'option \texttt{-loop nnn}\footnote{aka: add Netscape loop
|
||||||
extension to your GIF animation} avec nnn qui est le nombre de
|
extension to your GIF animation} avec nnn qui est le nombre de
|
||||||
boucle que doit faire l'animation. La valeur 0 demandant une
|
boucle que doit faire l'animation. La valeur 0 demandant une
|
||||||
boucle infinie.
|
boucle infinie. Deux fois\footnote{Vous connaissez Chuck Norris ?}.
|
||||||
|
|
||||||
Et ensuite, vouv pouvez voir votre logo en flamme avec la
|
Et ensuite, vouv pouvez voir votre logo en flamme avec la
|
||||||
commande \texttt{animate foo.gif} sur votre super écran
|
commande \texttt{animate foo.gif} sur votre super écran
|
||||||
(s)vga\index{VGA}.
|
(s)vga\index{VGA} 14 pouces.
|
||||||
|
|
||||||
|
Je pense\footnote{Avis personnel d'après ma louche.} que la compression
|
||||||
|
de cette commande n'est pas optimale, peut-être parce qu'elle
|
||||||
|
n'utilise pas les \textsl{subblocs} que permet ce format.
|
||||||
|
|
||||||
% ==================================================================
|
% ==================================================================
|
||||||
|
|
||||||
\section{Manipulation}
|
\section{Manipulation}
|
||||||
|
|
||||||
|
XXX\index{XXX}
|
||||||
|
|
||||||
% ==================================================================
|
% ==================================================================
|
||||||
|
|
||||||
\section{Exemples pratiques}
|
\section{Exemples pratiques}
|
||||||
|
|
||||||
|
Dans un Makefile\footnote{Les makefiles, c'est le bien !}~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
indoor.gif: $(DEPS)
|
||||||
|
convert \
|
||||||
|
`ls -rt1 frames/indoor/????.png | tail -99` \
|
||||||
|
-delay 120 \
|
||||||
|
-resize 28% \
|
||||||
|
-normalize \
|
||||||
|
-colorspace gray \
|
||||||
|
-colors 31 \
|
||||||
|
-dither none \
|
||||||
|
$@
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ==================================================================
|
% ==================================================================
|
||||||
|
|
||||||
|
\section{gifsicle}
|
||||||
|
|
||||||
|
'Gifsicle' manipulates GIF images. Its most common uses include combining
|
||||||
|
single images into animations, adding transparency, optimizing animations for
|
||||||
|
space, and printing information about GIFs.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ==================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ gnuplot> splot "cam.indoor" using 2:4:3, "cam.indoor" using 5:7:6
|
|||||||
\index{phytotron}
|
\index{phytotron}
|
||||||
|
|
||||||
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é.
|
bio-luminescentes dans un frigo bricolé par une jeune stagiaire
|
||||||
|
fort sympathique avec l'aide du Tetalab\index{tetalab}.
|
||||||
|
|
||||||
Le fichier des données contient cinq champs séparés par des blancs.
|
Le fichier des données contient cinq champs séparés par des espaces
|
||||||
Le premier est
|
ou des tabulations.
|
||||||
|
Le premier champ est
|
||||||
un \textsl{timestamp} exprimé en secondes depuis l'\textsl{epoch},
|
un \textsl{timestamp} exprimé en secondes depuis l'\textsl{epoch},
|
||||||
et les quatre suivants sont des températures en degrés Celsius.
|
et les quatre suivants sont des températures en degrés Celsius.
|
||||||
|
|
||||||
@@ -54,13 +56,17 @@ set yrange [ 10.0 : 40.0 ]
|
|||||||
plot "${TMPFILE}" using 1:3 title " inside" with lines, \
|
plot "${TMPFILE}" using 1:3 title " inside" with lines, \
|
||||||
"${TMPFILE}" using 1:4 title "ambient" with lines
|
"${TMPFILE}" using 1:4 title "ambient" with lines
|
||||||
__EOC__
|
__EOC__
|
||||||
|
|
||||||
display ${IMAGE} &
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
\textsf{Bon, un de ces jours, il faudrait que je ressorte des archives
|
\textsf{Bon, un de ces jours, il faudrait que je ressorte des archives
|
||||||
l'enregistrement d'un été dans le dd2, pour que vous puissiez voir
|
l'enregistrement d'un été dans le dd2, pour que vous puissiez voir
|
||||||
le résulate de ce script en « pour de vrai ».}
|
le résultat de ce script en « pour de vrai ».}
|
||||||
|
|
||||||
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
|
\section{Paramétrer la plume}
|
||||||
|
|
||||||
|
Largeur, couleur, odeur, toussa.
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -74,8 +80,21 @@ gnuplot> help set view
|
|||||||
supports orthographic projections only. It supports both 3D projection or
|
supports orthographic projections only. It supports both 3D projection or
|
||||||
orthogonal 2D projection into a 2D plot-like map.
|
orthogonal 2D projection into a 2D plot-like map.
|
||||||
|
|
||||||
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
\section{Des trucs...}
|
||||||
|
|
||||||
|
Comment générer un signal carré~:
|
||||||
|
|
||||||
|
% https://lcamtuf.substack.com/p/square-waves-or-non-elephant-biology
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
set samples 2000
|
||||||
|
odd_h(x, n) = sin(x * (2*n - 1)) / (2*n - 1)
|
||||||
|
plot sum [n=1:20] 4/pi * odd_h(x, n)
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Questions}
|
\section{Questions}
|
||||||
|
|||||||
@@ -1,54 +1,122 @@
|
|||||||
\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}
|
||||||
|
|
||||||
|
|
||||||
Quelques notes en vrac sur divers logiciels\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.
|
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}
|
||||||
|
|
||||||
@@ -57,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, l'exploitation, ou plutôt la visualisation
|
Et la seconde étape, l'exploitation avec \textsc{R},
|
||||||
des données~:
|
le logiciel de statistiques (que nous verrons bientôt),
|
||||||
|
ou la visualisation
|
||||||
|
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\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}
|
||||||
|
|
||||||
% ------------------------------------------------
|
% ------------------------------------------------
|
||||||
|
|
||||||
@@ -136,7 +231,7 @@ initialiser un générateur~:
|
|||||||
|
|
||||||
\texttt{\#declare RND = seed(13.37);}
|
\texttt{\#declare RND = seed(13.37);}
|
||||||
|
|
||||||
Vous noterez au passage le fort degré de ce délicieux Corbière que je
|
Vous noterez au passage le fort degré alcolique de ce délicieux Corbière que je
|
||||||
déguste en ce moment même.
|
déguste en ce moment même.
|
||||||
Ensuite, pour obtenir le résultat du tirage, on utilise le \textsl{handler}
|
Ensuite, pour obtenir le résultat du tirage, on utilise le \textsl{handler}
|
||||||
que l'on vient d'obtenir~:
|
que l'on vient d'obtenir~:
|
||||||
@@ -168,8 +263,9 @@ nous aurons toujours la même séquence en sortie.
|
|||||||
|
|
||||||
\subsection{Trucs à voir}
|
\subsection{Trucs à voir}
|
||||||
|
|
||||||
\begin{verbatim}
|
Des bouts de code piochés à droite et à gauche...
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
#declare VIRGINIA =
|
#declare VIRGINIA =
|
||||||
transform {
|
transform {
|
||||||
matrix < 1, 1, 0,
|
matrix < 1, 1, 0,
|
||||||
@@ -177,12 +273,35 @@ 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}
|
||||||
|
|
||||||
|
plplot\index{plplot} est une des pistes à explorer.
|
||||||
|
|
||||||
|
|
||||||
% ------------------------------------------------
|
% ------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,14 @@
|
|||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
\section{Joystick}\index{joystick}
|
\section{Joystick}\index{joystick}
|
||||||
|
|
||||||
|
La manette de jeu est un périphérique que j'affectionne particulièrement.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int foo, joy_fd;
|
int foo, joy_fd;
|
||||||
struct js_event js;
|
struct js_event js;
|
||||||
|
|
||||||
|
|
||||||
joy_fd = open(joy_device , O_RDONLY);
|
joy_fd = open(joy_device , O_RDONLY);
|
||||||
foo = read(joy_fd, &js, sizeof(struct js_event));
|
foo = read(joy_fd, &js, sizeof(struct js_event));
|
||||||
|
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
@@ -20,10 +20,38 @@ 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
|
||||||
|
|
||||||
|
\subsection{lshw} \index{lshw}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
lshw is a small tool to extract detailed information on the hardware
|
||||||
|
configuration of the machine. It can report exact memory configuration,
|
||||||
|
firmware version, mainboard configuration, CPU version and speed, cache
|
||||||
|
configuration, bus speed, etc. on DMI-capable x86 or IA-64 systems and
|
||||||
|
on some PowerPC machines (PowerMac G4 is known to work).
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
% -----------------------------------------------------------
|
||||||
|
\subsection{lscpu} \index{lscpu}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Desktop$ lscpu --all --extended
|
||||||
|
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
|
||||||
|
0 0 0 0 0:0:0:0 yes 3800.0000 1600.0000
|
||||||
|
1 0 0 1 1:1:1:0 yes 3800.0000 1600.0000
|
||||||
|
2 0 0 2 2:2:2:0 yes 3800.0000 1600.0000
|
||||||
|
3 0 0 3 3:3:3:0 yes 3800.0000 1600.0000
|
||||||
|
tth@redlady:~/Desktop$
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% -----------------------------------------------------------
|
||||||
|
|
||||||
\section{Ports série}
|
\section{Ports série}
|
||||||
\index{rs232} \label{rs232}
|
\index{rs232} \label{rs232}
|
||||||
|
|
||||||
@@ -37,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>
|
||||||
@@ -63,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~:
|
||||||
@@ -70,19 +105,39 @@ 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
|
||||||
|
|
||||||
périphérique \texttt{/dev/parport}
|
périphérique \texttt{/dev/parport}
|
||||||
|
|
||||||
|
Question: comment faire du \textsl{bitbanging} ?
|
||||||
|
|
||||||
|
% -----------------------------------------------------------
|
||||||
|
\section{USB} \index{USB} \label{USB}
|
||||||
|
|
||||||
|
Universal Serial Bus, existe en trois taille.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Devel/TetaTricks$ lsusb
|
||||||
|
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||||||
|
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||||||
|
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||||||
|
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||||||
|
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
|
||||||
|
Bus 002 Device 006: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
|
||||||
|
Bus 002 Device 002: ID 0461:4e6f Primax Electronics, Ltd
|
||||||
|
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
|
|
||||||
\section{Disques durs}
|
\section{Disques durs}
|
||||||
@@ -143,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}
|
||||||
@@ -152,6 +207,32 @@ 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}
|
||||||
|
|
||||||
|
L'outil pour connaitre la température de votre CPU surmené.
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
|
|
||||||
\section{Interface réseau}\index{NIC}
|
\section{Interface réseau}\index{NIC}
|
||||||
@@ -174,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
|
||||||
|
|
||||||
@@ -204,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
|
||||||
|
|
||||||
@@ -220,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...
|
||||||
|
|
||||||
|
|
||||||
% -----------------------------------------------------------
|
% -----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
147
chap/image.tex
147
chap/image.tex
@@ -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%
|
||||||
@@ -87,19 +89,33 @@ convert nom_du_fichier_source.jpg -gravity SouthEast \
|
|||||||
Quelques explications semblent nécessaires, parce que certaines
|
Quelques explications semblent nécessaires, parce que certaines
|
||||||
options sont un peu ésotériques et parfois inter-dépendantes\dots
|
options sont un peu ésotériques et parfois inter-dépendantes\dots
|
||||||
|
|
||||||
|
\begin{tabular}{|l|p{7cm}|}
|
||||||
|
\hline
|
||||||
|
Code & Signification \\
|
||||||
|
\hline
|
||||||
|
-txtfont & \\
|
||||||
|
-fontsize & taille des caractères \\
|
||||||
|
-kerning & espacement entre les caractères \\
|
||||||
|
-color & couleur de l'encre \\
|
||||||
|
-stroke & couleur 'bord' de caractère \\
|
||||||
|
-strokewidth & largeur de la bordure \\
|
||||||
|
-txtopts & \textsl{Gni?} \\
|
||||||
|
-gravity & vers quel point cardinal le texte va-t-il être \textsl{tiré} ? \\
|
||||||
|
-annotate & \texttt{+30+30 "texte à écrire"} \\
|
||||||
|
\hline
|
||||||
|
\end{tabular}
|
||||||
|
|
||||||
|
Pour avoir la liste des couleurs disponibles : \texttt{convert -list color}
|
||||||
|
et celles des polices de caractère : \texttt{convert -list font}.
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item{txtfont}
|
\item{Comment mettre une couleur de fond à ce texte ?}
|
||||||
\item{fontsize}
|
\item{Et un texte semi-transparent ?}
|
||||||
\item{kerning: espacement entre les caractères}
|
|
||||||
\item{colors}
|
|
||||||
\item{txtopts}
|
|
||||||
\item{gravity}
|
|
||||||
\item{annotate}
|
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Question : comment mettre une couleur de fond à ce texte ?
|
% ------------------------------------------
|
||||||
|
% faire des affiches
|
||||||
\subsection{montage}
|
\subsection{montage}\index{montage}
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
create a composite image by combining several separate images. The images are
|
create a composite image by combining several separate images. The images are
|
||||||
@@ -109,11 +125,14 @@ image name, and more.
|
|||||||
|
|
||||||
Krkrkr\dots
|
Krkrkr\dots
|
||||||
|
|
||||||
\subsection{Faire des GIFs animées}\index{GIF}
|
% ------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Faire des GIFs animées}\index{gif89a}
|
||||||
|
|
||||||
Ces petites images clignotantes sont l'essence même du
|
Ces petites images clignotantes sont l'essence même du
|
||||||
Web\index{web} moderne depuis 1992 malgré leurs limitations,
|
Web\index{web} moderne depuis 1992 malgré leurs limitations,
|
||||||
et \texttt{convert} sait très bien les générer.
|
et \texttt{convert} sait très bien\footnote{modulo un taux de
|
||||||
|
compression pas génial.} les générer.
|
||||||
Encore un grand merci à Compuserve\index{Compuserve} pour cette
|
Encore un grand merci à Compuserve\index{Compuserve} pour cette
|
||||||
création essentielle à l'art graphique moderne.
|
création essentielle à l'art graphique moderne.
|
||||||
|
|
||||||
@@ -122,7 +141,8 @@ convert -delay 20 -loop 0 a.png b.png c.png foo.gif
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Ce sujet pertinent est abordé plus en détails en
|
Ce sujet pertinent est abordé plus en détails en
|
||||||
page \pageref{chap:gif89a}
|
page \pageref{chap:gif89a} avec, nous l'espérons, un exemple
|
||||||
|
de dithering avec la palette de couleur \texttt{EGA}\index{EGA}.
|
||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
@@ -148,9 +168,11 @@ changer la dimension de l'image. En détail, j'ai pas tout compris.
|
|||||||
|
|
||||||
On trouve encore en circulation de très vieux logiciels qui ne savent lire
|
On trouve encore en circulation de très vieux logiciels qui ne savent lire
|
||||||
qu'un encore plus ancien format : \textsl{Targa file format}.
|
qu'un encore plus ancien format : \textsl{Targa file format}.
|
||||||
Et dans une variante bien précise.
|
Et dans une variante bien précise : mode \textsc{rgb} et non compressé%
|
||||||
|
\footnote{Un jour, peut-être, ça va changer\dots}.
|
||||||
|
|
||||||
Il nous faut donc une incantation bien précise :
|
Il nous faut donc une incantation bien précise avec, heureusement, des
|
||||||
|
arguments aux noms évocateurs :
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
GOTO_TGA ()
|
GOTO_TGA ()
|
||||||
@@ -170,21 +192,86 @@ 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}
|
||||||
|
|
||||||
|
Cette commande nous fournit un ensemble d'informations\footnote{aka metadata}
|
||||||
|
pertinentes sur un fichier image~: format, résolution, couleur ou n/b,
|
||||||
|
nombre de bits par pixel\dots
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@konrad:~/GravityField $ identify WS/nanim//00000.pgm graph.png
|
||||||
|
WS/nanim//00000.pgm PGM 2048x2048 2048x2048+0+0 16-bit Grayscale
|
||||||
|
Gray 20.5765MiB 0.690u 0:00.690
|
||||||
|
graph.png PNG 640x640 640x640+0+0 8-bit sRGB 102c 18165B 0.000u 0:00.000
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
https://imagemagick.org/script/escape.php
|
||||||
|
|
||||||
|
Et ces données peuvent être utilisé pour rajouter une simili
|
||||||
|
\textsc{IA}\footnote{Sorry, private joke inside\dots}
|
||||||
|
|
||||||
|
% ------------------------------------------
|
||||||
|
|
||||||
|
%
|
||||||
|
% http://al.howardknight.net/?ID=170228531600
|
||||||
|
%
|
||||||
|
|
||||||
|
\subsection{Configuration}
|
||||||
|
|
||||||
|
La configuration est dans le répertoire \texttt{/etc/ImageMagick-6/}, et
|
||||||
|
on y trouve en particulier le fichier
|
||||||
|
\texttt{policy.xml}\footnote{Le XML, c'est comme la violence...} où
|
||||||
|
certaines ressources, comme la mémoire utilisable, peuvent être réglées.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
$ identify -list resource
|
||||||
|
Resource limits:
|
||||||
|
Width: 16KP
|
||||||
|
Height: 16KP
|
||||||
|
List length: 18.446744EP
|
||||||
|
Area: 128MP
|
||||||
|
Memory: 256MiB
|
||||||
|
Map: 512MiB
|
||||||
|
Disk: 1GiB
|
||||||
|
File: 768
|
||||||
|
Thread: 4
|
||||||
|
Throttle: 0
|
||||||
|
Time: unlimited
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Vous pouvez aussi tenter de comprendre le contenu du fichier
|
||||||
|
\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
|
||||||
|
de \textsl{dithering}, par exemple pour faire du Bayer.
|
||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
\subsection{Trucs}
|
\subsection{Trucs}
|
||||||
|
|
||||||
\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.
|
||||||
|
Ce sera, pour vous amis lecteurs, une dure mission à assumer.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
\subsection{Ressources}
|
\subsection{Ressources}
|
||||||
|
|
||||||
Le futur livre de Brunus. Réclamez les prmiers drafts dans
|
Le futur livre de Brunus.
|
||||||
l'IRC\index{IRC} \texttt{freenode\#paulla} \textit{:)}
|
|
||||||
|
Réclamez les premiers drafts dans
|
||||||
|
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}
|
||||||
|
|
||||||
@@ -200,7 +287,8 @@ language interpreter. gmic: GREYC's Magic for Image Computing.}
|
|||||||
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
|
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
|
||||||
bibliothèque de fonctions écrite
|
bibliothèque de fonctions écrite
|
||||||
en \texttt{C++}\index{C++} dont l'utilisation est bien
|
en \texttt{C++}\index{C++} dont l'utilisation est bien
|
||||||
docummentée dans le livre ???\index{XXX}
|
documentée dans le livre ???\index{XXX} mais nécessite quand même
|
||||||
|
de solides bases dans les subtilitées fourbes du \texttt{C++}.
|
||||||
|
|
||||||
Gmic existe aussi en plugin pour Gimp\index{Gimp} avec une interface
|
Gmic existe aussi en plugin pour Gimp\index{Gimp} avec une interface
|
||||||
pleine de curseurs et de boutons, qui facilite (ou pas) l'exploration
|
pleine de curseurs et de boutons, qui facilite (ou pas) l'exploration
|
||||||
@@ -229,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.} ?
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -265,15 +353,27 @@ use it heavily.
|
|||||||
sion schemes.
|
sion schemes.
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
% -------------------------------------------------------------------
|
||||||
|
\section {EXIF} \index{EXIF}
|
||||||
|
|
||||||
|
Un \textit{tag} EXIF est un petit morceau d'information nommée inclus
|
||||||
|
dans un fichier image. Il peut contenir des données comme la sensibilité
|
||||||
|
ISO\index{ISO} du capteur, ou le modèle d'objectif utilisé.
|
||||||
|
|
||||||
|
D'autres informations en page \pageref{whatisExdif}
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Cimg} \index{Cimg}
|
\section{Cimg} \index{Cimg}
|
||||||
|
|
||||||
\texttt{Cimg} est l'énorme bibliothèque de fonctions
|
\texttt{Cimg} est l'énorme bibliothèque de fonctions
|
||||||
(écrites en \texttt{C++}\footnote{\textsc{wtf?}}) sur lesquelles
|
(écrites en \texttt{C++}\footnote{\textsc{wtf?}}) sur lesquelles
|
||||||
et basé Gmic. C'est long à compiler, ça produit des binaires
|
est basé Gmic. C'est long à compiler, ça produit des binaires
|
||||||
énormes, mais il semble bien que ça puisse faire des trucs géniaux.
|
énormes, mais il semble bien que ça puisse faire des trucs géniaux.
|
||||||
|
|
||||||
|
Peut-être\footnote{Les rêves ne sont pas interdits.}, existe-il une
|
||||||
|
interface pour le Fortran moderne ?
|
||||||
|
|
||||||
\subsection{\textsc{hello world}}
|
\subsection{\textsc{hello world}}
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
@@ -297,6 +397,9 @@ return 0;
|
|||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Un concept interessant, mais pas évident au premier abord. Un peu comme
|
||||||
|
les branchements dans Chuck\index{Chuck} ou les pipes du shell\dots
|
||||||
|
|
||||||
\subsection{Questions...}
|
\subsection{Questions...}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
|
|||||||
@@ -9,18 +9,27 @@ Prenons rapidement un exemple, le baton de joie\index{joystick}
|
|||||||
dans Linux.
|
dans Linux.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int foo, joy_fd;
|
int joy_fd;
|
||||||
struct js_event js;
|
|
||||||
char joy_name[128];
|
char joy_name[128];
|
||||||
|
|
||||||
joy_fd = open(joy_device , O_RDONLY);
|
joy_fd = open(joy_device , O_RDONLY);
|
||||||
|
if (ioctl(joy_fd, JSIOCGNAME(sizeof(joy_name)), joy_name) < 0)
|
||||||
|
strncpy(joy_name, "Unknown", sizeof(joy_name));
|
||||||
|
fprintf(stderr, "Name: \"%s\"\n", joy_name);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
La macro \texttt{JSIOCGNAME} étant définie dans le fichier
|
||||||
|
\texttt{/usr/include/linux/joystick.h} comme
|
||||||
|
\texttt{\_IOC(\_IOC\_READ, 'j', 0x13, len)}.
|
||||||
|
Bon, d'accord, j'aurais pu choisir un exemple plus simple,
|
||||||
|
mais vous avez capté le principe\dots
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
Ailleurs dans ce document : Ports série (p. \pageref{rs232})
|
\vspace{5em}
|
||||||
|
|
||||||
|
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,47 +1,73 @@
|
|||||||
\chapter{Photographie}
|
\chapter{Photographie}
|
||||||
|
\label{chap:photos}
|
||||||
\index{Photo}
|
\index{Photo}
|
||||||
|
|
||||||
Voir aussi ImageMagick dans le chapitre \ref{chap:image},
|
Le domaine de la photographie numérique est vaste.
|
||||||
|
Nous allons essayer d'en entrevoir certains aspects et de
|
||||||
|
découvrir quelques recettes bien pratiques.
|
||||||
|
Dans le (dés)ordre, nous verrons comment récupérer les
|
||||||
|
image d'un appareil qui n'est pas compatible avec le
|
||||||
|
bien pratique protocole \textsl{mass storage}, puis nous
|
||||||
|
passerons au traitement des fichiers crus, les fameux
|
||||||
|
\textsc{raw} qui font le bonheur de monsieur Reep.
|
||||||
|
|
||||||
|
|
||||||
|
Voir aussi ImageMagick dans le chapitre \ref{chap:image},
|
||||||
|
page \pageref{chap:image}, un bon outil pour brotcher vos images.
|
||||||
|
|
||||||
|
%----------------------------------------------------------------
|
||||||
|
|
||||||
\section{gphoto2}
|
\section{gphoto2}
|
||||||
\index{gphoto2}
|
\index{gphoto2}
|
||||||
|
|
||||||
Notes écrites en se basant sur la version 2.4.5 (Ubuntu 10.04),
|
Notes écrites en se basant sur la version 2.5.20 (Debian 10.23),
|
||||||
les choses peuvent être (rarement) différentes chez vous.
|
les choses peuvent être (rarement) différentes chez vous.
|
||||||
L'appareil photo que j'utilise actuellement est un
|
L'appareil photo que j'utilise actuellement est un
|
||||||
Canon \textit{PowerShot A520}.
|
Canon \textit{EOS 600D}\footnote{Hélas, j'ai perdu mon bien-aimé
|
||||||
|
PowerShot A520\dots}, dont, il faut bien l'avouer, la complexité
|
||||||
|
m'effraye un peu.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
gphoto2 --list-ports
|
gphoto2 --list-ports
|
||||||
gphoto2 --list-cameras
|
gphoto2 --list-cameras
|
||||||
|
gphoto2 --auto-detect
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Deux commandes pour obtenir la description des modes de connexion
|
Ces trois commandes servent à obtenir la description des modes de
|
||||||
possibles, et la liste des appareils gérés.
|
connexion possibles, la liste des appareils gérés, et l'éventuel
|
||||||
|
appareil connecté, si il est sous tension, bien entendu :)
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Photos$ gphoto2 --auto-detect
|
||||||
|
Model Port
|
||||||
|
----------------------------------------------------------
|
||||||
|
Canon EOS 600D usb:002,005
|
||||||
|
\end{verbatim}
|
||||||
|
%----------------------------------------------------------------
|
||||||
|
|
||||||
|
Ok, nous savons maintenant par quel petit nom notre Canon est connu
|
||||||
|
par le système sous-jacent.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
gphoto2 --auto-detect
|
|
||||||
gphoto2 --port usb:002,002 -P
|
gphoto2 --port usb:002,002 -P
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Détection d'un éventuel appareil connecté, puis récupération
|
Cette commande fait une récupération
|
||||||
bestiale de toutes les photos (l'option \texttt{-P} peut
|
bestiale de toutes les photos (l'option \texttt{-P} peut
|
||||||
être remplacée par \texttt{--get-all-files}).
|
être remplacée par \texttt{--get-all-files}).
|
||||||
|
|
||||||
L'option \texttt{--new} permet de se limiter au
|
L'option \texttt{--new} permet de se limiter au
|
||||||
téléchargement des nouvelles photos.
|
téléchargement des nouvelles photos.
|
||||||
|
|
||||||
Pour les drogués de la ligne de commande, l'option \texttt{--shell}
|
Pour les drogués de la ligne de commande, l'option \texttt{--shell}
|
||||||
démarre un environnement interactif, qui permet d'explorer le
|
démarre un environnement interactif, qui permet d'explorer le
|
||||||
contenu de votre appareil, et d'interagir avec lui.
|
contenu de votre appareil, et d'interagir avec lui. Ce qu'on peut faire
|
||||||
|
semble assez dépendant du modèle d'apn utilisé.
|
||||||
|
|
||||||
|
|
||||||
Il doit exister plein d'autres tricks'n'tips, il faut juste prendre
|
Il doit exister plein d'autres tricks'n'tips, il faut juste prendre
|
||||||
le temps de les découvrir.
|
le temps de les découvrir.
|
||||||
|
|
||||||
%----------------------------------------------------------------
|
%================================================================
|
||||||
|
|
||||||
\section{ufraw}
|
\section{ufraw}
|
||||||
\index{ufraw}
|
\index{ufraw}
|
||||||
@@ -50,7 +76,39 @@ Ufraw (Unidentified Flying Raw) est un convertisseur de fichier images
|
|||||||
\textit{RAW}, c'est à dire en général les données brutes en sortie
|
\textit{RAW}, c'est à dire en général les données brutes en sortie
|
||||||
du capteur de l'appareil photo.
|
du capteur de l'appareil photo.
|
||||||
|
|
||||||
%----------------------------------------------------------------
|
%================================================================
|
||||||
|
|
||||||
|
\section {EXIF} \index{EXIF} \label{whatisExdif}
|
||||||
|
|
||||||
|
\texttt{exiftool - Read and write meta information in files}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
\textbf{from wikipedia:}
|
||||||
|
Exchangeable image file format (officially Exif, according to JEIDA/JEITA/CIPA
|
||||||
|
specifications) is a standard that specifies formats for images, sound,
|
||||||
|
and ancillary tags used by digital cameras (including smartphones), scanners and
|
||||||
|
other systems handling image and sound files recorded by digital cameras.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
% ----
|
||||||
|
\subsection{Lire}
|
||||||
|
|
||||||
|
Peut-être est-il temps de passer (comme d'habitude) à un exemple pratique.
|
||||||
|
J'ai un appareil numérique\footnote{un Canon EOS 600D, mais ça n'est pas important}
|
||||||
|
et quatre objectifs. Je souhaite écrire le nom de l'objectif sur l'image,
|
||||||
|
et de préférence dans une teinte assez kitch\index{kitch}. Comment faire ?
|
||||||
|
|
||||||
|
% ----
|
||||||
|
\subsection{Écrire}
|
||||||
|
|
||||||
|
Un autre exemple me vient à l'esprit : Je souhaite rajouter un petit texte dans
|
||||||
|
les \textit{tags} d'un fichier JPEG. Comment procéder ?
|
||||||
|
|
||||||
|
Et surtout sans perdre les \textit{tags} déja présents.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ and dlclose().
|
|||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
Traduit en clair, la fonction \texttt{dlopen} permet de charger
|
Traduit en clair, la fonction \texttt{dlopen} permet de charger
|
||||||
manuellement un \texttt{.so} en mémoire centrale, au lieu de
|
manuellement une bibliothèque partagée (un \texttt{.so})
|
||||||
|
en mémoire centrale, au lieu de
|
||||||
laisser faire le loader (ld.so) automatiquement au lancement
|
laisser faire le loader (ld.so) automatiquement au lancement
|
||||||
d'un binaire. la fonction \texttt{dlclose} va, elle, vidanger
|
d'un binaire. la fonction \texttt{dlclose} va, elle, vidanger
|
||||||
la zone mémoire dans laquelle est le plugin.
|
la zone mémoire dans laquelle est le plugin.
|
||||||
@@ -62,7 +63,7 @@ principal (l'appelant).
|
|||||||
|
|
||||||
C'est ici que nous trouverons le code actif de l'exemple,
|
C'est ici que nous trouverons le code actif de l'exemple,
|
||||||
l'utilité de notre \textsl{usecase} reste à déterminer par nos
|
l'utilité de notre \textsl{usecase} reste à déterminer par nos
|
||||||
lecteurs, à titre d'exercice.
|
lecteurs, mais seulement à titre d'exercice.
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/plugiciel.c}
|
\lstinputlisting[language=c]{code/plugiciel.c}
|
||||||
|
|
||||||
@@ -75,7 +76,9 @@ la cinquième va vous étonner.
|
|||||||
Voyons maintenant comment mettre ça en œuvre depuis le programme
|
Voyons maintenant comment mettre ça en œuvre depuis le programme
|
||||||
principal.
|
principal.
|
||||||
Nous supposerons que le binaire du plugin est dans le répertoire
|
Nous supposerons que le binaire du plugin est dans le répertoire
|
||||||
courant.
|
courant. Pour les autres cas, il faut jouer avec la variable
|
||||||
|
d'environnement \texttt{LD\_LIBRARY\_PATH} (cf man dlopen(3)) ou
|
||||||
|
le fichier \texttt{/etc/ld.so.cache} (cf man ldconfig(8)).
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/appelant.c}
|
\lstinputlisting[language=c]{code/appelant.c}
|
||||||
|
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|
||||||
|
|
||||||
|
%-----------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
109
chap/reseau.tex
109
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,33 +54,46 @@ 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
|
||||||
|
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
\section{Translation d'adresse}
|
\section{Translation d'adresse}
|
||||||
\index{NAT}
|
\index{NAT}
|
||||||
|
|
||||||
|
% XXX expliquer un peu le NAT !
|
||||||
|
|
||||||
Voir en page \pageref{NAT} pour découvrir comment utiliser une
|
Voir en page \pageref{NAT} pour découvrir comment utiliser une
|
||||||
machine connectée en WiFi pour donner accès à Internet à votre
|
machine connectée en WiFi pour donner accès à Internet à votre
|
||||||
réseau local Ethernet\dots
|
réseau local Ethernet\dots
|
||||||
@@ -87,62 +103,9 @@ défis à relever pour en faire une solution complexe et
|
|||||||
amusante à des problèmes inexistants et datant du siècle
|
amusante à des problèmes inexistants et datant du siècle
|
||||||
dernier.
|
dernier.
|
||||||
Par exemple la comparaison de la mise en œuvre du NAT
|
Par exemple la comparaison de la mise en œuvre du NAT
|
||||||
avec \texttt{iptable} 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}
|
||||||
|
|
||||||
@@ -150,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,10 +1,41 @@
|
|||||||
\chapter{scripting}
|
\chapter{scripting}
|
||||||
|
|
||||||
|
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
|
||||||
|
par Aho, Kernighan, and Weinberger%
|
||||||
|
\footnote{The AWK Programming Language, Alfred V. Aho,
|
||||||
|
Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988.
|
||||||
|
ISBN 0-201-07981-X. }.
|
||||||
|
Son originalité vient du fait qu'il a été conçu principalement
|
||||||
|
pour traiter ligne par ligne des fichiers tabulés.
|
||||||
|
C'est son domaine de prédilection, autant en profiter.
|
||||||
|
|
||||||
Quelques \textsl{oneliners} de bon aloi pour vous donner
|
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
|
||||||
@@ -16,19 +47,157 @@ une idée du langage\dots
|
|||||||
wc -l END { print NR }
|
wc -l END { print NR }
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
Vous pouvez déja constater une certaine élégance portée par une
|
||||||
|
grande simplicité logique, une sorte d'axiome de base, de
|
||||||
|
méthologie très \textsc{kiss} :
|
||||||
|
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
|
||||||
Un cas d'école : un élément par ligne, les valeurs séparées par
|
SDL\index{SDL}\footnote{SDL: Scene Description Language}
|
||||||
des espaces.
|
d'un objet pour Povray\index{Povray}.
|
||||||
|
Un cas d'école : un élément par ligne, les valeurs sont séparées par
|
||||||
|
des espaces et/ou des tabulations.
|
||||||
|
|
||||||
\lstinputlisting[]{code/awk/dataset}
|
\lstinputlisting[]{code/awk/dataset}
|
||||||
|
|
||||||
Ces données sont les coordonnées \textsc{xyz} et le rayon d'une
|
Ces données sont les coordonnées \textsc{x,y,z} et le rayon d'une
|
||||||
petite collection de bubulles. Pratiquement, une représentation
|
petite collection de bubulles. Pratiquement, une représentation
|
||||||
sommaire d'une sphère de povray.
|
sommaire d'une sphère de povray.
|
||||||
|
|
||||||
|
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
|
||||||
|
avec la structure de déroulement d'un script Awk, comme nous allons
|
||||||
|
le voir ici-même~:
|
||||||
|
|
||||||
|
\lstinputlisting[]{code/awk/mkunion.awk}
|
||||||
|
|
||||||
|
La première ligne est pour le traditionnel
|
||||||
|
\textsl{shebang}\index{shebang},
|
||||||
|
avec l'option \texttt{-f} pour que le contenu du script soit lu
|
||||||
|
par l'interpréteur Awk dès son lancement.
|
||||||
|
Ensuite, nous trouvons trois blocs délimités par des accolades,
|
||||||
|
deux d'entre eux étant précédés d'une « instruction ».
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
% ===============================================================
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
294
chap/shell.tex
294
chap/shell.tex
@@ -5,40 +5,310 @@ Le \texttt{shell} est le coquillage qui isole le
|
|||||||
MC/P\footnote{Master Control Program} des yusers.
|
MC/P\footnote{Master Control Program} des yusers.
|
||||||
En gros, hein, je vais simplifier, et me limiter aux
|
En gros, hein, je vais simplifier, et me limiter aux
|
||||||
bricolages constructifs et/ou amusant. Il y aura du gore\index{gore}
|
bricolages constructifs et/ou amusant. Il y aura du gore\index{gore}
|
||||||
aussi.
|
aussi, parce que le shell est à la fois un interpréteur de commande
|
||||||
|
et un langage de programmation.
|
||||||
|
Ces deux notions ont beaucoup de choses en commun, comme nous
|
||||||
|
allons essayer de le voir. Certains qualifient le shell de
|
||||||
|
« langage de glue », et c'est une image assez pertinente.
|
||||||
|
|
||||||
Le shell est à la fois un interpréteur de commande et un
|
Nous allons nous concentrer sur le \textsl{Bourne again shell}
|
||||||
langage de programmation. Ces deux notions ont beaucoup de
|
(aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus
|
||||||
choses en commun.
|
répandus, du moins dans le monde Linux\index{Linux}.
|
||||||
|
Mais il en existe d'autres : sh, ksh, ash, zsh, tthsh\dots
|
||||||
|
Ce qui, bien entendu, pose quelques problèmes de compatibilité.
|
||||||
|
|
||||||
Nous allons nous concentrer sur le \textsl{Bourne again shell}.
|
Ou alors, il faut reste \textsc{posix}, mais c'est pour le moment
|
||||||
aka \texttt{bash} qui est peut-être le plus répandu. Mais il
|
une autre histoire. Parce que là, on est plutôt dans une optique
|
||||||
en existe d'autres : sh, ksh, ash, zsh\dots
|
« morefun » sur l'utilisation de nos machines.
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
\section{Interpréteur}\index{cli}
|
\section{Interpréteur}\index{cli}
|
||||||
|
|
||||||
Ceci est un prompt. Son petit nom est \texttt{PS1}.
|
Ceci est un prompt : \texttt{tth@redlady:\textasciitilde\$}.
|
||||||
|
Son petit nom est \texttt{PS1}. On peut y
|
||||||
|
mettre plein d'informations utiles et de \textsl{mises en forme} assez
|
||||||
|
funky\footnote{Un peu de calme, fatalerrors !} permettant
|
||||||
|
d'enhancer la reliability de votre UI/UX. Mais surtout il est
|
||||||
|
là pour indiquer qu'il attend vos ordres, qu'il est prèt à
|
||||||
|
interpréter vos lignes de commandes.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~$ date --utc
|
||||||
|
Thu Oct 5 00:53:01 UTC 2023
|
||||||
|
tth@redlady:~$
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Ces ordres peuvent être des commandes internes à l'interpréteur,
|
||||||
|
d'autres seront des commandes fournies par des exécutables
|
||||||
|
externes. Pour le début, la différence n'est pas importante.
|
||||||
|
|
||||||
|
Mais comment le shell fait-il pour retrouver tous les outils
|
||||||
|
dont il a besoin ? Simplement, il connait une liste
|
||||||
|
d'endroits où aller chercher, une sorte de chemin de recherche,
|
||||||
|
c'est d'ailleurs pour ça que cette liste
|
||||||
|
est nommée \texttt{PATH}\index{PATH}.
|
||||||
|
Il est très simple de la visualiser~:
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Devel/TetaTricks$ echo $PATH
|
||||||
|
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
\section{Langage}\index{script}
|
\section{Un langage}\index{script}
|
||||||
|
|
||||||
|
Le shell est aussi, et surtout, un langage de programmation
|
||||||
|
à part entière.
|
||||||
|
Il est parfois appelé \textsl{glue-language} parce qu'il permet de
|
||||||
|
"coller" ensemble plusieurs opérations élémentaires, d'abord avec
|
||||||
|
ses opérateurs internes et ensuite par l'utilisation d'outils
|
||||||
|
extérieurs\footnote{Grep, Sed, Awk, BwBasic, Sort, Gfortran...}
|
||||||
|
divers. C'est \textsl{très} efficace.
|
||||||
|
|
||||||
|
Nous allons commencer par voir quelques notions liées à
|
||||||
|
la création d'un script exécutable, puis d'un enchainement
|
||||||
|
de commandes.
|
||||||
|
Nous passerons ensuite aux structures de contrôle, comme les
|
||||||
|
tests et les boucles.
|
||||||
|
|
||||||
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Le shebang} \index{shebang} \label{shebang}
|
||||||
|
|
||||||
|
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
|
||||||
|
au tout début d'un script shell.
|
||||||
|
Le 'she' est l'abréviation de 'sharp', qui veut dire 'coupant' en français.
|
||||||
|
C'est
|
||||||
|
probablement une allusion aux cotés tranchants du \texttt{\#}.
|
||||||
|
Quand au 'bang', c'est le point d'exclamation après l'explosion
|
||||||
|
de la forkbomb.
|
||||||
|
|
||||||
|
Quand on demande au noyau\index{kernel} d'exécuter un fichier
|
||||||
|
\texttt{(man 3 exec}), il va en lire d'abord les premiers
|
||||||
|
octets. Si les deux premiers sont \textsl{0x23 0x21}, le reste
|
||||||
|
de la première ligne sera interprété pour lancer un autre exécutable,
|
||||||
|
avec un traitement particuler des options.
|
||||||
|
|
||||||
|
Et à ce momment-là des explications, on entend Serguey qui hurle
|
||||||
|
du fond de la salle « schmod777 en force ! ».
|
||||||
|
Et il a bien raison. En effet, ce fichier doit être vu comme
|
||||||
|
possiblement exécutable selon les droits 'X' qu'il a.
|
||||||
|
Il y a une commande prévue à cet effet, dont nous allons voir
|
||||||
|
l'usage à l'instant, avec la création d'un script complet~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~$ echo '#!/bin/bash' > foo.sh
|
||||||
|
tth@redlady:~$ echo 'printf "%x" 85 >> foo.sh
|
||||||
|
tth@redlady:~$ chmod u+x ./foo.sh
|
||||||
|
tth@redlady:~$ ./foo.sh
|
||||||
|
55
|
||||||
|
tth@redlady:~$ cat foo.sh
|
||||||
|
#!/bin/bash
|
||||||
|
printf "%x\n" 85
|
||||||
|
tth@redlady:~$
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
Parlons un peu du \textsc{shebang}\index{shebang}\dots
|
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
\section{Le pipeline}\index{pipeline}\label{pipeline}
|
\section{Le pipeline}\index{pipeline}\label{pipeline}
|
||||||
|
|
||||||
Une invention géniale, voir un exemple d'utilisation par
|
Une invention géniale, dont vous pouvez voir un exemple d'utilisation
|
||||||
un gadget sonore en page \pageref{say-uptime} et
|
par un gadget sonore en page \pageref{say-uptime} et
|
||||||
un bout de code C en page \pageref{filtre-unix}.
|
un bout de code C en page \pageref{filtre-unix}.
|
||||||
|
|
||||||
|
Exemple rapide, où la commande \texttt{uptime} envoie sa sortie dans
|
||||||
|
le tuyau, et la commande \texttt{tr} va lire le tuyau pour
|
||||||
|
son entrée~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
$ uptime | tr ' ' 'X'
|
||||||
|
X09:22:29XupX33Xdays,X14:00,XX8Xusers,XXloadXaverage:X0.12,X0.17,X0.17
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Bien entendu, on peut utiliser plusieurs tuyaux pour construire
|
||||||
|
une chaine de traitements%
|
||||||
|
\footnote{La chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
|
||||||
|
On peut même « intercepter » ce qui transite par un des tuyaux.
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Devel/TetaTricks$ date | tee foo.txt |
|
||||||
|
tr 'EASLeasl' '34573457'
|
||||||
|
W3d 53p 25 16:07:01 C35T 2024
|
||||||
|
tth@redlady:~/Devel/TetaTricks$ cat foo.txt
|
||||||
|
Wed Sep 25 16:07:01 CEST 2024
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
% new Wed Sep 25 14:00:07 UTC 2024
|
||||||
|
|
||||||
|
\section{L'environnement} \index{environ}
|
||||||
|
|
||||||
|
Commençons par une petite histoire.
|
||||||
|
Un jour\footnote{été 2024 ?}, je suis tombé par un hasard
|
||||||
|
improbable sur une variable d'environnement nommée
|
||||||
|
\textsc{hostname}. Qui contenait précisément "redlady" !
|
||||||
|
Tout bien.
|
||||||
|
Alors, quelques jours avant, vers 2006, je l'ai utilisée
|
||||||
|
dans un bout de code en C, que j'avais depuis bien
|
||||||
|
bien longtemps oublié au fond
|
||||||
|
d'une 8" hard-sectored.
|
||||||
|
Et là, ça ne marche pas comme je l'espérais.
|
||||||
|
Voyez ce bout de code~:
|
||||||
|
\begin{verbatim}
|
||||||
|
char *nom = "HOSTNAME";
|
||||||
|
printf("%s -> %s\n", nom, getenv(nom));
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Il me renvoit \texttt{HOSTNAME -> (null)}.
|
||||||
|
Krkrkr.
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
|
\section{Structures de contrôle}
|
||||||
|
|
||||||
|
Les plus importantes sont là : le choix, la boucle, l'attente,
|
||||||
|
le \textsc{goto}\index{goto} calculé, la sélection,
|
||||||
|
\textsl{make your choice}.
|
||||||
|
|
||||||
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection {Les tests}
|
||||||
|
|
||||||
|
Deux éléments sont ils égaux ? Et d'abord, ces deux éléments
|
||||||
|
sont-ils comparables ?
|
||||||
|
|
||||||
|
% --------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection {Les boucles}
|
||||||
|
|
||||||
|
Exemple très simple~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
for foo in A B C D
|
||||||
|
do
|
||||||
|
echo ${foo}
|
||||||
|
done
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Autre exemple, un peu moins simple~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
for foo in $(seq 0 37 133)
|
||||||
|
do
|
||||||
|
printf "foo = %3d\n" ${foo}
|
||||||
|
done
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
|
\section{Les fonctions}
|
||||||
|
|
||||||
|
Une bonne manière de rendre votre code modulaire, et de réutiliser
|
||||||
|
des bouts de code à volonté depuis plusieurs programmes.
|
||||||
|
Une fonction peut accepter des paramètres, qui seront
|
||||||
|
connus sous les petits noms de
|
||||||
|
\texttt{\$1 \$2 ... \$n}.
|
||||||
|
|
||||||
|
Voici un fichier contenant quelques fonctions~:
|
||||||
|
|
||||||
|
\lstinputlisting{code/shell/fonctions.sh}
|
||||||
|
|
||||||
|
Pour les utiliser, il faut d'abord les charger dans le shell courant.
|
||||||
|
C'est la directive \texttt{source}\index{source} qui s'en charge~:
|
||||||
|
|
||||||
|
\lstinputlisting{code/shell/demofonctions.sh}
|
||||||
|
|
||||||
|
XXX expliquer "source" \index{XXX}
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
|
% https://bwog-notes.chagratt.site/2023/le-heredoc/
|
||||||
|
|
||||||
|
\section{Heredoc}
|
||||||
|
|
||||||
|
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
||||||
|
C'est un moyen simple et efficace de mettre des données textuelles
|
||||||
|
(comme des commandes pour un logiciel particulier)
|
||||||
|
dans un script afin de les envoyer dans le \textsl{stdin} d'un
|
||||||
|
logiciel. Par exemple, quelques commandes pour générer un
|
||||||
|
graphique avec Gnuplot\index{gnuplot} sur la console \textsl{dumb}.
|
||||||
|
|
||||||
|
\lstinputlisting{code/shell/heredoc.sh}
|
||||||
|
|
||||||
|
Après le \textsl{shebang}, nous avons la création de la variable
|
||||||
|
pour le titre,
|
||||||
|
et ensuite l'appel à Gnuplot avec la redirection
|
||||||
|
\texttt{$<<$ \_\_EOC\_\_} % bug affichage "<<"
|
||||||
|
qui va envoyer sur le stdin de Gnuplot la suite du
|
||||||
|
script shell (des commandes gnuplot), jusque au marqueur de fin,
|
||||||
|
qui est \texttt{\_\_EOC\_\_} dans notre cas.
|
||||||
|
|
||||||
|
... et la démonstration~:
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
tth@redlady:~/Devel/TetaTricks/code/shell$ ./heredoc.sh
|
||||||
|
|
||||||
|
Here Doc (9946)
|
||||||
|
|
||||||
|
1 +-------------------------------------------------------------+
|
||||||
|
| + + + + + + + + + |
|
||||||
|
| 0.7*sin(x) ******* |
|
||||||
|
| ****** ****** |
|
||||||
|
0.5 |-+ ** ** ** ** +-|
|
||||||
|
| ** * * ** |
|
||||||
|
| ** ** ** ** |
|
||||||
|
| ** ** ** ** |
|
||||||
|
|* ** ** *|
|
||||||
|
0 |-+ * * +-|
|
||||||
|
| ** ** |
|
||||||
|
| * * |
|
||||||
|
| * * |
|
||||||
|
-0.5 |-+ ** ** +-|
|
||||||
|
| *** *** |
|
||||||
|
| ******* |
|
||||||
|
| |
|
||||||
|
| + + + + + + + + + |
|
||||||
|
-1 +-------------------------------------------------------------+
|
||||||
|
0 1 2 3 4 5 6 7 8 9
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
Je pense que l'exemple est assez parlant.
|
||||||
|
Pour un exemple plus complet, toujours avec gnuplot, c'est vers la
|
||||||
|
page \pageref{chap:gnuplot}.
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
\section{Les \textsl{locales}}
|
||||||
|
\index{locales}
|
||||||
|
|
||||||
|
% new: Mon Apr 17 10:54:45 UTC 2023
|
||||||
|
|
||||||
|
Quelle sont les différences entre \texttt{en\_US.UTF-8} et
|
||||||
|
\texttt{C.UTF-8} ?
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
% https://wiki.fiat-tux.fr/books/d%C3%A9veloppement/page/ajouter-des-couleurs-a-ses-scripts-shell
|
||||||
|
|
||||||
|
\section{Écrire en couleur} \index{ANSI} \index{escape}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
BLACK='\033[0;30m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[0;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
PURPLE='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
WHITE='\033[0;37m'
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
\section{Questions à voir}
|
\section{Questions à voir}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item le traitement des chaines de caractères\dots
|
\item le traitement des chaines de caractères\dots
|
||||||
|
\item la gestion des co-routines\dots
|
||||||
\end{itemize}
|
\end{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}
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ ou une playlistde fichiers \texttt{.ogg}\index{ogg}.
|
|||||||
\textsl{more to come...}
|
\textsl{more to come...}
|
||||||
|
|
||||||
%-------------------------------------------------------------
|
%-------------------------------------------------------------
|
||||||
|
|
||||||
|
% https://github.com/radiofrance/rf-liquidsoap
|
||||||
|
|
||||||
\section{liquidsoap}
|
\section{liquidsoap}
|
||||||
\index{liquidsoap}
|
\index{liquidsoap}
|
||||||
|
|
||||||
|
|||||||
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,6 +64,73 @@ 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 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}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
\texttt{eqn} compiles descriptions of equations embedded within troff
|
||||||
|
input files into commands that are understood by troff.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
\subsection{tbl}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
\texttt{tbl} compiles descriptions of tables embedded within troff
|
||||||
|
input files into commands that are understood by troff.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
\subsection{pic}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
\texttt{pic} compiles descriptions of pictures embedded within troff
|
||||||
|
input files into commands that are understood by troff.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
\subsection{Autres trucs...}
|
||||||
|
|
||||||
|
\texttt{colcrt} : filter nroff output for CRT previewing
|
||||||
|
|
||||||
%-------------------------------------------------------------
|
%-------------------------------------------------------------
|
||||||
\section{yodl}
|
\section{yodl}
|
||||||
@@ -76,6 +148,8 @@ and texinfo, a poor-man's text converter and an experimental xml converter.
|
|||||||
\section{zoem}
|
\section{zoem}
|
||||||
\index{zoem}
|
\index{zoem}
|
||||||
|
|
||||||
|
General-purpose macro/programming language for transforming text
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
Zoem is a language for transforming text. It supports the creation of
|
Zoem is a language for transforming text. It supports the creation of
|
||||||
light-weight mark-up languages as macro packages built on top of zoem.
|
light-weight mark-up languages as macro packages built on top of zoem.
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ Et c'est là que les ennuis potentiels débarquent :
|
|||||||
les jours, «~ils vont se marcher sur les pieds~».
|
les jours, «~ils vont se marcher sur les pieds~».
|
||||||
|
|
||||||
D'un autre coté, ce paradigme permet de faire des choses assez
|
D'un autre coté, ce paradigme permet de faire des choses assez
|
||||||
choupi, comme un synthétiseur d'évènement.
|
choupi, comme un « synthétiseur d'évènement», notion que noue allons
|
||||||
|
bientôt contempler.
|
||||||
|
|
||||||
% ----------------------------------------------------------------
|
% ----------------------------------------------------------------
|
||||||
\section{Un exemple}
|
\section{Un exemple}
|
||||||
|
|||||||
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...
|
||||||
|
% ==============================================================
|
||||||
|
|
||||||
|
|
||||||
@@ -27,6 +27,9 @@ Pour faire une planche contact d'une vidéo :
|
|||||||
jpeg:outdir=/tmp -sstep 60 monfichier.ts}
|
jpeg:outdir=/tmp -sstep 60 monfichier.ts}
|
||||||
|
|
||||||
% --------------------------------------------------------------------
|
% --------------------------------------------------------------------
|
||||||
|
%
|
||||||
|
% <doug> https://img.ly/blog/ultimate-guide-to-ffmpeg/
|
||||||
|
%
|
||||||
|
|
||||||
\section{ffmpeg}
|
\section{ffmpeg}
|
||||||
\index{ffmpeg}
|
\index{ffmpeg}
|
||||||
@@ -45,9 +48,20 @@ Extraire le son d'une vidéo Youtube :
|
|||||||
|
|
||||||
\texttt{ffmpeg -i fichiervideo.flv -vn -ar 44100 -ac 2 -f wav fichierson.wav}
|
\texttt{ffmpeg -i fichiervideo.flv -vn -ar 44100 -ac 2 -f wav fichierson.wav}
|
||||||
|
|
||||||
|
Extraire les images individuelles, dans le but avoué de les maltraiter
|
||||||
|
avec d'ignobles logiciels~:
|
||||||
|
|
||||||
|
\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
|
||||||
@@ -100,6 +114,12 @@ préciser le coef de qualité ( qscale : 1 = le mieux / 3 = correcte )
|
|||||||
|
|
||||||
https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/ \index{gif89a}
|
https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/ \index{gif89a}
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
ffmpeg -ss 0:5:59.600 -to 0:6:11.150 -i Downloads/foo.mp4 /tmp/tragic.gif
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
% -----------------------------------------------------------------
|
||||||
|
|
||||||
\subsection{Encoder un cloître}
|
\subsection{Encoder un cloître}
|
||||||
|
|
||||||
Là, nous sommes dans du \textsl{serious bizness}, puisque cette vidéo
|
Là, nous sommes dans du \textsl{serious bizness}, puisque cette vidéo
|
||||||
@@ -118,6 +138,40 @@ ffmpeg -nostdin \
|
|||||||
wip.mp4
|
wip.mp4
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
OMFG! Il manque le son.
|
||||||
|
|
||||||
|
% -----------------------------------------------------------------
|
||||||
|
|
||||||
|
\subsection{Capturer une vidéo}
|
||||||
|
|
||||||
|
%
|
||||||
|
% mais où ai-je bien pu trouver ça ?
|
||||||
|
%
|
||||||
|
|
||||||
|
\begin{verbatim}
|
||||||
|
read -p "*** Press Enter to start recording ***"
|
||||||
|
"$FFMPEGBIN" \
|
||||||
|
-thread_queue_size 512 \
|
||||||
|
-r "$RATE" \
|
||||||
|
-f v4l2 \
|
||||||
|
-video_size "$SIZE" \
|
||||||
|
-i "$VIDEODEVICE" \
|
||||||
|
-crf 0 \
|
||||||
|
-c:v libx264 \
|
||||||
|
-preset ultrafast \
|
||||||
|
-threads 4 \
|
||||||
|
"$FILENAME"
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
|
C'est un peu rudimentaire, mais il doit être possible de
|
||||||
|
\textsl{tweaker} ça avec d'autres options, genre fixer
|
||||||
|
la durée de la capture.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% -----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
\subsection{Questions}
|
\subsection{Questions}
|
||||||
|
|
||||||
Comment convertir lors de l'encodage un fichier \texttt{.WAV}
|
Comment convertir lors de l'encodage un fichier \texttt{.WAV}
|
||||||
@@ -138,9 +192,10 @@ ffmpeg -f x11grab -video\_size cif -framerate 25 -i :0.0 /tmp/out.mpg
|
|||||||
\section{VLC} \index{vlc}
|
\section{VLC} \index{vlc}
|
||||||
|
|
||||||
VLC est un peu le couteau suisse à 112 lames du multimédia.
|
VLC est un peu le couteau suisse à 112 lames du multimédia.
|
||||||
Son emblème est un cône de chantier, mais je ne sais pas
|
Son emblème est un cône de chantier, je ne sais pas
|
||||||
si ça a un sens caché. Mais soyons sérieux deux minutes.
|
si ça a un sens caché. Mais soyons sérieux deux minutes.
|
||||||
VLC propose une interface clickconvi, que nous allons
|
VLC propose une interface \textsl{clickconvi},
|
||||||
|
que nous allons
|
||||||
soigneusement éviter, pour nous concentrer sur la ligne
|
soigneusement éviter, pour nous concentrer sur la ligne
|
||||||
de commande.
|
de commande.
|
||||||
|
|
||||||
@@ -160,8 +215,24 @@ used for retrieving technical information and other
|
|||||||
metadata about audio or video files.
|
metadata about audio or video files.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
% --------------------------------------------------------------------
|
Et avec du \textbf{Zenitram} dedans \textit{:)}
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
\section{MPV} \index{MPV}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
mpv is a media player based on MPlayer and mplayer2. It supports a wide
|
||||||
|
variety of video file formats, audio and video codecs, and subtitle
|
||||||
|
types. Special input URL types are available to read input from a variety
|
||||||
|
of sources other than disk files. Depending on platform, a variety
|
||||||
|
of different video and audio output methods are supported.
|
||||||
|
\end {quote}
|
||||||
|
|
||||||
|
Un avantage de Mpv sur ses camarades (Mplayer, Ffplay\dots) est évident
|
||||||
|
dès que l'on joue une vidéo en boucle~: la transition entre la fin
|
||||||
|
et le début est propre.
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
|
||||||
\section{Autres trucs}
|
\section{Autres trucs}
|
||||||
|
|
||||||
@@ -170,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}
|
||||||
|
|
||||||
% --------------------------------------------------------------------
|
% --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
7
chap/wayland.tex
Normal file
7
chap/wayland.tex
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
\chapter{Wayland}
|
||||||
|
|
||||||
|
\label{chap:wayland} \index{wayland}
|
||||||
|
|
||||||
|
|
||||||
|
L'avenir sans X11 ?\index{X11}
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -39,6 +43,80 @@ ioctl: VIDIOC_ENUM_FMT
|
|||||||
|
|
||||||
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 ?
|
des lignes de code écrites en C ?
|
||||||
|
Il faut certainement passer par une suite d'appels
|
||||||
|
\texttt{ioctl}\index{ioctl} après ouverture du device,
|
||||||
|
mais la documentation est difficile à \textsl{greper}.
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
% nouveau : Tue Sep 3 11:14:13 UTC 2024
|
||||||
|
|
||||||
|
\section{libwebcam} \index{libwebcam}
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
The Webcam Library libwebcam is designed to simplify
|
||||||
|
the development of webcam applications, primarily on Linux but
|
||||||
|
with an option to be ported to other platforms, in particular
|
||||||
|
Solaris. It realizes part of what the unwritten Video4Linux user
|
||||||
|
space library was always supposed to be: an easy to use library
|
||||||
|
that shields its users from many of the difficulties and problems
|
||||||
|
of using the V4L2 API directly.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
% nouveau du Tue Sep 17 08:03:49 UTC 2024
|
||||||
|
|
||||||
|
\section{UVC} \index{UVC}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{quote}
|
||||||
|
L'USB video device class (aussi appelé USB video class abrégé en UVC)
|
||||||
|
est un protocole de gestion de périphériques électroniques vidéo via
|
||||||
|
les ports de type USB\index{USB}.
|
||||||
|
Il permet de gérer les flux vidéo dans différents encodages, les images fixes,
|
||||||
|
ainsi que le contrôle des appareils qui le permettent.
|
||||||
|
\end{quote}
|
||||||
|
|
||||||
|
|
||||||
|
Le jour\footnote{Lundi 17 septembre 2024} même
|
||||||
|
où je me penche sur cette techno, premier souci~:
|
||||||
|
\textsl{Le pilote pour les WebCams UVC
|
||||||
|
– standard utilisé pour les caméras USB modernes –
|
||||||
|
n’est pas encore au point et n’est pas inclus dans les
|
||||||
|
versions publiées de Haiku.}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
|
||||||
|
\section{GameBoy camera}
|
||||||
|
|
||||||
|
%
|
||||||
|
% trouvé dans pleroma
|
||||||
|
%
|
||||||
|
|
||||||
|
Voilà (désolé dur de faire moins technique en 500 charactères):
|
||||||
|
|
||||||
|
\texttt{sudo modprobe v4l2loopback exclusive\_caps\=1 video\_nr\=7 %
|
||||||
|
card\_label="WebcamVirtuelle"}
|
||||||
|
|
||||||
|
On créé un périphérique de caméra virtuelle sur /dev/video7
|
||||||
|
|
||||||
|
\texttt{ffmpeg -video\_size 352x288 -i /dev/video0 -i ./palette.png
|
||||||
|
-lavfi fps=10,scale=w=128:h=112,paletteuse=dither=bayer,format=yuyv422
|
||||||
|
-f v4l2 /dev/video7}
|
||||||
|
|
||||||
|
On fait une chaîne ffmpeg de la webcam réelle vers la virtuelle,
|
||||||
|
en redimensionnant en 128x112 1/2
|
||||||
|
|
||||||
|
puis en appliquant un algorithme de dithering et une palette de
|
||||||
|
couleurs (juste un PNG carré avec les différentes couleurs à utiliser
|
||||||
|
pour le dithering, je peux le fournir si besoin).
|
||||||
|
Enfin on force un format pour la webcam de destination et on sort
|
||||||
|
sur son fichier (/dev/video7 comme défini tout à l'heure).
|
||||||
|
|
||||||
|
C'est pas propre (et il faudrait que je change d'algorithme pour le
|
||||||
|
scaling parce qu'il y a un effet de flou désagréable), MAIS ça
|
||||||
|
fonctionne et le rendu ressemble.
|
||||||
|
|
||||||
% --------------------------------------------------------------------
|
% --------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -46,18 +124,21 @@ des lignes de code écrites en C ?
|
|||||||
\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,12 +34,23 @@ 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
|
||||||
\texttt{\# service lighttpd force-reload}, voilà.
|
\texttt{\# service lighttpd force-reload}, voilà.
|
||||||
|
|
||||||
|
Question : comment forcer le \texttt{Content-Type} pour un type particulier
|
||||||
|
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 = ("") \}}
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
@@ -43,34 +60,21 @@ en erreur 403\index{403} ?\linebreak
|
|||||||
\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.
|
||||||
|
|
||||||
|
|
||||||
% ==============================================================
|
% ==============================================================
|
||||||
|
|
||||||
|
|||||||
6
code/.gitignore
vendored
6
code/.gitignore
vendored
@@ -12,10 +12,14 @@ foo
|
|||||||
get-signal
|
get-signal
|
||||||
hello
|
hello
|
||||||
listen-osc
|
listen-osc
|
||||||
no-op
|
C/no-op
|
||||||
|
C/slowprint
|
||||||
*.o
|
*.o
|
||||||
plugiciel.so
|
plugiciel.so
|
||||||
send-osc
|
send-osc
|
||||||
thread-demo
|
thread-demo
|
||||||
voirenv
|
voirenv
|
||||||
|
|
||||||
xform/yesyno
|
xform/yesyno
|
||||||
|
|
||||||
|
debug/spy_getenv
|
||||||
|
|||||||
0
code/ABC/README.md
Normal file
0
code/ABC/README.md
Normal file
9
code/ABC/paddy.abc
Normal file
9
code/ABC/paddy.abc
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
X:42
|
||||||
|
T:Paddy O'Rafferty
|
||||||
|
C:Trad.
|
||||||
|
M:6/8
|
||||||
|
K:D
|
||||||
|
dff cee|def gfe|dff cee|dfe dBA|dff cee|def gfe|faf gfe|1 dfe dBA:|2 dfe dcB||
|
||||||
|
~A3 B3|gfe fdB|AFA B2c|dfe dcB|~A3 ~B3|efe efg|faf gfe|1 dfe dcB:|2 dfe dBA||
|
||||||
|
fAA eAA|def gfe|fAA eAA|dfe dBA|fAA eAA|def gfe|faf gfe|dfe dBA:|
|
||||||
|
|
||||||
12
code/Basic/README.md
Normal file
12
code/Basic/README.md
Normal file
@@ -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...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
6
code/Basic/bywater-1.bas
Normal file
6
code/Basic/bywater-1.bas
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
10 CLEAR
|
||||||
|
20 FOR I=2 TO 5
|
||||||
|
30 PRINT I, I*I
|
||||||
|
40 NEXT I
|
||||||
|
50 SYSTEM
|
||||||
|
|
||||||
3
code/Basic/yabasic-1.bas
Normal file
3
code/Basic/yabasic-1.bas
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
for i=1 to 10
|
||||||
|
print i, i*i
|
||||||
|
next
|
||||||
5
code/Basic/yabasic-2.bas
Normal file
5
code/Basic/yabasic-2.bas
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
open window 511,511
|
||||||
|
for x=10 to 495 step 5:for y=10 to 495 step 5
|
||||||
|
colour x/2,y/2,0
|
||||||
|
fill rectangle x+1,y+1,x+4,y+4
|
||||||
|
next y:next x
|
||||||
4
code/C/.gitignore
vendored
Normal file
4
code/C/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
fgets-simple
|
||||||
|
demo-strtok
|
||||||
|
packtest
|
||||||
|
use_envp
|
||||||
35
code/C/Makefile
Normal file
35
code/C/Makefile
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
# exemples pour le chapitre sur le C
|
||||||
|
# new Sat Feb 11 12:06:34 CET 2023
|
||||||
|
|
||||||
|
|
||||||
|
all: no-op slowprint fgets-simple packtest use_envp
|
||||||
|
|
||||||
|
# simplified version of the canonical first C program
|
||||||
|
hello: hello.c Makefile
|
||||||
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
|
# please show me the command line
|
||||||
|
arguments: arguments.c Makefile
|
||||||
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
|
no-op: no-op.c Makefile
|
||||||
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
|
slowprint: slowprint.c Makefile
|
||||||
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
|
fgets-simple: fgets-simple.c Makefile
|
||||||
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
|
demo-strtok: demo-strtok.c Makefile
|
||||||
|
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 $@
|
||||||
|
|
||||||
57
code/C/demo-strtok.c
Normal file
57
code/C/demo-strtok.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* +-------------+
|
||||||
|
* | demo strtok |
|
||||||
|
* +-------------+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
/*-------------------------------------------------------*/
|
||||||
|
void dump_line(char *titre, char *ligne, int combien)
|
||||||
|
{
|
||||||
|
int foo;
|
||||||
|
unsigned char *ptr;
|
||||||
|
|
||||||
|
printf(" --- %s\n", titre);
|
||||||
|
ptr = (unsigned char *)ligne;
|
||||||
|
for (foo=0; foo<combien; foo++) {
|
||||||
|
if (ptr[foo]) printf("%02x ", ptr[foo]);
|
||||||
|
else printf("\\0 ");
|
||||||
|
}
|
||||||
|
puts("");
|
||||||
|
for (foo=0; foo<combien; foo++) {
|
||||||
|
printf(" %c ", isprint(ptr[foo]) ? ptr[foo] : ' ');
|
||||||
|
}
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
/*-------------------------------------------------------*/
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char input[] = "foo bar\tquux wiz";
|
||||||
|
char *cptr, *copie;
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
dump_line("original", input, sizeof(input));
|
||||||
|
copie = strdup(input);
|
||||||
|
dump_line("copie", copie, sizeof(input));
|
||||||
|
puts("");
|
||||||
|
|
||||||
|
cptr = strtok(copie, " \t");
|
||||||
|
dump_line("1er strtok", copie, sizeof(input));
|
||||||
|
printf(" got [%s]\n", cptr);
|
||||||
|
puts("");
|
||||||
|
|
||||||
|
puts(" two more strtok...");
|
||||||
|
cptr = strtok(NULL, " \t");
|
||||||
|
printf(" got [%s]\n", cptr);
|
||||||
|
cptr = strtok(NULL, " \t");
|
||||||
|
printf(" got [%s]\n", cptr);
|
||||||
|
dump_line("2eme & 3me strtok", copie, sizeof(input));
|
||||||
|
|
||||||
|
foo = cptr - copie; /* this is the hack :) */
|
||||||
|
|
||||||
|
printf(" index = %d\n", foo);
|
||||||
|
printf(" and we have [%s] :)\n", input+foo);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
14
code/C/fgets-simple.c
Normal file
14
code/C/fgets-simple.c
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* exemple d'utilisation de 'fgets'
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#define TL 12
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char buffer[TL+1];
|
||||||
|
while( fgets(buffer, TL, stdin) ) {
|
||||||
|
printf(" %4ld %s\n", strlen(buffer), buffer);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
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);
|
||||||
|
}
|
||||||
@@ -1,11 +1,7 @@
|
|||||||
/*
|
|
||||||
* Hello, Sun.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
printf("hello world.\n");
|
puts("hello world.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
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.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
42
code/C/slowprint.c
Normal file
42
code/C/slowprint.c
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int c, sec, nano;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* convert the slowdown value to delay */
|
||||||
|
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()) )
|
||||||
|
{
|
||||||
|
putchar(c), fflush(stdout);
|
||||||
|
nanosleep(&ts, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
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,26 +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 $@
|
|
||||||
|
|
||||||
no-op: no-op.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);
|
||||||
|
|
||||||
3
code/R/README.md
Normal file
3
code/R/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# R
|
||||||
|
|
||||||
|
Be warned, Only garbage here.
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
# Le code des tetaricks
|
# Le code des Tetatricks
|
||||||
|
|
||||||
Attention, c'est un peu le fouillis.
|
Attention, c'est un peu le fouillis.
|
||||||
|
|||||||
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
|
||||||
|
}
|
||||||
|
|
||||||
21
code/awk/mkunion.awk
Normal file → Executable file
21
code/awk/mkunion.awk
Normal file → Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/awk -f
|
||||||
|
|
||||||
|
# create the sdl object: an union of sphere
|
||||||
|
BEGIN {
|
||||||
|
nbre = 0
|
||||||
|
print "#declare Bubulles = object"
|
||||||
|
print "{ \nunion { "
|
||||||
|
}
|
||||||
|
|
||||||
|
# active portion of the code
|
||||||
|
{
|
||||||
|
printf(" sphere { <%f, %f, %f>, %f }\n", \
|
||||||
|
$1, $2, $3, $4 )
|
||||||
|
nbre++
|
||||||
|
}
|
||||||
|
|
||||||
|
# closing sdl structure
|
||||||
|
END {
|
||||||
|
print " }\n}"
|
||||||
|
printf "// %d bubulles\n", nbre
|
||||||
|
}
|
||||||
|
|||||||
0
code/bdd/README.md
Normal file
0
code/bdd/README.md
Normal file
20
code/bdd/mkgdbm.pl
Normal file
20
code/bdd/mkgdbm.pl
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use GDBM_File;
|
||||||
|
my $nomdb = "exemple.gdbm";
|
||||||
|
my (%DB, @champs);
|
||||||
|
my ($user, $gecos);
|
||||||
|
open(SOURCE, "< /etc/passwd") or die "source $!";
|
||||||
|
tie(%DB, "GDBM_File", $nomdb, GDBM_WRCREAT, 0666) or die "gdbm $!";
|
||||||
|
|
||||||
|
while (<SOURCE>) {
|
||||||
|
@champs = split ":", $_;
|
||||||
|
$user = $champs[0]."\0";
|
||||||
|
$gecos = $champs[4]."\0";
|
||||||
|
$DB{$user} = $gecos;
|
||||||
|
}
|
||||||
|
|
||||||
|
untie %DB;
|
||||||
|
close SOURCE;
|
||||||
|
0;
|
||||||
@@ -1,14 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
*
|
|
||||||
* spy_getenv.so: spy_getenv.c Makefile
|
* 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
9
code/fortran/.gitignore
vendored
Normal file
9
code/fortran/.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
plplotting
|
||||||
|
dessiner
|
||||||
|
printty
|
||||||
|
|
||||||
|
*.png
|
||||||
|
*.gif
|
||||||
|
WS/*.png
|
||||||
|
WS/*.eps
|
||||||
23
code/fortran/Makefile
Normal file
23
code/fortran/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
INCS = -I/usr/include/plplot -I/usr/lib/x86_64-linux-gnu/fortran/modules/plplot
|
||||||
|
|
||||||
|
# sinple examples
|
||||||
|
|
||||||
|
printty: printty.f90 Makefile
|
||||||
|
gfortran -g $< $(INCS) -o $@
|
||||||
|
|
||||||
|
|
||||||
|
# more complex garbage
|
||||||
|
|
||||||
|
plplotting: plplotting.f90 Makefile
|
||||||
|
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
||||||
|
|
||||||
|
dessiner: dessiner.f90 Makefile
|
||||||
|
gfortran -g $< $(INCS) -lplplotfortran -o $@
|
||||||
|
|
||||||
|
|
||||||
|
plot89a.gif: dessiner Makefile
|
||||||
|
rm -f WS/A????.png
|
||||||
|
./dessiner
|
||||||
|
convert -delay 10 -colors 42 WS/A????.png $@
|
||||||
|
wc -c plot89a.gif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user