Compare commits

...

121 Commits

Author SHA1 Message Date
tTh
e823f5d883 new bug nest 2024-11-12 08:46:37 +01:00
tTh
00db540bbc oups !!! 2024-11-06 14:29:53 +01:00
tTh
470327b596 vive le monde moderne 2024-11-06 14:28:45 +01:00
tTh
6790bb95ab cosmetic 2024-10-24 10:46:01 +02:00
tTh
e27ac13e68 a new little tool 2024-10-16 21:44:18 +02:00
tTh
e298d6ca5d add magick trick 2024-10-11 20:09:03 +02:00
tTh
b776f3de8d cosmetic 2024-10-02 14:24:35 +02:00
tTh
ac1afb5a88 add a trick 2024-09-29 23:57:24 +02:00
tTh
a1c0fddd17 the caturday's really big commit 2024-09-28 20:25:02 +02:00
tTh
dfede4a816 retired section 2024-09-26 00:57:56 +02:00
tTh
784b2d04aa and now, with working code 2024-09-23 20:53:00 +02:00
tTh
435b3195d2 working on roff 2024-09-23 19:32:56 +02:00
tTh
dfdfa7926e cosmetic 2024-09-22 16:51:49 +02:00
tTh
6fad79d67c typo 2024-09-22 16:50:49 +02:00
tTh
9c602777aa + minitroll 2024-09-21 21:36:24 +02:00
tTh
a1f7d1e0f2 ready for paper print ? 2024-09-17 19:03:54 +02:00
tTh
2dd4896b6c add another empty section 2024-09-17 19:03:19 +02:00
tTh
b252bf73a2 bla 2024-09-17 19:02:40 +02:00
tTh
7ed54fc123 more bla 2024-09-17 18:59:10 +02:00
tTh
48b66b3034 more tricks 2024-09-17 18:58:33 +02:00
tTh
2bb29f37e3 greeting tetalab 2024-09-17 18:57:52 +02:00
tTh
b67ce482bf a new empty section 2024-09-17 18:57:20 +02:00
tTh
b98ae9d629 empty chapter 2024-09-17 18:55:56 +02:00
tTh
615289b57e functions demonstartor 2024-09-17 18:55:04 +02:00
tTh
02054433b4 talking about awk 2024-09-17 18:53:54 +02:00
tTh
5723a754a8 bla about UVC 2024-09-17 18:53:09 +02:00
tTh
7e591fc958 add io related text 2024-09-17 18:52:17 +02:00
tTh
3bda7ea69b hide empty chapters 2024-09-17 17:53:46 +02:00
tTh
a1b0ffdabb virer un résidu 2024-09-17 15:51:05 +02:00
tTh
16e1d7707a typo 2024-09-17 11:39:30 +02:00
tTh
716345e270 add a feature 2024-09-17 11:23:05 +02:00
tTh
a1df488c58 cosmetic 2024-09-16 14:31:42 +02:00
tTh
9f129f64d9 no border on listings 2024-09-16 03:50:09 +02:00
tTh
d96238bca4 add SDL2 stuff 2024-09-16 03:26:04 +02:00
tTh
3ea16fbbc8 add some stuff 2024-09-16 03:24:26 +02:00
tTh
f7d11b4178 cosmetic 2024-09-16 03:22:22 +02:00
tTh
28933d542c finished the first awk example 2024-09-16 03:21:41 +02:00
tTh
0ee9005885 + chapitre dessin 2024-09-15 09:38:20 +02:00
tTh
eda5044c35 what is libwebcam ? 2024-09-11 17:25:44 +02:00
tTh
0b3e6d1517 moved source files 2024-09-11 17:22:01 +02:00
tTh
7ee4eb0930 patch on Makefiles 2024-09-10 23:00:32 +02:00
tTh
57973a0bc7 oups... 2024-09-10 14:38:41 +02:00
tTh
f35170113d moving files to a right place 2024-09-10 14:35:26 +02:00
tTh
61286736e3 put files in the right place 2024-09-10 14:27:37 +02:00
tTh
19e3db36ed updating the bug 2024-09-10 12:01:00 +02:00
tTh
3fc33f10ea strangebug.c 2024-09-10 11:38:00 +02:00
tTh
f15aad0c2e découverte de SDL2 2024-09-07 15:36:26 +02:00
tTh
3bd50b2ab5 dessin : un nouveau chapitre 2024-09-05 20:16:19 +02:00
tTh
a83761fea8 add chapter label 2024-09-05 00:52:25 +02:00
tTh
7abf55e44b fine tuning 2024-08-27 10:55:32 +02:00
tTh
1e175bc6ef pimp my plotting 2024-08-19 15:40:56 +02:00
tTh
0707c0192c + lscpu 2024-08-17 10:02:59 +02:00
tTh
13e00baba5 cosmetic 2024-08-17 10:02:17 +02:00
tTh
6aaf9de226 bla + trick 2024-08-17 10:01:32 +02:00
tTh
078d3d6b3a more garbage from op-code field 2024-08-08 16:29:03 +02:00
tTh
97f3cb336d cosmetic 2024-08-08 16:20:27 +02:00
tTh
ae2f0d965e cosmetic 2024-08-08 16:11:05 +02:00
tTh
0480a7a73f add envp pointer from main code 2024-08-08 16:05:30 +02:00
tTh
4b438e7f7a add use_envp 2024-08-08 15:48:54 +02:00
tTh
98334bd25e cosmetic 2024-08-08 15:41:04 +02:00
tTh
f00a06b0c7 more bla 2024-08-08 15:33:18 +02:00
tTh
f3289fc23c very little cosmetic change 2024-08-08 15:30:14 +02:00
tTh
f08879204f corrected an index 2024-08-08 15:29:05 +02:00
tTh
717006e34a add opendmx , cosmetic 2024-08-08 15:28:22 +02:00
tTh
1541deeff0 cosmetic 2024-08-08 15:26:53 +02:00
tTh
48beb52b14 add OpenDMX from Enttec 2024-08-08 15:25:43 +02:00
tTh
fd3a4b8336 *t vs t[] 2024-08-08 13:56:21 +02:00
tTh
3f76689640 corrected an index 2024-08-08 12:50:56 +02:00
tTh
055a470a2b corrected an index 2024-08-08 12:48:06 +02:00
tTh
e9acd130ea work done on print chapter 2024-08-08 08:43:58 +02:00
tTh
6a025f9503 bla 2024-07-11 02:25:38 +02:00
tTh
352ab26ba7 + abcde 2024-07-11 02:24:13 +02:00
tTh
f7b5af5a9b wesh scanf ! 2024-07-11 02:23:30 +02:00
tTh
326926aa16 cosmetic 2024-07-07 19:54:33 +02:00
tTh
58ba52762c add a chapter about DMX512 2024-06-04 01:37:47 +02:00
tTh
66bc3d19c4 add code/C/packtest.c 2024-03-27 11:05:42 +01:00
tTh
0818f87582 dernier commit avant le Gers 2024-03-11 02:20:47 +01:00
tTh
c5b0e17bbb cosmetic + kbhit 2024-02-22 21:39:39 +01:00
tTh
f53ee92b02 add advanced section 2024-02-22 20:08:21 +01:00
tTh
b1ebd390b4 now you can specifiy the slowdown 2024-01-12 03:43:49 +01:00
tTh
70545d9355 need a lot of work 2024-01-11 02:08:26 +01:00
tTh
ca1b226a13 wtf? 2024-01-11 02:07:04 +01:00
tTh
6ad95e84ff fine tuning 2024-01-11 01:49:15 +01:00
tTh
c09df69af3 a chapter about make 2024-01-11 01:42:44 +01:00
tTh
95c17583f5 add some info on config of ImageMagick 2023-12-11 09:55:45 +01:00
tTh
2a24703136 more bla 2023-11-29 14:12:03 +01:00
tTh
da080e47e3 add a nasty R chapter 2023-11-29 14:10:57 +01:00
tTh
72892afeff raler un peu 2023-10-13 22:05:00 +02:00
tTh
c3e227f472 a 771 lines diff 2023-10-08 21:56:41 +02:00
tTh
c6fe2224bf more on strtok 2023-09-03 22:24:56 +02:00
tTh
42ead5b695 no more fedora 2023-09-03 22:24:28 +02:00
tTh
ef609cbb57 little edits 2023-09-03 20:30:43 +02:00
tTh
b404dde88b cosmetic 2023-09-03 07:49:40 +02:00
tTh
9d08631b32 demo de strtok 2023-09-01 12:37:36 +02:00
tTh
db14adeb86 cosmetic 2023-09-01 11:06:31 +02:00
tTh
bfef02de49 little clean 2023-07-15 11:45:22 +02:00
tTh
a1f8b096e3 talking about fgets 2023-07-15 09:55:13 +02:00
tTh
8ba88d2b8d fgets investigations 2023-07-15 09:19:50 +02:00
tTh
aeeefe061d bla 2023-07-14 21:17:27 +02:00
tTh
07ae0d5a8a exemple minimal compilable 2023-07-14 16:09:53 +02:00
tTh
97909fdcd4 summer is coming 2023-06-29 11:23:11 +02:00
tTh
52b7bbe6ef #sundaycommit 2023-04-02 23:32:29 +02:00
tTh
28c260ea5e first gif89a with fortran & plplot 2023-03-21 15:03:09 +01:00
tTh
0db76fef58 assez pour ce soir 2023-03-21 00:16:54 +01:00
tTh
aa4f0664cb premier dessin avec plplot 2023-03-07 20:49:36 +01:00
tTh
04eeae6de9 cosmetic 2023-03-06 14:43:24 +01:00
tTh
aa3d078e21 tweak fortran pages 2023-03-04 12:48:05 +01:00
tTh
6c2d6476b8 new chapter: Basic 2023-03-03 21:27:18 +01:00
tTh
6546d1d5c0 add a TODO 2023-03-03 20:21:15 +01:00
tTh
a47c1f6d7a bricolages... 2023-02-11 12:19:00 +01:00
tTh
43202ab62e parce que... 2023-02-09 23:41:16 +01:00
tTh
51395297e7 last commit of january 2023-01-29 22:16:13 +01:00
tTh
c52abb9fda dernier commit 2022 2022-12-31 15:39:58 +01:00
tTh
87fb8ed834 time to sleep... 2022-12-16 20:41:32 +01:00
tTh
75a94fc6c7 cosmetic 2022-10-30 22:51:57 +01:00
tTh
d8369bef0a commit nocturne 2022-10-05 06:08:23 +02:00
tTh
9e8a6b3411 a new tool from tth 2022-10-04 19:31:50 +02:00
tTh
5a610e0926 technical commit 2022-10-04 19:27:24 +02:00
tTh
14b3ef6c3b on se lance sur ABC 2022-10-04 19:26:53 +02:00
tTh
11d559eade clean output messages 2022-10-04 05:47:23 +02:00
tTh
cb76c0350f rester bien sagement en ASCII 2022-10-03 17:45:11 +02:00
136 changed files with 4379 additions and 557 deletions

