Compare commits
126 Commits
3794eb2608
...
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 | ||
|
|
73a611e55f | ||
|
|
f79ae3ef80 | ||
|
|
1fabb2c89f | ||
|
|
f2acdcef9b | ||
|
|
9e882d49cb |
19
.gitignore
vendored
19
.gitignore
vendored
@@ -13,22 +13,3 @@ tetatricks.log
|
||||
tetatricks.pdf
|
||||
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.
|
||||
|
||||
`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.
|
||||
|
||||
% ====================================================================
|
||||
413
chap/C.tex
413
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.
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
|
||||
\section{Hello World}
|
||||
|
||||
Hop, on y va...
|
||||
|
||||
Le tout début d'un programme en C est l'appel par
|
||||
le \textsl{runtime} d'une fonction
|
||||
nommée \texttt{main} qui reçoit deux paramètres
|
||||
Le tout début de la vie d'un programme écrit en C est l'appel par
|
||||
le \textsl{runtime}\footnote{\texttt{crt0.s}} d'une fonction
|
||||
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.
|
||||
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.
|
||||
Nous appelons à ce moment la fonction \texttt{printf}
|
||||
Un fois passé l'entrée, nous sommes dans la partie active.
|
||||
Nous appelons à ce moment une fonction de la bibliothèque
|
||||
standard : \texttt{puts}
|
||||
qui a pour but d'afficher sur l'écran le texte
|
||||
passé en paramètre.
|
||||
|
||||
Voila, c'est fait. Nous savons dire bonjour au monde.
|
||||
Point suivant~: dire boujour à quelqu'un d'autre. Et pour
|
||||
Voila, c'est fait. Dans les règles de l'art.
|
||||
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
|
||||
de commande.
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
|
||||
\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~:
|
||||
|
||||
\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}
|
||||
|
||||
@@ -70,7 +75,16 @@ En C, les tableaux commencent toujours à l'indice 0.
|
||||
Pour le traitement des options, il faut sauter à
|
||||
la page \pageref{getopt}.
|
||||
|
||||
% ---------------------------------------------------------
|
||||
. . .
|
||||
|
||||
\begin{verbatim}
|
||||
if (config->optind < config->argc)
|
||||
for (int i = config->optind; i < config.argc; ++i)
|
||||
process(config->argv[i]);
|
||||
\end{verbatim}
|
||||
|
||||
% =========================================================
|
||||
|
||||
\section{Les variables}
|
||||
|
||||
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} :
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
\section{Les fonctions}
|
||||
|
||||
Nous avons vu brièvement dans la première section de ce chapitre
|
||||
la fonction \texttt{main} et ses deux paramètres.
|
||||
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}
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
|
||||
\section{Entrées / Sorties}
|
||||
\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}
|
||||
|
||||
\texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots
|
||||
@@ -145,9 +171,12 @@ un peu plus loin.
|
||||
\subsection{Écrire : \texttt{printf}}
|
||||
\index{printf}
|
||||
|
||||
La fonction \texttt{printf} permet d'afficher le contenu d'une
|
||||
(ou plusieurs)
|
||||
variable sous divers formats contrôlables par un petit DSL.
|
||||
La fonction \texttt{printf} permet d'afficher sur la sortie
|
||||
standard le contenu d'une (ou plusieurs)
|
||||
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}
|
||||
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.
|
||||
|
||||
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~:
|
||||
|
||||
\begin{itemize}
|
||||
\begin{itemize} % ------------
|
||||
|
||||
\item{\textsl{caractères crus} : ils sont directements poussés vers
|
||||
la sortie. La plupart d'entre eux donnent le résultat attendu.}
|
||||
|
||||
\item{\textsl{codes de format} : les fragments qui commencent par le
|
||||
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
|
||||
'\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.
|
||||
}
|
||||
|
||||
\end{itemize}
|
||||
\end{itemize} % ------------
|
||||
|
||||
Quand à la valeur de retour, elle contient le nombre de caractères
|
||||
efectivement écrits. Ce nombre peut être différent du nombre attendu,
|
||||
par exemple si le disque est saturé.
|
||||
effectivement écrits. Ce nombre peut être différent du nombre attendu
|
||||
en cas d'erreur, par exemple si le disque est saturé.
|
||||
|
||||
Ce nombre peut être utilisé pour un affichage de multiples données
|
||||
en limitant la taille des lignes.
|
||||
Ce nombre, que beaucoup de gens négligent, peut être utilisé pour un
|
||||
affichage de multiples données en limitant la longueur des lignes~:
|
||||
|
||||
\begin{verbatim}
|
||||
int foo, nbre = 0;
|
||||
@@ -199,15 +229,110 @@ for (foo=0; foo<1000; foo++) {
|
||||
}
|
||||
\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}}
|
||||
\index{scanf}
|
||||
|
||||
Avez-vous bien révisé la section qui cause des pointeurs ?
|
||||
Ê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...}
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
||||
|
||||
\subsection{Les fichiers}\index{fopen}\index{fclose}
|
||||
|
||||
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, ...);
|
||||
\end{verbatim}
|
||||
|
||||
% =========================================================
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
||||
\section{Un filtre Unix}\label{filtre-unix}
|
||||
\section{Quelques filtres Unix}\label{filtre-unix}
|
||||
|
||||
Ce qu'on appelle un "filtre" est un logiciel destiné à transformer
|
||||
les données qui le traversent. Pour bien comprendre, le mieux,
|
||||
comme d'habitude, est un exemple. Il est un peu artificiel,
|
||||
il s'agit d'éliminer les lettres \textsc{o} et \textsc{p}.
|
||||
Le voici~:
|
||||
car il s'agit d'éliminer les lettres \textsc{o} et \textsc{p},
|
||||
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}
|
||||
$ echo apopoz | ./no-op
|
||||
@@ -271,23 +395,41 @@ $ ./no-op < no-op.c | head -5
|
||||
$
|
||||
\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
|
||||
utilisés et les usages possibles d'un tel filtre,
|
||||
il faut voir le concept de pipeline du shell en
|
||||
page \pageref{pipeline}.
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
|
||||
\section{Les pointeurs}\label{pointeur}\index{pointeur}
|
||||
|
||||
\textbf{Ah, enfin, on a failli attendre !}
|
||||
|
||||
Qu'est-ce qu'un pointeur ? La réponse est multiple, et c'est
|
||||
Qu'est-ce qu'un pointeur ?
|
||||
La réponse est multiple et parfois obscure, et c'est
|
||||
le pointeur qui fait à la fois la force et la faiblesse du C.
|
||||
Pour faire simple, un pointeur est une variable qui contient
|
||||
l'adresse dans la mémoire d'une autre variable.
|
||||
|
||||
Mais en fait c'est un peu plus subtil : un pointeur « connait » la taille
|
||||
Mais en fait c'est un peu plus subtil :
|
||||
un pointeur « connait » le type (donc la taille)
|
||||
de l'objet pointé, et peut donc « parcourir » un tableau de ces objets.
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -297,11 +439,31 @@ ptr = tableau; // *ptr désigne tableau[0];
|
||||
ptr++; // *ptr désigne tableau[1];
|
||||
\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}
|
||||
|
||||
\textbf{Attention !} L'utilisation abusive du préprocesseur
|
||||
peut générer des trolls de plusieurs centaines de posts.
|
||||
|
||||
Nous avons déja abordé de loin la directive \texttt{\#include},
|
||||
qui fait partie du préprocesseur, comme toutes les lignes
|
||||
de code commençant par le caractère \textbf{\#}.
|
||||
@@ -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
|
||||
par l'expérimentation. Mais ça n'est pas fini.
|
||||
|
||||
Ce sympathique \textsf{préproc'} nous permet aussi de faire
|
||||
Ce sympathique \textsf{préproc'}%
|
||||
\footnote{Certains l'appellent même tendrement « mon cépépé »
|
||||
avec un regard de guimauve mal grillée.}
|
||||
nous permet aussi de faire
|
||||
de la compilation conditinnelle, et ça, c'est cool parce que
|
||||
ça ouvre la porte à plein de choses.
|
||||
Par exemple, l'instrumentation du code afin de faciliter
|
||||
@@ -353,10 +518,10 @@ pris en compte.
|
||||
Une chose très fourbe dont voici un exemple ?
|
||||
|
||||
\begin{verbatim}
|
||||
#define pixidx(fi,x,y) (((y)*fi->width)+(x))
|
||||
#define getRpix(fi,x,y) (fi->R[ 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 pixidx (fi,x,y) (((y)*fi->width)+(x))
|
||||
#define getRpix (fi,x,y) (fi->R[ 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)) ])
|
||||
\end{verbatim}
|
||||
|
||||
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
|
||||
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}
|
||||
|
||||
Une structure est une sorte de boite dans laquelle on peut
|
||||
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}
|
||||
\index{malloc} \index{free}
|
||||
@@ -399,9 +568,9 @@ avec les variables locales. Il est temps de passer à une gestion
|
||||
explicite de celle-ci~:
|
||||
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.
|
||||
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~:
|
||||
|
||||
@@ -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
|
||||
au mc/p avec \texttt{free(ptr);}.
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
|
||||
\section{Gérer les options}\index{getopt}\label{getopt}
|
||||
|
||||
@@ -456,19 +625,92 @@ extern int optind, opterr, optopt;
|
||||
La page de man de getopt(3) contient des explications détaillées
|
||||
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}
|
||||
|
||||
Variables non initialisées.
|
||||
Le C est un langage parsemé de fosses, de chausse-trapes et de
|
||||
pièges fourbes et sournois. Sans parler des UBs, hein\dots
|
||||
|
||||
Sortir d'un tableau.
|
||||
\begin{itemize}
|
||||
\item{Variables non initialisées.}
|
||||
|
||||
Dépassement de la taille d'une chaine.
|
||||
\item{Sortir d'un tableau (par le haut ou par le bas).}
|
||||
|
||||
Libérer deux fois la mémoire.
|
||||
\item{Dépassement de la taille d'une chaine.}
|
||||
|
||||
\textsl{file pointer} invalide.
|
||||
\item{Libérer deux fois la mémoire.}
|
||||
|
||||
\item{\textsl{file pointer} invalide.}
|
||||
\end{itemize}
|
||||
|
||||
% =========================================================
|
||||
|
||||
@@ -476,11 +718,13 @@ Libérer deux fois la mémoire.
|
||||
|
||||
XXX \index{XXX}
|
||||
|
||||
Un ordinateur est déterministe.
|
||||
|
||||
% =========================================================
|
||||
|
||||
\section{Debug} \index{Debug}
|
||||
|
||||
Des outils et astuces en page \pageref{chap:Debug}.
|
||||
Des outils et astuces en page \pageref{chap:debug}.
|
||||
|
||||
\begin{quote}
|
||||
splint is an annotation-assisted lightweight static checker.
|
||||
@@ -506,11 +750,14 @@ any strictly conforming program in which the use of the features
|
||||
specified in the header <string.h> , except the following functions:
|
||||
strdup , strndup , strcoll , strxfrm , strerror ." (4p6)
|
||||
|
||||
https://devblogs.microsoft.com/oldnewthing/20230109-00/?p=107685
|
||||
|
||||
% =========================================================
|
||||
|
||||
\section{Dessiner}
|
||||
|
||||
% XXX insert blabla here
|
||||
|
||||
\subsection{G2} \index{g2} \label{g2}
|
||||
|
||||
\begin{quote}
|
||||
@@ -520,6 +767,53 @@ functions for simultaneous generation of graphical output on different
|
||||
types of devices.
|
||||
\end{quote}
|
||||
|
||||
\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.
|
||||
|
||||
% =========================================================
|
||||
|
||||
\section{Ailleurs dans cet ouvrage}
|
||||
@@ -529,7 +823,8 @@ divers comme Open Sound Control (page \pageref{chap:OSC}) ou
|
||||
libsndfile (page \pageref{chap:son}).
|
||||
Et pour les gens du système~:
|
||||
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,
|
||||
à 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}
|
||||
|
||||
338
chap/Fortran.tex
338
chap/Fortran.tex
@@ -1,28 +1,48 @@
|
||||
\chapter{Fortran} \label{chap:Fortran} \index{Fortran}
|
||||
|
||||
\begin{quote}
|
||||
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
|
||||
guerre mondiale, en 1954, par
|
||||
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,
|
||||
cette version est aussi (aux yeux de vieux dinos) la plus pure,
|
||||
à 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://en.wikipedia.org/wiki/Fortran_95_language_features
|
||||
|
||||
\section{Gfortan} \index{gfortran}
|
||||
|
||||
Puis ce langage du passé a subi une évolution lente vers quelque
|
||||
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}.
|
||||
|
||||
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
|
||||
en \textsl{free form format}.
|
||||
|
||||
\begin{verbatim}
|
||||
\begin{lstlisting}
|
||||
$ cat hello.f90
|
||||
program hello
|
||||
implicit none
|
||||
@@ -40,7 +60,7 @@ end
|
||||
$ gfortran -Wall hello.f90 -o hello && ./hello
|
||||
hello world
|
||||
$
|
||||
\end{verbatim}
|
||||
\end{lstlisting}
|
||||
|
||||
% --------------------------------------------------------
|
||||
%
|
||||
@@ -48,12 +68,13 @@ $
|
||||
%
|
||||
\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
|
||||
par (mais pas que) deux canaux : les arguments de la ligne de commande
|
||||
et les variables d'environnement.
|
||||
|
||||
\begin{verbatim}
|
||||
\begin{lstlisting}
|
||||
program rum_me
|
||||
implicit none
|
||||
integer :: nbarg, foo
|
||||
@@ -67,17 +88,18 @@ program rum_me
|
||||
enddo
|
||||
endif
|
||||
end
|
||||
\end{verbatim}
|
||||
\end{lstlisting}
|
||||
|
||||
Si un des arguments doir être vu comme une valeur numérique,
|
||||
il faut la convertir avant usage. Exemple pour un nombre
|
||||
flottant~:
|
||||
il faut convertir la chaine de caractères avant usage.
|
||||
Exemple pour un nombre flottant~:
|
||||
|
||||
\begin{verbatim}
|
||||
character(len=89) :: arg
|
||||
real :: cx
|
||||
call getarg(2, string) ; read (string, *) cx
|
||||
\end{verbatim}
|
||||
\begin{lstlisting}
|
||||
character(len=89) :: arg
|
||||
real :: cx
|
||||
call getarg(2, string)
|
||||
read (string, *) cx
|
||||
\end{lstlisting}
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
@@ -86,21 +108,131 @@ flottant~:
|
||||
Rank, Size, \textsc{allocatable}, toussa\dots
|
||||
|
||||
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
|
||||
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}
|
||||
|
||||
Pour qui vient du C et de la philosophie Unix, la gestion
|
||||
des fichiers en Fortran est assez déroutante%
|
||||
\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}
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
\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}
|
||||
@@ -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}
|
||||
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}
|
||||
|
||||
Tentative de sranding faite à la rache.
|
||||
La dernière ligne va vous étonner.
|
||||
|
||||
\begin{verbatim}
|
||||
\begin{lstlisting}
|
||||
integer, dimension(3) :: tarray
|
||||
integer :: t3
|
||||
real :: dummy
|
||||
@@ -126,7 +297,23 @@ La dernière ligne va vous étonner.
|
||||
! after initializing the random generator engine,
|
||||
! you MUST use it for initializing the initializer
|
||||
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,
|
||||
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
|
||||
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}
|
||||
|
||||
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
|
||||
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}
|
||||
program dessine
|
||||
use plplot
|
||||
implicit none
|
||||
call plinit ()
|
||||
call plenv(-2.1, 2.1, -2.1, 2.1, 0, 0)
|
||||
call plend
|
||||
end program
|
||||
call plcol0 (15) ! pure white
|
||||
call pllab ("Fuzzfactor", "Yoyodines", "Some nice plots")
|
||||
\end{verbatim}
|
||||
|
||||
Il ne se passe pas grand chose, sauf la 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, Null, UserMemory et SVG.
|
||||
C'est intriguant de ne pas avoir au moins \textbf{un} format
|
||||
pixmap\index{pixmap}.
|
||||
Il est maintenant temps de poser un premier trait de crayon numérique
|
||||
sur notre feuille blanche numérique\footnote{Actuellement noire, mais
|
||||
nous trouverons bien comment changer ça}.
|
||||
La forme de ce tracé sera donnée par une suite de coordonnées
|
||||
flottantes \textsl{x/y}
|
||||
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.
|
||||
D'accord, mais dessiner quoi ?
|
||||
\begin{verbatim}
|
||||
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}
|
||||
|
||||
@@ -182,6 +431,17 @@ D'accord, mais dessiner quoi ?
|
||||
\item Comment déclarer une variable statique dans une procédure ?
|
||||
\item Pourquoi ne pas parler de DISLIN ?
|
||||
\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}
|
||||
|
||||
% --------------------------------------------------------
|
||||
\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}
|
||||
|
||||
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}
|
||||
|
||||
|
||||
@@ -218,6 +218,34 @@ d'un fichier \texttt{.mid} ?
|
||||
|
||||
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}
|
||||
|
||||
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}
|
||||
\index{OSC} \label{chap:OSC}
|
||||
|
||||
Wikipedia :
|
||||
Pour moi c'est une façon simple et élégante de faire discuter des
|
||||
ordinateurs et je ne dis pas ça parce que j'ai déja pas mal
|
||||
joué\footnote{https://git.tetalab.org/tTh/gadgets-OSC} avec,
|
||||
mais parce c'est probablement vrai\dots
|
||||
|
||||
% ================================================================
|
||||
\section{C'est quoi ?}
|
||||
|
||||
D'après Wikipedia :
|
||||
\textsl{OSC est un format de transmission de données entre ordinateurs,
|
||||
synthétiseurs, robots ou tout autre matériel ou logiciel compatible,
|
||||
conçu pour le contrôle en temps réel.
|
||||
@@ -10,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
|
||||
à l'ancienne norme MIDI\index{MIDI}\dots}
|
||||
|
||||
|
||||
% ================================================================
|
||||
\section{Programmation}
|
||||
|
||||
Actuellement, j'utilise (pour le C) \texttt{liblo}\index{liblo}
|
||||
qui reste simple
|
||||
à utiliser tout en permettant de descendre à un bas niveau.
|
||||
Cette bibliothèque est livrée avec deux outils que nous
|
||||
allons voir maintenant.
|
||||
qui reste simple à utiliser
|
||||
tout en permettant de descendre à un bas niveau.
|
||||
Elle fonctionne sur un modèle asynchrone
|
||||
(ce qui peut poser des soucis selon le contexte d'utilisation)
|
||||
et de bonnes possibilités de filtrage selon certains critères.
|
||||
|
||||
|
||||
Cette bibliothèque est livrée avec deux outils de test/debug que nous
|
||||
allons voir maintenant, et que je vous encourage à apprivoiser.
|
||||
|
||||
% ================================================================
|
||||
|
||||
\section{oscdump \& oscsend}
|
||||
\index{oscdump}\index{oscsend}
|
||||
|
||||
\textbf{Envoyer :}
|
||||
|
||||
Pour envoyer, il faut bien définir une destination. Une fois
|
||||
de plus, le couple IP adresse/port est utilisé. Ce sont les
|
||||
deux premiers paramètres.
|
||||
Pour envoyer des données, il faut bien définir une destination. Une fois
|
||||
de plus, le triplet IP adresse/port/chemin est utilisé.
|
||||
Ce sont les trois premiers paramètres de la commande~:
|
||||
\begin{verbatim}
|
||||
tth@debian:~$ oscsend localhost 1664 /tmp/kmem is 61 'meg, efface !'
|
||||
tth@debian:~$
|
||||
tth@debian:~$ oscsend localhost 1664 /tmp/kmem 'is' 61 'meg, efface !'
|
||||
\end{verbatim}
|
||||
|
||||
La chaine \texttt{is} que vous voyez dans la ligne de commande
|
||||
décrit le type des paramètres qui suivent~:
|
||||
\texttt{i} est pour un integer et \texttt{s} pour une
|
||||
chaine (notez les simples quotes pour passer les caractères
|
||||
speciaux du shell).
|
||||
chaine de caractères
|
||||
(notez les simples quotes autour du texte pour passer les
|
||||
caractères speciaux du shell, comme l'espace).
|
||||
Il existe d'autres types de paramètres que nous verrons plus loin.
|
||||
|
||||
\vspace{1em} \textbf{Écouter :}
|
||||
|
||||
C'est beaucoup plus simple, il suffit de donner le numéro
|
||||
de port UDP sur lequel nous allons écouter.
|
||||
L'option \texttt{-L} est utile si vous voulez exploiter
|
||||
la sortie de oscdump,
|
||||
par exemple avec "\texttt{oscdump 9000 | cat -n}" pour numéroter
|
||||
les évènements reçus.
|
||||
|
||||
\textbf{Ecouter :}
|
||||
\begin{verbatim}
|
||||
tth@debian:~$ oscdump 1664
|
||||
/tmp/kmem is 61 "meg, efface !"
|
||||
^C
|
||||
tth@debian:~$
|
||||
\end{verbatim}
|
||||
|
||||
% ------------------------------------------------
|
||||
Pour descendre plus bas dans la pile, on pourra efficacement utiliser
|
||||
un \textsl{dumper} de messages UDP qui nous montrera le cœur des trames.
|
||||
Voici ce que l'on voit de l'envoi décrit page \pageref{sendosc}~:
|
||||
|
||||
\begin{verbatim}
|
||||
udp_dumper: listen on port 9000
|
||||
---+ frame 0 32 bytes t= 6.179 sec.
|
||||
0 | 2f 64 65 6d 6f 00 00 00 2c 69 73 00 00 00 00 3d | /demo...,is....= |
|
||||
16 | 6d 65 67 2c 20 65 66 66 61 63 65 20 21 00 00 00 | meg, efface !... |
|
||||
32 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
|
||||
\end{verbatim}
|
||||
|
||||
On y retrouve certaines des choses le chemin, la liste des types,
|
||||
le contenu des messages, toutes choses qui seront
|
||||
décrites en détail dans la page \pageref{trameosc}.
|
||||
% ================================================================
|
||||
|
||||
\section{Exemple de code}
|
||||
|
||||
@@ -56,18 +98,26 @@ utilise un thread d'écoute qui appelle des
|
||||
\textsl{callbacks} préalablement "accrochés",
|
||||
\textsl{hooked} en vrai langue.
|
||||
|
||||
\lstinputlisting[language=c]{code/listen-osc.c}
|
||||
\lstinputlisting[language=c]{code/OSC/listen-osc.c}
|
||||
|
||||
\textbf{Envoyer :}
|
||||
\textbf{Envoyer :} \label{sendosc}
|
||||
|
||||
Cette partie là est beaucoup plus simple.
|
||||
|
||||
\lstinputlisting[language=c]{code/send-osc.c}
|
||||
\lstinputlisting[language=c]{code/OSC/send-osc.c}
|
||||
|
||||
J'avoue ne pas encore savoir ce que veut bien dire la
|
||||
valeur de retour.
|
||||
|
||||
% ------------------------------------------------
|
||||
% ================================================================
|
||||
|
||||
\section{La trame OSC} \label{trameosc}
|
||||
|
||||
\textsf{Après tout, ce ne sont que quelques octets.}
|
||||
|
||||
% ================================================================
|
||||
|
||||
|
||||
\section{En Perl} \index{Perl}
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -80,14 +130,27 @@ or die "Could not start client: $@\n";
|
||||
$client->send(['/proc/kcore', 'i', 61, 's', "bla"]);
|
||||
\end{verbatim}
|
||||
|
||||
% ------------------------------------------------
|
||||
% ================================================================
|
||||
% nouveau: Sat Jul 15 07:14:10 UTC 2023
|
||||
|
||||
% \section{Le routage}
|
||||
|
||||
% WIP...\index{XXX}
|
||||
|
||||
|
||||
% ================================================================
|
||||
|
||||
\section{Autres logiciels}
|
||||
|
||||
Beaucoup d'autres logiciels peuvent être controlés par OSC, ou
|
||||
générer des trames OSC : on peut citer
|
||||
Processing\index{Processing},
|
||||
Processing\index{processing},
|
||||
Chuck\index{Chuck} (page \pageref{chuck-osc}),
|
||||
Puredata\index{puredata}.
|
||||
Certains prétendent même qu'un vieux néo-rural tente de
|
||||
faire un \textsl{binding} pour le
|
||||
Fortran\index{fortran} moderne.
|
||||
\dots
|
||||
|
||||
% ================================================================
|
||||
|
||||
|
||||
@@ -11,18 +11,78 @@ Il est de ce fait très orienté vers la manipulation de
|
||||
données textuelles et contient d'énormes facilités d'utilisation
|
||||
des expressions régulières.
|
||||
|
||||
Il fut un temps, dans le siècle précédent, où il était le maitre
|
||||
Il fut un temps béni, dans le siècle précédent, où il était le maitre
|
||||
incontesté du Web\index{web} interactif, de par son intégration
|
||||
dans le serveur Apache\index{Apache},
|
||||
et de modules d'écriture de clients http\index{http}.
|
||||
dans le serveur Apache\index{Apache}
|
||||
(les fameux scripts \textsc{cgi}\index{cgi}),
|
||||
et de modules d'écriture de clients http\index{http}
|
||||
(page \pageref{perlhttp}).
|
||||
Mais ce temps est-il révolu ? Nous le verrons dans un
|
||||
prochain épisode.
|
||||
|
||||
Le débutant peut facilement n'utiliser qu'un sous-ensemble du langage,
|
||||
mais ce serait se priver de quelques \textit{patterns} assez
|
||||
mais ce serait se priver de quelques \textit{design patterns} assez
|
||||
efficients.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Le texte}
|
||||
\section{Perl, le départ}
|
||||
|
||||
La méthode shebang. Tout le monde connait maintenant le shebang,
|
||||
ce n'est pas la peine de radoter dessus.
|
||||
On va donc commencer par le premier exemple, puis enchainer
|
||||
sur les petits trucs à savoir, en mode « recette à la rache ».
|
||||
|
||||
\begin{verbatim}
|
||||
#!/usr/bin/perl
|
||||
print "hello world"
|
||||
\end{verbatim}
|
||||
|
||||
La méthode purecli.
|
||||
|
||||
\begin{verbatim}
|
||||
tth@redlady:~ $ echo "print \"hello world\n\";" | perl
|
||||
hello world
|
||||
\end{verbatim}
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Modèle d'exécution}
|
||||
|
||||
|
||||
% ------------------------------------------------------
|
||||
\section{Les variables}
|
||||
|
||||
Auto-vivification.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\section{Gestion des modules} \index{CPAN}
|
||||
|
||||
Tout comme pour le Fortan Moderne, c'est une notion essentielle.
|
||||
Un exemple très simple, le module Dummy\index{dummy}.
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
\label{perlhttp}
|
||||
\section{Le \texttt{http}} \index{http} \index{protocole}
|
||||
|
||||
HTTP (Hyper Text Transfert Protocole) est le protocole qui
|
||||
est à la base du bien connu
|
||||
\textsl{World Wide Web}
|
||||
la chose que les gens appelent faussement l'internet.
|
||||
\index{www}\index{gafam}
|
||||
L'écosystème Perl est bien équipé pour
|
||||
agir dans ce monde là.
|
||||
|
||||
|
||||
% Scrapping de la patate en vue !
|
||||
% https://al.smeuh.org/cgi-bin/express.pritz
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
|
||||
\section{Traiter du texte}
|
||||
|
||||
Un cas concret~: générer du code en langage \texttt{C} à partir
|
||||
d'un fichier traité ligne par ligne. Chacune de ces lignes est
|
||||
@@ -51,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}}
|
||||
|
||||
Scrapping de la patate en vue !
|
||||
|
||||
https://al.smeuh.org/cgi-bin/express.pritz
|
||||
\texttt{exiftool - Read and write meta information in files} \index{exiftool}
|
||||
|
||||
% ------------------------------------------------------
|
||||
|
||||
|
||||
@@ -9,13 +9,19 @@ gens faire du code en Python,
|
||||
certains même font de choses très avancées.
|
||||
Et beaucoup de ces gens essayent de me convaincre que c'est
|
||||
un langage vraiment trop bien, trop moderne, trop dans la
|
||||
\textit{vibe} du devops, battery included, toussa.
|
||||
\textit{vibe} du devops\index{devops}, battery included, toussa.
|
||||
Quelques uns d'entre eux vont même jusqu'à me parler d'un
|
||||
certain \textbf{canard} qui faciliterait bien la vie
|
||||
des preogrammeurs.
|
||||
|
||||
Je ne suis pas convaincu.
|
||||
|
||||
Parce qu'un langage où, si tu remplaces un caractère \textbf{invisible}
|
||||
par un autre caractère tout aussi \textbf{invisible}, le programme
|
||||
ne marche plus, je trouve ça un peu craignos.
|
||||
Bien entendu, certains vont te dire~: « configurer l'éditeur, gna, gna. »
|
||||
mais bon, être dépendant de la conf' d'un éditeur pour que les
|
||||
choses fonctionnent, c'est un peu limite.
|
||||
|
||||
|
||||
\section{Mais quand même...}
|
||||
@@ -28,3 +34,19 @@ Je ne suis pas convaincu.
|
||||
\end{figure}
|
||||
|
||||
|
||||
\section{Quelques trucs}
|
||||
|
||||
On souhaite parfois partager rapidement quelques fichiers sur
|
||||
le réseau local. Avec une de batteries incluses, c'est facile.
|
||||
|
||||
À l'ancienne :
|
||||
|
||||
\begin{verbatim}
|
||||
$ python -m SimpleHTTPServer 9000
|
||||
\end{verbatim}
|
||||
|
||||
Et maintenant :
|
||||
|
||||
\begin{verbatim}
|
||||
$ python3 -m http.server 9000
|
||||
\end{verbatim}
|
||||
|
||||
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,
|
||||
and collaborating on research results and projects.}
|
||||
|
||||
% ==================================================================
|
||||
|
||||
\section{slrn}
|
||||
\index{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
|
||||
\end{verbatim}
|
||||
|
||||
% ==================================================================
|
||||
|
||||
\section{leafnode}
|
||||
\index{leafnode}
|
||||
|
||||
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}
|
||||
\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
|
||||
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
|
||||
pas le même nameserver.} peut facilement
|
||||
faire translateur d'adresse pour un réseau branché sur
|
||||
son eth, à condition de connaitre les
|
||||
son \texttt{eth}, à condition de connaitre les
|
||||
incantations magiques
|
||||
(qui sont ici très linuxisantes) :
|
||||
|
||||
@@ -58,7 +58,7 @@ modprobe iptable_nat
|
||||
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
|
||||
\end{verbatim}
|
||||
|
||||
Ensuite sur les machines du lan, donc le coté ethernet,
|
||||
Ensuite sur les machines du lan, donc le coté Ethernet,
|
||||
il faut incanter ce genre de trucs :
|
||||
|
||||
\begin{verbatim}
|
||||
|
||||
18
chap/X11.tex
18
chap/X11.tex
@@ -1,6 +1,18 @@
|
||||
\chapter{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}
|
||||
@@ -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/
|
||||
%
|
||||
|
||||
Twm, Fvwm, Mwm... nous avons le choix.
|
||||
|
||||
%-------------------------------------------------------------------
|
||||
|
||||
\section{XCB}\index{XCB}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
\index{backup}
|
||||
|
||||
% https://blog.flozz.fr/2023/10/15/borgbackup-sauvegarde-sur-une-machine-distante-via-ssh/
|
||||
|
||||
|
||||
% ===============================================================
|
||||
\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 ».
|
||||
Oui, peut-être, mais il y a quand même pas mal d'usages
|
||||
assez cools pour ces technologies du passé. Nous allons
|
||||
assez cools pour ces technologies du passé, l'auto-radio
|
||||
de votre vieille voiture, par exemple.
|
||||
Nous allons
|
||||
en explorer quelques uns.
|
||||
|
||||
% ++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
@@ -12,14 +14,43 @@ en explorer quelques uns.
|
||||
|
||||
\section{CD Audio}
|
||||
|
||||
Un CD audio ne contient pas de système de fichier, il ne peut
|
||||
donc pas être lu de manière conventionnelle.
|
||||
Il faut donc passer par des logiciels adaptés, qui vont
|
||||
directement aller dire le contenu du disque, puis
|
||||
convertir les pistes en fichiers audio conventionnels.
|
||||
|
||||
\subsection {Riping}
|
||||
\index{abcde} \index{cdparanoia}
|
||||
|
||||
Le \textsl{ripage} est l'action d'extraire les pistes d'un
|
||||
cd audio pour les convertir en fichier numérique audio.
|
||||
cd audio pour les convertir en fichier numérique audio
|
||||
au format désiré.
|
||||
Il existe plusieurs méthodes, la première va vous satisfaire,
|
||||
et nous verrons (peut-être) les autres la semaine prochaine.
|
||||
|
||||
Un des outils utilisés est \texttt{cdparanoia}. Les nombreuses
|
||||
options décrites dans la manpage montrent à quel point ce logiciel
|
||||
est complet et compliqué.
|
||||
est complet et compliqué. Heureusement, il y a une surcouche,
|
||||
\texttt{abcde}\footnote{A better CD Encoder}, qui facilite
|
||||
bien les choses. Passons immédiatement à l'œuvre en tentant
|
||||
d'encoder un cd audio\footnote{Mylene Farmer, Ainsi soit je...}
|
||||
vers des fichiers encodées en Ogg\index{ogg}.
|
||||
|
||||
Voici la ligne de commande minimale que nous allons utiliser,
|
||||
pour ensuite y ajouter quelques autres options :
|
||||
|
||||
\begin{verbatim}
|
||||
$ abcde -o ogg
|
||||
\end{verbatim}
|
||||
|
||||
Oh, mais il y a une jolie animation en asciiart pour suivre
|
||||
le déroulement des opérations.
|
||||
|
||||
Parmi les (nombreuses) options possibles, on trouve
|
||||
\texttt{-p Pads track numbers with 0's}
|
||||
|
||||
\textsl{||}
|
||||
|
||||
% --------------------------------------------------------
|
||||
|
||||
|
||||
@@ -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
|
||||
avec les fonctions (genre \texttt{mvaddstr})
|
||||
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.
|
||||
|
||||
|
||||
@@ -87,6 +87,8 @@ ce que ça donne.
|
||||
|
||||
\section{Bell and whistles}
|
||||
|
||||
\subsection{Attributs}
|
||||
|
||||
Voici comment centrer sur la ligne du haut
|
||||
un texte écrit en \textbf{gras} grace à l'attribut
|
||||
\texttt{A\_BOLD} :
|
||||
@@ -114,18 +116,29 @@ de fonctions spécialisées dans le traitement des attributs.
|
||||
|
||||
\section{Astuces}
|
||||
|
||||
\subsection{kbhit} \index{kbhit} \label{kbhit}
|
||||
|
||||
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
|
||||
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
|
||||
de connaitre le \textit{file descriptor} auquel est attaché le clavier.
|
||||
Dans le contexte classique, on peut assumer que ce sera le \texttt{fd}
|
||||
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
|
||||
utilisateur pôur demander un service au noyau.
|
||||
|
||||
\lstinputlisting[language=C]{code/hello.c}
|
||||
\lstinputlisting[language=C]{code/C/hello.c}
|
||||
|
||||
Un exemple canonique, n'est-il pas ? Ce bout de code affichant
|
||||
quelque chose à l'écran, il doit bien y avoir un appel au noyau
|
||||
@@ -180,13 +180,30 @@ oh surprise, contient votre nom de login.
|
||||
|
||||
Et justement, vous avez un programme sous la main que vous suspecter
|
||||
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
|
||||
fonction.
|
||||
|
||||
\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
|
||||
|
||||
\chapter{trucs de dino}
|
||||
\chapter{Trucs de dino}
|
||||
\label{chap:dino}
|
||||
|
||||
Je vais, dans ce chapitre, parler de choses que les moins de vingt
|
||||
ans ne peuvent pas connaitre. Des choses qui existaient
|
||||
\textsl{bien avant} le Web\index{www}, et pour lesquelles on
|
||||
peur facilement imaginer des usages alternatifs et amusants !
|
||||
peut facilement imaginer des usages alternatifs et amusants !
|
||||
|
||||
% ==============================================================
|
||||
|
||||
@@ -17,12 +17,15 @@ peur facilement imaginer des usages alternatifs et amusants !
|
||||
Aussi connu sous le nom de « superserveur Internet », ce démon
|
||||
a fait ses premiers pas dans l'Unix 4.3BSD
|
||||
et depuis est maintenant remplacé par
|
||||
\texttt{xinetd}\index{xinetd}, décrit en page \pageref{xinetd}.
|
||||
\texttt{xinetd}\index{xinetd}, décrit en page \pageref{xinetd},
|
||||
lequel a peut-être été déja supplanté par un truc qui est
|
||||
\textit{plus nouveau}.
|
||||
% --> https://0pointer.de/blog/projects/inetd.html
|
||||
|
||||
Inetd a pour but de gérer l'accès à des services réseaux,
|
||||
qui peuvent être internes ou externes. Un service interne
|
||||
est entièrement géré par Inetd : on y trouve par exempme
|
||||
daytime qui permet de connaitre l'heure qu'il est à
|
||||
est entièrement géré par Inetd : on y trouve par exemple
|
||||
\textsl{daytime} qui permet de connaitre l'heure qu'il est à
|
||||
l'autre bout du monde :
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -43,25 +46,38 @@ Il ne reste plus qu'à le mettre en œuvre, en réutilisant
|
||||
un exemple très ancien\footnote{Août 1998, lors d'une
|
||||
réunion du CULTe, à Toulouse}, et très simple à
|
||||
comprendre.
|
||||
Dans notre cas, inetd sera à l'écoute sur un port tcp.
|
||||
Dès qu'une demande de connection arrive,
|
||||
il accepte la connection, lance le process configuré,
|
||||
puis
|
||||
connecte ce qui vient du socket au \textsl{stdin} de ce
|
||||
process, et le \textsl{stdout} de celui-ci à la sortie
|
||||
vers l'extérieur.
|
||||
|
||||
Voir aussi : tcpserver\index{tcpserver}\dots
|
||||
% Voir aussi : tcpserver\index{tcpserver}\dots
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
||||
\subsection{qotd}
|
||||
\index{qotd}
|
||||
\index{qotd} \label{qotd}
|
||||
|
||||
Le protocole « Quote Of The Day » (\texttt{qotd}) a été
|
||||
normalise dans le \texttt{rfc865}, écrit en 1983 par John Postel.
|
||||
Une rapide implémentation du moteur de quote peut être codée en Shell :
|
||||
Une rapide implémentation du moteur de quote peut être codée avec
|
||||
quelques lignes de shell~:
|
||||
|
||||
\index{fortune}
|
||||
\begin{lstlisting}[language=sh]
|
||||
#!/bin/sh
|
||||
/usr/games/fortune -a -n 500
|
||||
\end{lstlisting}
|
||||
\lstinputlisting[language=sh]{code/inet/qotd.sh}
|
||||
|
||||
Maintenant, il nous faut dire à Inetd d'appeler ce moteur
|
||||
chaque fois qu'une connection tcp entrante arrive sur le
|
||||
port 17.
|
||||
port 17 (ce numéro du service est défini dans le fichier
|
||||
\texttt{/etc/services}).
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
Et pour les modernistes qui utilisent \texttt{xinetd}\index{xinetd}
|
||||
les explications sont en page \pageref{xinetd:qotd}.
|
||||
|
||||
% ==============================================================
|
||||
%
|
||||
|
||||
@@ -14,7 +14,7 @@ le graphique. Il ne nécessite pas de système d'exploitation.
|
||||
\section{Configuration}
|
||||
|
||||
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
|
||||
ce fichier. Ce fichier est abondamment commenté.
|
||||
|
||||
@@ -31,7 +31,9 @@ keyb fr
|
||||
|
||||
\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}.
|
||||
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.
|
||||
|
||||
|
||||
% ----------------------------------------------------------
|
||||
|
||||
\section{Qbasic} \index{Qbasic} \label{Qbasic}
|
||||
|
||||
% ----------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
\chapter{Gadgets}
|
||||
|
||||
|
||||
La rubrique des trucs inutiles, mais pas que.
|
||||
|
||||
% https://www.linuxtricks.fr/wiki/zenity-boites-de-dialogue-graphiques-aux-scripts-shell
|
||||
|
||||
% ===============================================================
|
||||
|
||||
\section{Fortune}
|
||||
@@ -17,10 +22,9 @@ You are deeply attached to your friends and acquaintances.
|
||||
tth@plop:~$
|
||||
\end{verbatim}
|
||||
|
||||
Bref, vous voyez le principe : c'est un machin à raconter des
|
||||
Bref, vous voyez le principe : c'est une machine à raconter des
|
||||
trucs plus ou
|
||||
moins aléatoires\footnote{et jamais revenus, il faut bien le
|
||||
préciser.}. Il y a tout un tas d'options intéressantes,
|
||||
moins aléatoires. Il y a tout un tas d'options intéressantes,
|
||||
la principale étant \texttt{-o} pour avoir les fortunes
|
||||
offensives\index{porn} qui peuvent choquer les âmes
|
||||
sensibles.
|
||||
@@ -47,7 +51,7 @@ Le pendant graphique est \texttt{xcowsay}.
|
||||
|
||||
\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.
|
||||
|
||||
\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}
|
||||
|
||||
Certains esprits ouverts pensent que
|
||||
\texttt{fortune}\index{fortune} est aussi un
|
||||
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}
|
||||
|
||||
@@ -112,6 +132,22 @@ vraiment\footnote{Enfin, si, j'essaye de confectionner
|
||||
un soft pour fabriquer des flipbooks à partir de portnawak}
|
||||
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
|
||||
et un seul niveau de transparence. Contraintes qui n'étaient pas si
|
||||
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}
|
||||
|
||||
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
|
||||
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
|
||||
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}
|
||||
|
||||
XXX\index{XXX}
|
||||
|
||||
% ==================================================================
|
||||
|
||||
\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}
|
||||
|
||||
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 premier est
|
||||
Le fichier des données contient cinq champs séparés par des espaces
|
||||
ou des tabulations.
|
||||
Le premier champ est
|
||||
un \textsl{timestamp} exprimé en secondes depuis l'\textsl{epoch},
|
||||
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, \
|
||||
"${TMPFILE}" using 1:4 title "ambient" with lines
|
||||
__EOC__
|
||||
|
||||
display ${IMAGE} &
|
||||
\end{verbatim}
|
||||
|
||||
\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
|
||||
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
|
||||
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}
|
||||
|
||||
@@ -1,54 +1,122 @@
|
||||
\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}
|
||||
flydraw is a drawing tool based on an interpreter which parses a
|
||||
language featuring rich graphic primitives; it uses libgd to output
|
||||
GIF, JPEG, or PNG\index{PNG} files.
|
||||
\end{quote}
|
||||
\lstinputlisting[language=c]{code/SDL2/strangebug.c}
|
||||
|
||||
\lstinputlisting{code/dessiner.fly}
|
||||
C'est peut-être ma totale méconnaissance du sujet qui m'a
|
||||
fait faire une bêtise àlc, et je ne vois pas laquelle\dots
|
||||
Une enquête est en préparation.
|
||||
|
||||
Pour le moment, les résultats ne sont pas encourageants~:
|
||||
\begin{verbatim}
|
||||
tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly
|
||||
bad_parms -100000
|
||||
tth@fubar:~/Documents/TetaTricks/code$
|
||||
\end{verbatim}
|
||||
|
||||
Mais en s'obstinant un peu au \textsl{cargocult}, il
|
||||
s'avère que la documentation et le code semble ne sont
|
||||
pas d'accord. Et les messages d'erreur trop
|
||||
cryptiques pour moi. Donc, on y arrive.
|
||||
|
||||
\begin{figure}[h]
|
||||
\begin{center}
|
||||
\includegraphics[scale=0.75]{code/flydraw}
|
||||
\caption{Flydraw}
|
||||
\end{center}
|
||||
\end{figure}
|
||||
|
||||
Ceci dit, une lecture attentive du code source\footnote{UTSL} permettra
|
||||
de contourner ces petits désagréments, et de rédiger quelques exemples
|
||||
d'utilisation amusants.
|
||||
|
||||
% package source
|
||||
% http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz
|
||||
% ------------------------------------------------
|
||||
%
|
||||
% Fri Sep 27 14:09:45 UTC 2024
|
||||
% la section sur flydram est partie dans les unused
|
||||
%
|
||||
|
||||
%====================================================================
|
||||
|
||||
\section{Povray}\index{Povray}
|
||||
\section{Povray}\index{Povray}\label{Povray}
|
||||
|
||||
\textbf{Persistence Of Vision} est un logiciel de raytracing qui
|
||||
existe depuis plus de trente ans. C'est un lointain descendant
|
||||
de DKBtrace.
|
||||
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}
|
||||
|
||||
@@ -57,54 +125,81 @@ Vous avez deux trajectoires (mal) calculées pour la
|
||||
\texttt{location} et le \texttt{look\_at}, et rien ne tombe
|
||||
en face de l'objectif ? Voici une approche de solution.
|
||||
|
||||
La première étape est l'enregistrerement des paramètres de la caméra
|
||||
La première étape est l'enregistrement des paramètres de la caméra
|
||||
(préalablement calculés par de savantes mais mauvaises formules)
|
||||
lors du calcul de la séquence~:
|
||||
|
||||
\begin{verbatim}
|
||||
#if (0 = clock)
|
||||
#fopen CL "cam.log" create
|
||||
#fopen CL "WS/cam.log" write
|
||||
#else
|
||||
#fopen CL "cam.log" append
|
||||
#fopen CL "WS/cam.log" append
|
||||
#end
|
||||
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
|
||||
" ", LatX, " ", LatY, " ", LatZ,"\n")
|
||||
#fclose CL
|
||||
\end{verbatim}
|
||||
|
||||
Et la seconde, l'exploitation, ou plutôt la visualisation
|
||||
des données~:
|
||||
Et la seconde étape, l'exploitation avec \textsc{R},
|
||||
le logiciel de statistiques (que nous verrons bientôt),
|
||||
ou la visualisation
|
||||
de ces données avec l'indémodable gnuplot\index{gnuplot}~:
|
||||
|
||||
\begin{verbatim}
|
||||
#!/bin/bash
|
||||
|
||||
FILE="cam.log"
|
||||
FILE="WS/cam.log"
|
||||
TMPF="/dev/shm/cam.data"
|
||||
IMAGE="graphe.png"
|
||||
tail -360 ${FILE} | sort -n > ${TMPF}
|
||||
gnuplot << __EOC__
|
||||
set term png size 720,720
|
||||
set output "${IMAGE}"
|
||||
set ytics 2
|
||||
set xtics 2
|
||||
set grid front
|
||||
set title "Rush Camera"
|
||||
plot "${TMPF}" using 2:4 title "Cam", \
|
||||
"${TMPF}" using 5:7 title "Lat" with dots
|
||||
set term png size 720,720
|
||||
set output "${IMAGE}"
|
||||
set ytics 2
|
||||
set xtics 2
|
||||
set grid front
|
||||
set title "Rush Camera"
|
||||
plot "${TMPF}" using 2:4 title "Cam", \
|
||||
"${TMPF}" using 5:7 title "Lat" with dots
|
||||
__EOC__
|
||||
display "${IMAGE}" &
|
||||
\end{verbatim}
|
||||
|
||||
Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique
|
||||
la commande\texttt{tail} au début du script. Ensuite les deux clauses
|
||||
la commande \texttt{tail} au début du script. Ensuite les deux clauses
|
||||
\textsl{using 2:4 / 5:7} permettent de sélectionner les deux
|
||||
coordonnées X et Z, dans le repère POVray, qui n'est pas le même que
|
||||
celui de Gnuplot.
|
||||
|
||||
|
||||
% ------------------------------------------------
|
||||
% updated Fri Sep 27 13:41:54 UTC 2024
|
||||
\subsection{image\_map}
|
||||
|
||||
XXX \index{XXX}
|
||||
Autre composante essentielle du raytracing, le collage d'une
|
||||
image sur quelque chose, comme quand vous recouvrez une
|
||||
boite de Camembert\index{Camenbert} avec du papier peint
|
||||
des années 50.
|
||||
Il suffit d'utiliser les pixels de l'image comme pigment.
|
||||
|
||||
\begin{verbatim}
|
||||
plane { -z,0 pigment { image_map {png "Eggs.png"} } }
|
||||
\end{verbatim}
|
||||
|
||||
\textsl{By default, the image is mapped onto the
|
||||
\textbf{x-y-plane}.
|
||||
The
|
||||
image is projected onto the object as though there were a
|
||||
slide projector somewhere in the -z-direction.
|
||||
The image
|
||||
exactly fills the square area from (x,y) coordinates
|
||||
(0,0) to (1,1) regardless of the image's original size in
|
||||
pixels.
|
||||
If you would like to change this default you may
|
||||
translate, rotate or scale the pigment or texture to map
|
||||
it onto the object's surface as desired.
|
||||
}%
|
||||
\footnote{https://wiki.povray.org/content/Reference:Image\_Map}
|
||||
|
||||
% ------------------------------------------------
|
||||
|
||||
@@ -136,7 +231,7 @@ initialiser un générateur~:
|
||||
|
||||
\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.
|
||||
Ensuite, pour obtenir le résultat du tirage, on utilise le \textsl{handler}
|
||||
que l'on vient d'obtenir~:
|
||||
@@ -168,8 +263,9 @@ nous aurons toujours la même séquence en sortie.
|
||||
|
||||
\subsection{Trucs à voir}
|
||||
|
||||
\begin{verbatim}
|
||||
Des bouts de code piochés à droite et à gauche...
|
||||
|
||||
\begin{verbatim}
|
||||
#declare VIRGINIA =
|
||||
transform {
|
||||
matrix < 1, 1, 0,
|
||||
@@ -177,12 +273,35 @@ matrix < 1, 1, 0,
|
||||
0, 0, 1,
|
||||
0, 0, 0 >
|
||||
}
|
||||
|
||||
box { 0, 1
|
||||
transform {VIRGINIA}
|
||||
}
|
||||
\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}
|
||||
|
||||
La manette de jeu est un périphérique que j'affectionne particulièrement.
|
||||
|
||||
\begin{verbatim}
|
||||
int foo, joy_fd;
|
||||
struct js_event js;
|
||||
|
||||
|
||||
joy_fd = open(joy_device , O_RDONLY);
|
||||
foo = read(joy_fd, &js, sizeof(struct js_event));
|
||||
|
||||
\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
|
||||
y a des accrocs dans le plan, que le résultat n'est
|
||||
qu'une video totalement noire de 17 minutes.
|
||||
dmesg, lshw, lsusb, lspci\dots
|
||||
qu'une video totalement noire de 17 minutes, que des
|
||||
octets incongrus arrivent depuis l'Arduino.
|
||||
dmesg, lscpu, lshw, lsusb, lspci\dots
|
||||
|
||||
% -----------------------------------------------------------
|
||||
% new: Fri Sep 22 11:13:36 UTC 2023
|
||||
|
||||
\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}
|
||||
\index{rs232} \label{rs232}
|
||||
|
||||
@@ -37,7 +65,9 @@ ainsi que la norme ISO 2110 pour la connectique.
|
||||
\end{quote}
|
||||
|
||||
Comment détecter si un \textit{device} correspond bien
|
||||
à un port série ?
|
||||
à un port série ? Une fois de plus, la réponse passe
|
||||
par un \textsl{ioctl}\index{ioctl}.
|
||||
Même si il est bien caché.
|
||||
|
||||
\begin{lstlisting}[language=C]
|
||||
#include <stdio.h>
|
||||
@@ -63,6 +93,11 @@ return 0;
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
En effet, \texttt{tcgetattr(3)} va aller lire le paramétrage
|
||||
du port associé au descripteur de fichier \texttt{fd}
|
||||
par l'intermédiaire d'un ioctl (qui aurait pû prévoir ?)
|
||||
que nous détaillerons un de ces jours.
|
||||
|
||||
Et la question qui, je le sens, va venir~: « à quoi peut bien
|
||||
servir un port série ? » appelle un réponse presque évidente~:
|
||||
« à plusieurs choses ». Une petite liste~:
|
||||
@@ -70,19 +105,39 @@ Connecter un Minitel\index{MINITEL}
|
||||
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
|
||||
Sportster 14400 pour retrouver Fidonet\index{Fidonet} ?
|
||||
Discuter avec un équipement avionnique ? Rediriger
|
||||
l'impression d'un MSX\index{MSX} vers Cups\index{cups} ?
|
||||
l'impression d'un MSX\index{MSX} ou d'un Alice 32
|
||||
vers Cups\index{cups} ?
|
||||
|
||||
Les possibilités sont infinies. C'est votre imagination qui
|
||||
est la limite\footnote{Comme à peu près tout dans la vie.}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\section{Ports //} \label{portparallele}
|
||||
\section{Ports \textbf{//}} \label{portparallele}
|
||||
\index{port //}
|
||||
|
||||
% http://people.redhat.com/twaugh/parport/html/x623.html
|
||||
|
||||
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}
|
||||
@@ -143,8 +198,8 @@ idéal, la prédiction des pannes.
|
||||
|
||||
\textsl{Check and repair a Linux filesystem}
|
||||
|
||||
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne la
|
||||
tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne
|
||||
la tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\subsection{tune2fs}\index{tune2fs}
|
||||
@@ -152,6 +207,32 @@ tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
||||
\textsl{Adjust tunable filesystem parameters on ext2/ext3/ext4
|
||||
filesystems}\footnote{You can tune a fs, but you can't tuna fish}.
|
||||
|
||||
% -----------------------------------------------------------
|
||||
% nouveau 2 juin 2024
|
||||
% basé sur mes tentatives pour faire marcher l'interface
|
||||
% Enttec OpenDMX USB
|
||||
|
||||
\section{udev} \index{udev} \label{udev}
|
||||
|
||||
\begin{quote}
|
||||
udev supplies the system software with device events, manages
|
||||
permissions of device nodes and may create additional symlinks in the
|
||||
/dev directory, or renames network interfaces. The kernel usually just
|
||||
assigns unpredictable device names based on the order of discovery.
|
||||
Meaningful symlinks or network device names provide a way to reliably
|
||||
identify devices based on their properties or current configuration.
|
||||
\end{quote}
|
||||
|
||||
Avant de rentre dans les détails, nous pouvons aller voir un exemple
|
||||
concret en page \pageref{OpenDMX} où nous atriburons un nom fixe
|
||||
à une interface USB.
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
\section{Sensors} \index{sensors}
|
||||
|
||||
L'outil pour connaitre la température de votre CPU surmené.
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
\section{Interface réseau}\index{NIC}
|
||||
@@ -174,7 +255,7 @@ int retcode;
|
||||
struct ifreq req;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s \"%s\" to %p\n", \
|
||||
fprintf(stderr, ">>> %s ( \"%s\" to %p )\n", \
|
||||
__func__, ifname, p_flags);
|
||||
#endif
|
||||
|
||||
@@ -204,8 +285,7 @@ if (retcode < 0)
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
#if DEBUG_LEVEL
|
||||
/* display the result */
|
||||
#if DEBUG_LEVEL /* display the result */
|
||||
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
||||
#endif
|
||||
|
||||
@@ -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
|
||||
application critique...
|
||||
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
218
chap/image.tex
218
chap/image.tex
@@ -3,7 +3,8 @@
|
||||
|
||||
Le traitement des images est un art à part entière. Nous allons
|
||||
voir quelques grands classiques de la catégorie pas du tout
|
||||
interactif. Le genre de machin que l'on peut ranger au fond
|
||||
interactif.
|
||||
Le genre de machin que l'on peut ranger au fond
|
||||
d'un script shell pour le réutiliser la semaine prochaine.
|
||||
|
||||
\begin{itemize}
|
||||
@@ -27,7 +28,8 @@ et leurs interactions parfois troublantes\dots
|
||||
Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
|
||||
la plupart des traitements,
|
||||
\texttt{display} et \texttt{animate} pour visualiser des images,
|
||||
\texttt{identify} pour en lire les méta-données.
|
||||
\texttt{identify} pour en lire les méta-données,
|
||||
\texttt{montage} pour assembler plusieurs images.
|
||||
|
||||
Ils partagent un certain nombre d'options communes.
|
||||
Certains d'entre eux peuvent avoir un effet destructif%
|
||||
@@ -62,6 +64,8 @@ x:y & Here x and y denotes an aspect ratio (e.g. 3:2 = 1.5). \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
|
||||
% !!!
|
||||
% est-il nécessaire de traduire ce tableau ?
|
||||
|
||||
\subsection{Écrire du texte}
|
||||
|
||||
@@ -72,37 +76,73 @@ qui montre l'essentiel pour bien débuter. C'est une fonction
|
||||
|
||||
\lstinputlisting[language=sh]{code/tagpic.sh}
|
||||
|
||||
Une petite commande toute bête pour rajouter la date facilement à une photo
|
||||
d’après les données EXIF\index{EXIF}~:
|
||||
|
||||
\begin{lstlisting}
|
||||
convert nom_du_fichier_source.jpg -gravity SouthEast \
|
||||
-font Fudd-Regular -pointsize 40 -fill white \
|
||||
-annotate +20+20 "%[exif:DateTimeOriginal]" \
|
||||
-quality 100 nom_du_fichier_destination.jpg
|
||||
\end{lstlisting}
|
||||
|
||||
Quelques explications semblent nécessaires, parce que certaines
|
||||
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}
|
||||
\item{txtfont}
|
||||
\item{fontsize}
|
||||
\item{kerning}
|
||||
\item{colors}
|
||||
\item{txtopts}
|
||||
\item{gravity}
|
||||
\item{annotate}
|
||||
\item{Comment mettre une couleur de fond à ce texte ?}
|
||||
\item{Et un texte semi-transparent ?}
|
||||
\end{itemize}
|
||||
|
||||
Question : comment mettre une couleur de fond à ce texte ?
|
||||
% ------------------------------------------
|
||||
% faire des affiches
|
||||
\subsection{montage}\index{montage}
|
||||
|
||||
\subsection{montage}
|
||||
\begin{quote}
|
||||
create a composite image by combining several separate images. The images are
|
||||
tiled on the composite image optionally adorned with a border, frame,
|
||||
image name, and more.
|
||||
\end{quote}
|
||||
|
||||
Krkrkr
|
||||
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
|
||||
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
|
||||
création essentielle à l'art graphique moderne.
|
||||
|
||||
\begin{verbatim}
|
||||
convert -delay 20 -loop 0 a.png b.png c.png foo.gif
|
||||
\end{verbatim}
|
||||
|
||||
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}.
|
||||
|
||||
% ------------------------------------------
|
||||
|
||||
@@ -124,16 +164,114 @@ changer la dimension de l'image. En détail, j'ai pas tout compris.
|
||||
|
||||
% ------------------------------------------
|
||||
|
||||
\subsection{conversion vers TGA} \index{TGA}
|
||||
|
||||
On trouve encore en circulation de très vieux logiciels qui ne savent lire
|
||||
qu'un encore plus ancien format : \textsl{Targa file format}.
|
||||
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 avec, heureusement, des
|
||||
arguments aux noms évocateurs :
|
||||
|
||||
\begin{lstlisting}
|
||||
GOTO_TGA ()
|
||||
{
|
||||
convert $1 \
|
||||
-compress none \
|
||||
-alpha off \
|
||||
-colorspace RGB \
|
||||
-type truecolor \
|
||||
$2
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
|
||||
|
||||
\begin{verbatim}
|
||||
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
|
||||
\end{verbatim}
|
||||
|
||||
Un volontaire dans la salle pour faire des tests de performance ?
|
||||
Ma première hypothèse est que le résultat des mesures peut
|
||||
être assez surprenant.
|
||||
|
||||
% ------------------------------------------
|
||||
|
||||
\subsection{identify}\index{identify}
|
||||
|
||||
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}
|
||||
|
||||
convert -average frame*.png output.png
|
||||
\begin{itemize}
|
||||
\item{convert -average frame*.png output.png}
|
||||
\item{convert -brightness-contrast 20\% foo.png bar.png}
|
||||
\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}
|
||||
|
||||
Le futur livre de Brunus. Réclamez les prmiers drafts dans
|
||||
l'IRC\index{IRC} \texttt{freenode\#paulla} \textit{:)}
|
||||
Le futur livre de Brunus.
|
||||
|
||||
Réclamez les premiers drafts dans
|
||||
l'IRC\index{IRC} \texttt{libera.chat\#paulla} \textit{:)}
|
||||
|
||||
\texttt{http://www.fmwconcepts.com/imagemagick/index.php}
|
||||
|
||||
@@ -146,9 +284,11 @@ l'IRC\index{IRC} \texttt{freenode\#paulla} \textit{:)}
|
||||
\textsl{Perform generic image processing operations, through the G'MIC
|
||||
language interpreter. gmic: GREYC's Magic for Image Computing.}
|
||||
|
||||
Gmic se base sur une grosse bibliothèque de fonctions écrite
|
||||
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
|
||||
bibliothèque de fonctions écrite
|
||||
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
|
||||
pleine de curseurs et de boutons, qui facilite (ou pas) l'exploration
|
||||
@@ -177,7 +317,7 @@ for ((y=0; y<250; y++)) {
|
||||
|
||||
Comment faire un \textsl{resize} avec NetPBM ?
|
||||
Est-il nécessaire d'apprendre la bibliothèque de fonctions
|
||||
\texttt{libnetpbm}\footnote{Réponse: oui.} ?
|
||||
\texttt{libnetpbm}\footnote{Réponse: certainement oui.} ?
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
@@ -206,22 +346,36 @@ use it heavily.
|
||||
\end{quote}
|
||||
|
||||
\begin{verbatim}
|
||||
tiffcp combines one or more files created according to the Tag Image
|
||||
File Format, Revision 6.0 into a single TIFF file. Because the output
|
||||
file may be compressed using a different algorithm than the input
|
||||
files, tiffcp is most often used to convert between different compres‐
|
||||
sion schemes.
|
||||
tiffcp combines one or more files created according to the Tag Image
|
||||
File Format, Revision 6.0 into a single TIFF file. Because the output
|
||||
file may be compressed using a different algorithm than the input
|
||||
files, tiffcp is most often used to convert between different compres‐
|
||||
sion schemes.
|
||||
\end{verbatim}
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
\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}
|
||||
|
||||
\texttt{Cimg} est l'énorme bibliothèque de fonctions
|
||||
(é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.
|
||||
|
||||
Peut-être\footnote{Les rêves ne sont pas interdits.}, existe-il une
|
||||
interface pour le Fortran moderne ?
|
||||
|
||||
\subsection{\textsc{hello world}}
|
||||
|
||||
\begin{lstlisting}
|
||||
#define cimg_use_png
|
||||
#include "CImg.h"
|
||||
@@ -243,4 +397,14 @@ return 0;
|
||||
}
|
||||
\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...}
|
||||
|
||||
\begin{itemize}
|
||||
\item{Comment virer le canal alpha à l'enregistrement d'une image en PNG ?}
|
||||
\end{itemize}
|
||||
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
@@ -9,18 +9,27 @@ Prenons rapidement un exemple, le baton de joie\index{joystick}
|
||||
dans Linux.
|
||||
|
||||
\begin{verbatim}
|
||||
int foo, joy_fd;
|
||||
struct js_event js;
|
||||
int joy_fd;
|
||||
char joy_name[128];
|
||||
|
||||
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}
|
||||
|
||||
|
||||
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}
|
||||
\label{chap:manpages}
|
||||
|
||||
Guidelines for writing man pages can be found in \texttt{mdoc(7)}.
|
||||
|
||||
man is the system's manual pager. Each page argument given to man is
|
||||
\texttt{man} is the system's manual pager. Each page argument given to man is
|
||||
normally the name of a program, utility or function. The manual page
|
||||
associated with each of these arguments is then found and displayed. A
|
||||
section, if provided, will direct man to look only in that section of
|
||||
|
||||
@@ -1,47 +1,73 @@
|
||||
\chapter{Photographie}
|
||||
\label{chap:photos}
|
||||
\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}
|
||||
\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.
|
||||
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}
|
||||
gphoto2 --list-ports
|
||||
gphoto2 --list-cameras
|
||||
gphoto2 --auto-detect
|
||||
\end{verbatim}
|
||||
|
||||
Deux commandes pour obtenir la description des modes de connexion
|
||||
possibles, et la liste des appareils gérés.
|
||||
|
||||
Ces trois commandes servent à obtenir la description des modes de
|
||||
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}
|
||||
gphoto2 --auto-detect
|
||||
gphoto2 --port usb:002,002 -P
|
||||
\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
|
||||
être remplacée par \texttt{--get-all-files}).
|
||||
|
||||
L'option \texttt{--new} permet de se limiter au
|
||||
téléchargement des nouvelles photos.
|
||||
|
||||
Pour les drogués de la ligne de commande, l'option \texttt{--shell}
|
||||
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
|
||||
le temps de les découvrir.
|
||||
|
||||
%----------------------------------------------------------------
|
||||
%================================================================
|
||||
|
||||
\section{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
|
||||
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}
|
||||
|
||||
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
|
||||
d'un binaire. la fonction \texttt{dlclose} va, elle, vidanger
|
||||
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,
|
||||
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}
|
||||
|
||||
@@ -75,7 +76,9 @@ la cinquième va vous étonner.
|
||||
Voyons maintenant comment mettre ça en œuvre depuis le programme
|
||||
principal.
|
||||
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}
|
||||
|
||||
|
||||
@@ -1,20 +1,98 @@
|
||||
\chapter{\texttt{lp0 on fire!}}
|
||||
\chapter{\textbf{\textsl{lp0 on fire!}}}
|
||||
\label{chap:imprimer}
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
L'impression sour Linux semble avoir plusieurs personnalités.
|
||||
La chaine logicielle mise en œuvre est parfois étonnament
|
||||
complexe, et ls système par defaut, \texttt{CUPS}, se contrôle
|
||||
par une interface Web.
|
||||
Les aspects matériels sont vus dans le chapitré adéquat,
|
||||
en page \pageref{portparallele}.
|
||||
|
||||
\section{CUPS} \index{CUPS}
|
||||
|
||||
|
||||
complexe (il en existe même plusieurs) et ls système par défaut,
|
||||
\texttt{CUPS} (page \pageref{CUPS}), se contrôle
|
||||
avec une interface Web et/ou des outils en cli..
|
||||
|
||||
Les aspects matériels de la connexion seront vus dans un chapitre adéquat,
|
||||
en page \pageref{portparallele} pour le port \texttt{//},
|
||||
et \pageref{rs232} pour le serial.
|
||||
L'omniprésente connectivité USB\index{USB} demande peut-être
|
||||
un chapitre à part entière.
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
\section{Historique}
|
||||
|
||||
Line Printer Daemon Protocol
|
||||
|
||||
LPR Ng
|
||||
|
||||
Cf le bouquin de Bellanger.
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
% https://fr.wikipedia.org/wiki/Internet_Printing_Protocol
|
||||
|
||||
\section{IPP : Internet Printing Protocole} \index{IPP} \label{IPP}
|
||||
|
||||
\begin{quote}
|
||||
\textbf{wikipedia:}
|
||||
« IPP Everywhere » est une évolution du protocole, publiée en 2013.
|
||||
Il fournit une base de référence commune pour les imprimantes afin de
|
||||
prendre en charge l'impression dite "sans pilote" à partir de périphériques
|
||||
clients. Elle s'appuie sur IPP et précise des règles supplémentaires
|
||||
d'interopérabilité, telles qu'une liste des
|
||||
formats de documents que les imprimantes doivent prendre en charge.
|
||||
\end{quote}
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
%
|
||||
% https://www.evilsocket.net/2024/09/26/Attacking-UNIX-systems-via-CUPS-Part-I/
|
||||
%
|
||||
|
||||
\section{CUPS} \index{CUPS} \label{CUPS}
|
||||
|
||||
\begin{quote}
|
||||
\textbf{wikipedia:}
|
||||
Common Unix Printing System (CUPS) est un système modulaire d'impression
|
||||
numérique pour les systèmes d'exploitation Unix et assimilés.
|
||||
Tout ordinateur qui utilise CUPS peut se comporter comme un serveur d'impression ;
|
||||
il peut accepter des documents envoyés par d'autres machines (ordinateurs clients),
|
||||
les traiter, et les envoyer à l'imprimante qui convient.
|
||||
\end{quote}
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
\section{Pretty printers}.
|
||||
|
||||
\subsection{enscript} \index{enscript}
|
||||
\begin{verbatim}
|
||||
DESCRIPTION
|
||||
Enscript converts text files to PostScript or to other output
|
||||
languages. Enscript can spool the generated output directly
|
||||
to a specified printer or leave it to a file. If no input
|
||||
files are given, enscript processes the standard input stdin.
|
||||
Enscript can be extended to handle different output media and
|
||||
it has many options which can be used to customize the print‐
|
||||
outs.
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{GNU a2ps} \index{a2ps}
|
||||
\begin{verbatim}
|
||||
DESCRIPTION
|
||||
Convert FILE(s) or standard input to PostScript. By default,
|
||||
the output is sent to the default printer. An output file
|
||||
may be specified with -o.
|
||||
Mandatory arguments to long options are mandatory for short
|
||||
options too. Long options marked with * require a yes/no ar‐
|
||||
gument, corresponding short options stand for `yes'.
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
\subsection{Les autres\dots}
|
||||
\begin{itemize}
|
||||
\item fmt\index{fmt} / pr\index{pr}
|
||||
\item lgrind
|
||||
\item src2tex
|
||||
\item trueprint
|
||||
\end{itemize}
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
|
||||
109
chap/reseau.tex
109
chap/reseau.tex
@@ -2,8 +2,9 @@
|
||||
\label{chap:reseau} \index{Internet}
|
||||
|
||||
Ah, le grand Internet sauvage, il serait temps qu'on en parle un peu.
|
||||
Nous allons voir dans ce chapitre quelques utilisations
|
||||
que l'on peut qualifier de «~créatives~».
|
||||
Nous allons voir dans ce chapitre des logiciels peu connus,
|
||||
et les quelques utilisations que l'on peut en faire
|
||||
afin d'avoir le label « techno-futilité ».
|
||||
|
||||
Si vous attendiez des choses plus sérieuses, j'ai aussi ça
|
||||
en magasin : \textsc{dns} page \pageref{chap:DNS},
|
||||
@@ -34,15 +35,17 @@ il a probablement été remplacé par quelque chose d'encore plus
|
||||
étrange basé sur \textsl{systemd}\index{systemd},
|
||||
puisque l'important
|
||||
ça n'est pas que ça soit mieux, mais que ce soit
|
||||
\textbf{nouveau}.
|
||||
\textbf{nouveau}. Il fallait le dire.
|
||||
|
||||
\subsection{qotd}
|
||||
\index{qotd}
|
||||
% ---------------------------------------------------------
|
||||
|
||||
\subsection{Un serveur pour \textsl{qotd}}
|
||||
\label{xinetd:qotd}
|
||||
|
||||
À titre d'exercice, nous allons reprendre l'exemple du serveur
|
||||
de \textsl{quote of the day} que nous avons déja utilisé avec
|
||||
Inetd\index{inetd}, et lancer le
|
||||
petit script par l'intermédiaire de Xinetd.
|
||||
Inetd\index{inetd} (page \pageref{qotd}),
|
||||
et lancer notre petit script par l'intermédiaire de Xinetd.
|
||||
|
||||
Pour cela, il faut créer dans le répertoire
|
||||
\texttt{/etc/xinetd.d/}\footnote{Attention, ce répertoire
|
||||
@@ -51,33 +54,46 @@ est peut-être un debianisme, ymmv.} un fichier nommé
|
||||
|
||||
\begin{verbatim}
|
||||
service qotd
|
||||
{
|
||||
disable = yes
|
||||
type = UNLISTED
|
||||
|
||||
socket_type = stream
|
||||
protocol = tcp
|
||||
|
||||
user = nobody
|
||||
server = /usr/local/bin/qotd.sh
|
||||
}
|
||||
{
|
||||
disable = no
|
||||
type = UNLISTED
|
||||
socket_type = stream
|
||||
protocol = tcp
|
||||
user = nobody
|
||||
server = /usr/local/bin/qotd.sh
|
||||
}
|
||||
\end{verbatim}
|
||||
|
||||
Bien entendu, le script \texttt{qotd.sh} décrit en page
|
||||
\pageref{inetd} sera placé dans le bon répertoire.
|
||||
Et ouvert aux quatre vents par un
|
||||
\texttt{sudo chmod a+x /usr/local/bin/qotd.sh} de bon aloi.
|
||||
|
||||
\index{fortune}
|
||||
\lstinputlisting[language=sh]{code/inet/qotd.sh}
|
||||
|
||||
Ensuite, il faut demander à Xinetd de relire ses fichiers de
|
||||
configuration par un signal bien senti et au bon endroit.
|
||||
configuration par un bon \textsc{SIGHUP} bien senti
|
||||
et au bon endroit, c'est à dire le PID que l'on pourra
|
||||
(peut-être) obtenir dans \texttt{/var/run/xinetd.pid},
|
||||
et paf.
|
||||
Allons voir si cela fonctionne.
|
||||
|
||||
|
||||
|
||||
Ah, on me murmure dans l'oreille que Xinetd n'existe plus dans
|
||||
les Linux modernes, et qu'il existe quelque chose de
|
||||
\textit{beaucoup mieux}. Je ne sais pas quoi.
|
||||
Je demande à voir\footnote{Parce que c'est écrit par LP ?}.
|
||||
% --> https://0pointer.de/blog/projects/inetd.html
|
||||
|
||||
|
||||
% ==============================================================
|
||||
\section{Translation d'adresse}
|
||||
\index{NAT}
|
||||
|
||||
% XXX expliquer un peu le NAT !
|
||||
|
||||
Voir en page \pageref{NAT} pour découvrir comment utiliser une
|
||||
machine connectée en WiFi pour donner accès à Internet à votre
|
||||
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
|
||||
dernier.
|
||||
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.
|
||||
|
||||
|
||||
% ==============================================================
|
||||
\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}
|
||||
|
||||
@@ -150,6 +113,8 @@ iftop\index{iftop},
|
||||
iptraf\index{iptraf}
|
||||
\dots
|
||||
|
||||
Mais c'est toujours la faute du \textsc{dns}\index{dns}.
|
||||
|
||||
% -------------------------------------------------------------
|
||||
\subsection{iperf}
|
||||
\index{iperf}
|
||||
|
||||
@@ -1,34 +1,203 @@
|
||||
\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}
|
||||
|
||||
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
|
||||
une idée du langage\dots
|
||||
une idée des possibilités du langage\dots
|
||||
|
||||
\begin{verbatim}
|
||||
cat { print $0 } or just 1
|
||||
grep pattern /pattern/
|
||||
head -n 5 NR <= 5
|
||||
cut -f1 { print $1 }
|
||||
tr a-z A-Z { print toupper($0) }
|
||||
sed 's/hi/ho/g' gsub(/hi/,"ho")
|
||||
wc -l END { print NR }
|
||||
cat { print $0 } or just 1
|
||||
grep pattern /pattern/
|
||||
head -n 5 NR <= 5
|
||||
cut -f1 { print $1 }
|
||||
tr a-z A-Z { print toupper($0) }
|
||||
sed 's/hi/ho/g' gsub(/hi/,"ho")
|
||||
wc -l END { print NR }
|
||||
\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}
|
||||
|
||||
À 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}.
|
||||
Un cas d'école : un élément par ligne, les valeurs séparées par
|
||||
des espaces.
|
||||
|
||||
fichier \texttt{.inc} contenant la description en
|
||||
SDL\index{SDL}\footnote{SDL: Scene Description Language}
|
||||
d'un objet pour Povray\index{Povray}.
|
||||
Un cas d'école : un élément par ligne, les valeurs sont séparées par
|
||||
des espaces et/ou des tabulations.
|
||||
|
||||
\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
|
||||
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.
|
||||
En gros, hein, je vais simplifier, et me limiter aux
|
||||
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
|
||||
langage de programmation. Ces deux notions ont beaucoup de
|
||||
choses en commun.
|
||||
Nous allons nous concentrer sur le \textsl{Bourne again shell}
|
||||
(aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus
|
||||
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}.
|
||||
aka \texttt{bash} qui est peut-être le plus répandu. Mais il
|
||||
en existe d'autres : sh, ksh, ash, zsh\dots
|
||||
Ou alors, il faut reste \textsc{posix}, mais c'est pour le moment
|
||||
une autre histoire. Parce que là, on est plutôt dans une optique
|
||||
« morefun » sur l'utilisation de nos machines.
|
||||
|
||||
% ==============================================================
|
||||
|
||||
\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}
|
||||
|
||||
Une invention géniale, voir un exemple d'utilisation par
|
||||
un gadget sonore en page \pageref{say-uptime} et
|
||||
Une invention géniale, dont vous pouvez voir un exemple d'utilisation
|
||||
par un gadget sonore en page \pageref{say-uptime} et
|
||||
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}
|
||||
|
||||
\begin{itemize}
|
||||
\item le traitement des chaines de caractères\dots
|
||||
\item la gestion des co-routines\dots
|
||||
\end{itemize}
|
||||
|
||||
|
||||
|
||||
28
chap/son.tex
28
chap/son.tex
@@ -2,10 +2,19 @@
|
||||
\label{chap:son}
|
||||
|
||||
Abordons maintenant un sujet complexe :
|
||||
le son en général,
|
||||
le son en général, et en particulier avec Linux.
|
||||
Vous pouvez aussi regarder
|
||||
la musique (p. \pageref{chap:musique}) et la
|
||||
synthèse de sons (p. \pageref{chap:modular}).
|
||||
|
||||
Complexe, parce que, il faut bien se le dire
|
||||
entre nous, je me permet d'affirmer avec vigueur que la gestion du son
|
||||
dans Linux est horriblement compliquée, pour ne pas dire
|
||||
totalement bordélique.
|
||||
C'est un empilement de couches logicielles, chacune destinée à
|
||||
un usage particulier, et qui passent leur temps à se marcher
|
||||
sur les pieds.
|
||||
|
||||
%------------------------------------------------------------------
|
||||
|
||||
\section{ALSA}
|
||||
@@ -33,6 +42,8 @@ Ensuite, nous avons \texttt{aplay} et \texttt{arecord},
|
||||
qui permettent d'écouter et d'enregistrer les sets de
|
||||
James Lewis\footnote{Que ça, c'est de la super noise !}.
|
||||
|
||||
Ils partagent beaucoup d'options communes.
|
||||
|
||||
\subsection{arecord}
|
||||
|
||||
Si vous avez plusieurs cartes son, la sélection du
|
||||
@@ -48,6 +59,13 @@ arecord -D plughw:CARD=Snowball,DEV=0 -v -r 22050 foo.wav
|
||||
arecord -D plughw:CARD=H4,DEV=0 -v -c 2 -f S16_LE -r 44100 foo.wav
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{aplay} \index{aplay}
|
||||
|
||||
C'est le pendant de arecord pour écouter des fichiers sonores.
|
||||
Avec pas mal d'options communes.
|
||||
|
||||
|
||||
|
||||
\subsection{Du code...}
|
||||
|
||||
\begin{verbatim}
|
||||
@@ -129,8 +147,8 @@ serveur de stream comme Icecast\index{icecast}
|
||||
Libsndfile est essentiellement une très complète bibliothèque
|
||||
de lecture et écriture de fichiers sons.
|
||||
Elle permet de gérer facilement un nombre
|
||||
considérable de formats de fichiers\footnote{Mais ceci est une autre
|
||||
histoire, que nous verrons peut-être un de ces jours\dots}.
|
||||
considérable de formats de fichiers,
|
||||
que nous verrons peut-être un de ces jours\dots.
|
||||
|
||||
Elle arrive avec une floppée d'outils en ligne de
|
||||
commande, dont certains sont assez performants.
|
||||
@@ -164,11 +182,11 @@ https://www.xiph.org/ao/doc/drivers.html
|
||||
Pour choisr comment et vers quelle prise physique libao va envoyer
|
||||
le son, il y a deux choix à faire. La partie logicielle d'une part
|
||||
(aixs, oss, alsa, jack, sndio\dots)
|
||||
et la partie matérielle (jack standard, casque audio USB\dots).
|
||||
et la partie matérielle (jack 3.5 standard, casque audio USB\dots).
|
||||
|
||||
%------------------------------------------------------------------
|
||||
|
||||
\section{Portaudio} \label{Portaudio} \index{Portaudio}
|
||||
\section{Portaudio} \label{Portaudio} \index{portaudio}
|
||||
|
||||
Une suggestion de Wargreen pour avancer un peu dans la construction
|
||||
de ma DAW\footnote{Digital Audio Workstation, aka machine à sons}
|
||||
|
||||
@@ -48,6 +48,9 @@ ou une playlistde fichiers \texttt{.ogg}\index{ogg}.
|
||||
\textsl{more to come...}
|
||||
|
||||
%-------------------------------------------------------------
|
||||
|
||||
% https://github.com/radiofrance/rf-liquidsoap
|
||||
|
||||
\section{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
|
||||
(ou souvent) hasardeux.
|
||||
|
||||
Heureusement, Unix\index{Unix} a été conçu quasiment dès
|
||||
le départ avec tout ce qu'il faut pour traiter et
|
||||
mettre en page du texte.
|
||||
|
||||
\section{fmt et ses copains}
|
||||
\index{fmt}\index{tr}
|
||||
|
||||
@@ -33,19 +37,20 @@ condimentum ante in metus iaculis quis congue diam commodo.
|
||||
|
||||
%-------------------------------------------------------------
|
||||
|
||||
\section{roff}
|
||||
\index{roff}\label{roff}
|
||||
\section{La famille \texttt{roff}}
|
||||
\index{roff}\label{roff} \index{groff}\index{troff}
|
||||
|
||||
%
|
||||
% https://linuxfr.org/users/karchnu/journaux/redecouverte-roff
|
||||
% https://pjfichet.github.io/utroff/
|
||||
%
|
||||
% https://allthingsopen.org/articles/linux-and-unix-experiment-part-2
|
||||
|
||||
\textbf{Roff} est l'outil qui a permis à quelques hackers légendaire
|
||||
de justifier auprès de leur hiérarchie le développement d'une machine
|
||||
de jeu, il est donc légitime d'en parler, non ?
|
||||
|
||||
Après quelques minutes d'expérimentation, un premier souci arrive.
|
||||
Après quelques minutes d'expérimentation, un premier souci arrive%
|
||||
\footnote{Mais qui est peut-être causé par l'ancienneté de mon système ?}.
|
||||
Il semble bien que \texttt{groff} ne sache pas lire les fichiers
|
||||
encodés en \textbf{utf8}\index{utf8}. Il faut donc utiliser
|
||||
un hack avec \texttt{recode} en prenant bien soin d'utiliser
|
||||
@@ -59,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.
|
||||
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}
|
||||
@@ -76,6 +148,8 @@ and texinfo, a poor-man's text converter and an experimental xml converter.
|
||||
\section{zoem}
|
||||
\index{zoem}
|
||||
|
||||
General-purpose macro/programming language for transforming text
|
||||
|
||||
\begin{quote}
|
||||
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.
|
||||
|
||||
@@ -24,7 +24,8 @@ Et c'est là que les ennuis potentiels débarquent :
|
||||
les jours, «~ils vont se marcher sur les pieds~».
|
||||
|
||||
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}
|
||||
|
||||
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}
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
%
|
||||
% <doug> https://img.ly/blog/ultimate-guide-to-ffmpeg/
|
||||
%
|
||||
|
||||
\section{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}
|
||||
|
||||
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}
|
||||
\# Write out 20 png format frames from a video starting at 3 minutes, 46 seconds.
|
||||
|
||||
|
||||
Tu peux générer les images de transition avec
|
||||
ImageMagick\index{ImageMagick} :
|
||||
\texttt{convert a.png b.png -alpha set -channel A
|
||||
@@ -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}
|
||||
|
||||
\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}
|
||||
|
||||
Là, nous sommes dans du \textsl{serious bizness}, puisque cette vidéo
|
||||
@@ -118,6 +138,40 @@ ffmpeg -nostdin \
|
||||
wip.mp4
|
||||
\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}
|
||||
|
||||
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}
|
||||
|
||||
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.
|
||||
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
|
||||
de commande.
|
||||
|
||||
@@ -160,8 +215,24 @@ used for retrieving technical information and other
|
||||
metadata about audio or video files.
|
||||
\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}
|
||||
|
||||
@@ -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
|
||||
assez perturbante.
|
||||
|
||||
\subsection{rtmp} \index{rtmp}
|
||||
|
||||
\texttt{flvstreamer -r rtmp://lacantine.live-fstreams.cdn02.rambla.be:1935/live-lacantine/live-lacantine-2 | mplayer -}
|
||||
\index{rtmp}
|
||||
|
||||
\texttt{encodedv} - encode a series of images to a digital video stream
|
||||
\index{encodedv}
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
|
||||
|
||||
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.}
|
||||
|
||||
%
|
||||
% PLEASE EXPLAIN !
|
||||
%
|
||||
|
||||
\begin{verbatim}
|
||||
tth@delirium:~/Essais/Fonderie$ v4l2-ctl --list-formats-ext
|
||||
tth@delirium:~$ v4l2-ctl --list-formats-ext
|
||||
ioctl: VIDIOC_ENUM_FMT
|
||||
Type: Video Capture
|
||||
|
||||
@@ -39,6 +43,80 @@ ioctl: VIDIOC_ENUM_FMT
|
||||
|
||||
Question : quelle méthode utiliser pour avoir la même chose avec
|
||||
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}
|
||||
|
||||
|
||||
|
||||
D'après la manpage :
|
||||
« \textit{
|
||||
vgrabbj is a program that will grab images from any v4l-capable device
|
||||
« \textit{%
|
||||
vgrabbj is a program that will grab images from any v4l-capable device
|
||||
which supports one of the rgb24, rgb32, yuv420, yuv420p, yuyv, or
|
||||
yuv422 palettes and saves the image as a .jpg, .png, or .pnm file.
|
||||
} »
|
||||
|
||||
Quelques options à connaitre : \texttt{-S} échange des
|
||||
deux composantes R et B; \texttt{-s <device>} affiche
|
||||
les capacités du périphérique v4l\index{v4l}.
|
||||
Quelques options à connaitre :
|
||||
\texttt{-S} échange des
|
||||
deux composantes R et B (parfois utile avec des caméras \textit{noname});
|
||||
\texttt{-s <device>} affiche
|
||||
les capacités du périphérique v4l\index{v4l} que l'on sélectionne
|
||||
avec \texttt{-d /dev/vidz0}.
|
||||
|
||||
Il y a plus de choses à dire, avec un exemple concret. XXX\index{XXX}
|
||||
|
||||
% --------------------------------------------------------------------
|
||||
\section{Cheese}
|
||||
|
||||
@@ -4,20 +4,26 @@
|
||||
\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.
|
||||
|
||||
Que nous ne verrons pas pour le moment. Je vais plutôt me concentrer
|
||||
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}
|
||||
|
||||
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}
|
||||
root@ramen:~# lighty-enable-mod userdir
|
||||
@@ -28,12 +34,23 @@ root@ramen:~#
|
||||
\end{verbatim}
|
||||
|
||||
\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
|
||||
(sans \texttt{index.html}) est interdit. Pour changer ça, il faut
|
||||
\texttt{\# lighttpd-enable-mod dir-listing} et
|
||||
\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}
|
||||
tth@ramen:~/Houba/Fractales90$ apt show libmicrohttpd12
|
||||
Package: libmicrohttpd12
|
||||
Version: 0.9.72-2
|
||||
Priority: optional
|
||||
Section: libs
|
||||
Source: libmicrohttpd
|
||||
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
|
||||
Installed-Size: 211 kB
|
||||
Depends: libc6 (>= 2.17), libgnutls30 (>= 3.7.0)
|
||||
Homepage: https://www.gnu.org/software/libmicrohttpd/
|
||||
Tag: role::shared-lib
|
||||
Download-Size: 109 kB
|
||||
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
|
||||
Description: library embedding HTTP server functionality
|
||||
GNU libmicrohttpd is a small C library that is supposed to make it
|
||||
easy to run an HTTP server as part of another application.
|
||||
Key features that distinguish GNU Libmicrohttpd from other
|
||||
projects are:
|
||||
* C library: fast and small
|
||||
* API is simple, expressive and fully reentrant
|
||||
* Implementation is HTTP 1.1 compliant
|
||||
* HTTP server can listen on multiple ports
|
||||
* Four different threading models (select, poll, pthread, thread pool)
|
||||
* Support for IPv6
|
||||
* Support for SHOUTcast
|
||||
* Support for incremental processing of POST data (optional)
|
||||
* Support for basic and digest authentication (optional)
|
||||
* Support for SSL3 and TLS
|
||||
\end{verbatim}
|
||||
|
||||
\lstinputlisting[language=C]{code/inet/plopserver.c}
|
||||
|
||||
% ==============================================================
|
||||
|
||||
\section{Mais encore ?}
|
||||
|
||||
Il doit bien exister des modules Perl pour faire facilement
|
||||
un serveur web, non ?
|
||||
Même qu'on pourrait en écrire un rien qu'avec les sockets.
|
||||
|
||||
|
||||
% ==============================================================
|
||||
|
||||
|
||||
25
code/.gitignore
vendored
Normal file
25
code/.gitignore
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
|
||||
a.out
|
||||
appelant
|
||||
arguments
|
||||
ex_curses
|
||||
fifo-rx
|
||||
fifo-tx
|
||||
flydraw.gif
|
||||
flydraw.png
|
||||
foo
|
||||
get-signal
|
||||
hello
|
||||
listen-osc
|
||||
C/no-op
|
||||
C/slowprint
|
||||
*.o
|
||||
plugiciel.so
|
||||
send-osc
|
||||
thread-demo
|
||||
voirenv
|
||||
|
||||
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>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
printf("hello world.\n");
|
||||
puts("hello world.");
|
||||
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,23 +10,9 @@ ex_curses: ex_curses.c Makefile
|
||||
thread-demo: thread-demo.c Makefile
|
||||
gcc -Wall -pthread $< -o $@
|
||||
|
||||
hello: hello.c Makefile
|
||||
voirenv: voirenv.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
arguments: arguments.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
no-op: no-op.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
|
||||
#------------- OSC -----------------------
|
||||
|
||||
osc: send-osc listen-osc
|
||||
|
||||
send-osc: send-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
listen-osc: listen-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
|
||||
#------------- IPC -----------------------
|
||||
|
||||
|
||||
9
code/OSC/Makefile
Normal file
9
code/OSC/Makefile
Normal file
@@ -0,0 +1,9 @@
|
||||
#------------- OSC -----------------------
|
||||
|
||||
osc: send-osc listen-osc
|
||||
|
||||
send-osc: send-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
|
||||
listen-osc: listen-osc.c Makefile
|
||||
gcc -Wall $< -llo -o $@
|
||||
0
code/OSC/README.md
Normal file
0
code/OSC/README.md
Normal file
48
code/OSC/listen-osc.c
Normal file
48
code/OSC/listen-osc.c
Normal file
@@ -0,0 +1,48 @@
|
||||
/* LISTEN OSC */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <lo/lo.h>
|
||||
#define LOCAL_PORT "9000"
|
||||
|
||||
/* ------------------------------------------------------- */
|
||||
void error(int num, const char *msg, const char *path)
|
||||
{
|
||||
fprintf(stderr, "liblo server error %d in path %s : %s\n",
|
||||
num, path, msg);
|
||||
exit(1);
|
||||
}
|
||||
/* ------------------------------------------------------- */
|
||||
int handler(const char *path, const char *types, lo_arg **argv,
|
||||
int argc, void *data, void *udata)
|
||||
{
|
||||
static int event_number = 1;
|
||||
|
||||
printf("------ event #%d :\n", event_number++);
|
||||
printf("\tpath '%s' types '%s' argc %d\n",
|
||||
path, types, argc);
|
||||
|
||||
printf("\tdata %p\n", data);
|
||||
// if (NULL!=data) printf("\t >%s<\n", data);
|
||||
printf("\tudata %p\n", udata);
|
||||
if (NULL!=udata) printf("\t\t>%s<\n", (char *)udata);
|
||||
return 0;
|
||||
}
|
||||
/* ------------------------------------------------------- */
|
||||
char signature[] = "Bourtoulots";
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
lo_server_thread st;
|
||||
int count = 0;
|
||||
|
||||
st = lo_server_thread_new(LOCAL_PORT, error);
|
||||
lo_server_thread_add_method(st, "/demo", "is", handler, signature);
|
||||
lo_server_thread_start(st);
|
||||
|
||||
for (;;) {
|
||||
fprintf(stderr, "%6d I'm alive\n", count++); sleep(10);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -11,8 +11,9 @@ int main(int argc, char *argv[])
|
||||
lo_address loana;
|
||||
int foo;
|
||||
|
||||
fprintf(stderr, "sending to %s:%s\n", REMOTE_HOST, REMOTE_PORT);
|
||||
loana = lo_address_new(REMOTE_HOST, REMOTE_PORT);
|
||||
foo = lo_send(loana, "/dev/kmem", "is", 61, "meg, efface !");
|
||||
fprintf(stderr, "foo %d\n", foo);
|
||||
foo = lo_send(loana, "/demo", "is", 61, "meg, efface !");
|
||||
fprintf(stderr, "got a %d return code ?\n", foo);
|
||||
return 0;
|
||||
}
|
||||
1
code/POV/.gitignore
vendored
Normal file
1
code/POV/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.png
|
||||
3
code/POV/Makefile
Normal file
3
code/POV/Makefile
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
hello.png: hello.pov Makefile
|
||||
povray -I$< -o$@ -W640 -H0 -Q0
|
||||
0
code/POV/README.md
Normal file
0
code/POV/README.md
Normal file
8
code/POV/hello.pov
Normal file
8
code/POV/hello.pov
Normal file
@@ -0,0 +1,8 @@
|
||||
/* HELLO.POV */
|
||||
#version 3.7;
|
||||
global_settings { assumed_gamma 1.0 }
|
||||
#include "colors.inc"
|
||||
|
||||
plane { y, 0 }
|
||||
sphere { <0, 0.50, 0>, 0.333 }
|
||||
light_source { <-210, 350, -530> color rgb <1, 1, 1>}
|
||||
3
code/Perl/README.md
Normal file
3
code/Perl/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Perl
|
||||
|
||||
The famous **Pathologic Eclectic Rubish Lister was here** !!!
|
||||
8
code/Perl/getip.pl
Executable file
8
code/Perl/getip.pl
Executable file
@@ -0,0 +1,8 @@
|
||||
#! /usr/bin/perl
|
||||
use strict;
|
||||
use LWP::UserAgent ();
|
||||
my $ua = LWP::UserAgent->new(agent => "curl");
|
||||
my $url = "https://ifconfig.io";
|
||||
my $req = HTTP::Request->new('GET' => $url);
|
||||
my $res = $ua->simple_request($req);
|
||||
print($res->content());
|
||||
10
code/Perl/listurls.pl
Executable file
10
code/Perl/listurls.pl
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/perl
|
||||
use strict;
|
||||
use LWP::Simple;
|
||||
use HTML::Parser;
|
||||
|
||||
my $page = get "https://tetalab.org";
|
||||
|
||||
my $parser = HTML::Parser->new;
|
||||
$parser->parse($page);
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
* gcc -Wall -shared -fPIC $< -ldl -o $@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define __USE_GNU
|
||||
#include <dlfcn.h>
|
||||
|
||||
@@ -18,15 +14,12 @@ char *getenv(char *envname)
|
||||
{
|
||||
static char *arrow = "--getenv--> ";
|
||||
static char *wtf = " --> (nil)";
|
||||
|
||||
char *content;
|
||||
original_getenv orig_getenv;
|
||||
|
||||
orig_getenv = (original_getenv)dlsym(RTLD_NEXT, "getenv");
|
||||
|
||||
write(STDERR_FILENO, arrow, strlen(arrow));
|
||||
write(STDERR_FILENO, envname, strlen(envname));
|
||||
|
||||
content = orig_getenv(envname);
|
||||
if (NULL != content) {
|
||||
write(STDERR_FILENO, "=", 1);
|
||||
@@ -35,9 +28,7 @@ if (NULL != content) {
|
||||
else {
|
||||
write(STDERR_FILENO, wtf, strlen(wtf));
|
||||
}
|
||||
|
||||
write(STDERR_FILENO, "\n", 1);
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
|
||||
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