19
.gitignore vendored
View File

@@ -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

View File

@@ -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
View 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
View 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.
% ====================================================================

View File

@@ -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
@@ -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,10 +625,81 @@ 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}
Le C est un langage parsemé de fosses, de chausse-trapes et de
pièges fourbes et sournois. Sans parler des UBs, hein\dots
\begin{itemize}
\item{Variables non initialisées.}
@@ -478,6 +718,8 @@ et un exemple simple d'utilisation.
XXX \index{XXX}
Un ordinateur est déterministe.
% =========================================================
\section{Debug} \index{Debug}
@@ -508,11 +750,14 @@ any strictly conforming program in which the use of the features
specified in the header <string.h> , except the following functions:
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}
@@ -524,6 +769,50 @@ types of devices.
\lstinputlisting[language=c]{code/g2/un_dessin.c}
%
% XXX EXEMPLE TROP MINIMALISTE !!!
%
% =========================================================
%
% Message-ID: <ur80s3$677$1@dont-email.me>
%
\section{Advanced}
Direct from Usenet (\texttt{comp.lang.c}):
\textsl{I did an experiment where is possible to create "sets" of warnings.}
\begin{verbatim}
#define SAFE_REGION \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic error \"-Wenum-compare\"")\
_Pragma("GCC diagnostic error \"-Wparentheses\"")\
_Pragma("GCC diagnostic error \"-Wuninitialized\"")
#define RESTORE \
_Pragma("GCC diagnostic pop")
enum E1 { A };
enum E2 { B };
SAFE_REGION
int main() {
int a, b;
if (a = b){}
if (A == B){}
}
RESTORE
\end{verbatim}
\begin{quote}
J'avoue avoir mis un certain temps à capter. Je vais attendre
le \textsl{follow-up} de Bart pour avoir confirmation.
\end{quote}
% =========================================================
\section{La suite?}
% Message-ID: <657f1dd4$0$10079$426a74cc@news.free.fr>
% NNTP-Posting-Date: 17 Dec 2023 17:12:04 CET
Étudier les différents modêles de mémoire partagée.
% =========================================================
@@ -534,7 +823,8 @@ divers comme Open Sound Control (page \pageref{chap:OSC}) ou
libsndfile (page \pageref{chap:son}).
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
View 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 its
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 USBs output is processed directly on
the computers 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} !
% -----------------------------------------------------
% -----------------------------------------------------
% -----------------------------------------------------

View File

@@ -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}

View File

@@ -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}
\begin{lstlisting}
character(len=89) :: arg
real :: cx
call getarg(2, string) ; read (string, *) cx
\end{verbatim}
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
% ========================================

View File

@@ -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
% ====================================================================

View File

@@ -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}

View File

@@ -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
View 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.

View File

@@ -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
% ================================================================

View File

@@ -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}
% ------------------------------------------------------

View File

@@ -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
View 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}
% ======================================================================

View File

@@ -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 !}
% ==================================================================

View File

@@ -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}

View File

@@ -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}

View File

@@ -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
View 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.
% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

View File

@@ -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{||}
% --------------------------------------------------------

View File

@@ -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.
% =========================================================

View File

@@ -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
View File

@@ -0,0 +1,12 @@
\chapter{Dessiner}
\label{chap:dessin}
%
% new: Thu Sep 5 18:14:20 UTC 2024
%
% =======================================================================
\section{xpaint} \index{xpaint}
% =======================================================================

View File

@@ -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}.
% ==============================================================
%

View File

@@ -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}
% ----------------------------------------------------------

View File

@@ -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}
% ===============================================================

View File

@@ -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.
% ==================================================================

View File

@@ -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}

View File

@@ -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,27 +125,30 @@ 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}
@@ -102,9 +173,33 @@ 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.
% ------------------------------------------------

View File

@@ -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...
% -----------------------------------------------------------

View File

@@ -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%
@@ -87,19 +89,33 @@ convert nom_du_fichier_source.jpg -gravity SouthEast \
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: espacement entre les caractères}
\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 ?
\subsection{montage}
% ------------------------------------------
% faire des affiches
\subsection{montage}\index{montage}
\begin{quote}
create a composite image by combining several separate images. The images are
@@ -109,11 +125,14 @@ image name, and more.
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.
@@ -122,7 +141,8 @@ 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}.
% ------------------------------------------
@@ -148,9 +168,11 @@ changer la dimension de l'image. En détail, j'ai pas tout compris.
On trouve encore en circulation de très vieux logiciels qui ne savent lire
qu'un encore plus ancien format : \textsl{Targa file format}.
Et dans une variante bien précise.
Et dans une variante bien précise : mode \textsc{rgb} et non compressé%
\footnote{Un jour, peut-être, ça va changer\dots}.
Il nous faut donc une incantation bien précise :
Il nous faut donc une incantation bien précise avec, heureusement, des
arguments aux noms évocateurs :
\begin{lstlisting}
GOTO_TGA ()
@@ -170,21 +192,86 @@ On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
\end{verbatim}
Un volontaire dans la salle pour faire des tests de performance ?
Ma première hypothèse est que le résultat des mesures peut
être assez surprenant.
% ------------------------------------------
\subsection{identify}\index{identify}
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...}
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}
\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}
@@ -200,7 +287,8 @@ language interpreter. gmic: GREYC's Magic for Image Computing.}
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
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
@@ -229,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.} ?
% -------------------------------------------------------------------
@@ -265,15 +353,27 @@ use it heavily.
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}
@@ -297,6 +397,9 @@ 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}

View File

@@ -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
View 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}.
% ===============================================================
% ===============================================================

View File

@@ -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

View File

@@ -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.
%================================================================

View File

@@ -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}

View File

@@ -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}
%-----------------------------------------------------------------

View File

@@ -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
@@ -52,12 +55,10 @@ est peut-être un debianisme, ymmv.} un fichier nommé
\begin{verbatim}
service qotd
{
disable = yes
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
user = nobody
server = /usr/local/bin/qotd.sh
}
@@ -65,19 +66,34 @@ server = /usr/local/bin/qotd.sh
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}

View File

@@ -1,10 +1,41 @@
\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
@@ -16,19 +47,157 @@ une idée du langage\dots
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.
% ===============================================================

View File

@@ -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}

View File

@@ -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}

View File

@@ -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
View File

@@ -0,0 +1,3 @@
\chapter{systemd}
\label{chap:systemd}

3
chap/systemd.text Normal file
View File

@@ -0,0 +1,3 @@
\chapter{systemd}
\label{chap:systemd}

View File

@@ -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, litalique, 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.

View File

@@ -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
View 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
View 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...
% ==============================================================

View File

@@ -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
View File

@@ -0,0 +1,7 @@
\chapter{Wayland}
\label{chap:wayland} \index{wayland}
L'avenir sans X11 ?\index{X11}

View File

@@ -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
nest pas encore au point et nest 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{
« \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}

View File

@@ -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.
% ==============================================================

6
code/.gitignore vendored
View File

@@ -12,10 +12,14 @@ foo
get-signal
hello
listen-osc
no-op
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
View File

9
code/ABC/paddy.abc Normal file
View 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
View 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
View 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
View File

@@ -0,0 +1,3 @@
for i=1 to 10
print i, i*i
next

5
code/Basic/yabasic-2.bas Normal file
View 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
View File

@@ -0,0 +1,4 @@
fgets-simple
demo-strtok
packtest
use_envp

35
code/C/Makefile Normal file
View 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
View 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
View 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
View 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);
}

View File

@@ -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
View 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
View 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
View 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;
}

View File

@@ -10,26 +10,9 @@ ex_curses: ex_curses.c Makefile
thread-demo: thread-demo.c Makefile
gcc -Wall -pthread $< -o $@
hello: hello.c Makefile
gcc -Wall $< -o $@
arguments: arguments.c Makefile
gcc -Wall $< -o $@
no-op: no-op.c Makefile
gcc -Wall $< -o $@
voirenv: voirenv.c Makefile
gcc -Wall $< -o $@
#------------- OSC -----------------------
osc: send-osc listen-osc
send-osc: send-osc.c Makefile
gcc -Wall $< -llo -o $@
listen-osc: listen-osc.c Makefile
gcc -Wall $< -llo -o $@
#------------- IPC -----------------------

9
code/OSC/Makefile Normal file
View 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
View File

48
code/OSC/listen-osc.c Normal file
View 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;
}

View File

@@ -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
View File

@@ -0,0 +1 @@
*.png

3
code/POV/Makefile Normal file
View File

@@ -0,0 +1,3 @@
hello.png: hello.pov Makefile
povray -I$< -o$@ -W640 -H0 -Q0

0
code/POV/README.md Normal file
View File

8
code/POV/hello.pov Normal file
View 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
View File

@@ -0,0 +1,3 @@
# Perl
The famous **Pathologic Eclectic Rubish Lister was here** !!!

8
code/Perl/getip.pl Executable file
View 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
View 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
View File

@@ -0,0 +1,3 @@
# R
Be warned, Only garbage here.

View File

@@ -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
View File

@@ -0,0 +1 @@
strangebug

4
code/SDL2/Makefile Normal file
View File

@@ -0,0 +1,4 @@
strangebug: strangebug.c Makefile
gcc -Wall $< -lSDL2 -o $@

11
code/SDL2/README.md Normal file
View 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) **:)**

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

47
code/SDL2/strangebug.c Normal file
View 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
View 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 :
![un dégradé plein de rayures](picz/strangebug.png)
*Please explain that ...*

0
code/awk/README.md Normal file
View File

20
code/awk/demo-func.awk Executable file
View 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
View 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
View File

20
code/bdd/mkgdbm.pl Normal file
View 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;

View File

@@ -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
View File

@@ -0,0 +1,9 @@
plplotting
dessiner
printty
*.png
*.gif
WS/*.png
WS/*.eps

23
code/fortran/Makefile Normal file
View 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