Compare commits

..

6 Commits

Author SHA1 Message Date
tth
0ad7108d5a more bla, and more bugs 2021-09-16 18:53:40 +02:00
tth
d20a832a8d first working plugin demo 2021-09-16 18:31:11 +02:00
tth
3437173612 attributs everywhere ? 2021-09-10 10:17:33 +02:00
tth
9fd7a01bee mute empty chapters 2021-09-04 12:45:15 +02:00
tth
7e051e3caa better messages 2021-08-30 12:23:49 +02:00
tth
f5b9cf17dc bla 2021-08-28 17:06:26 +02:00
20 changed files with 346 additions and 36 deletions

3
.gitignore vendored
View File

@ -24,3 +24,6 @@ code/no-op
code/get-signal code/get-signal
code/fifo-tx code/fifo-tx
code/fifo-rx code/fifo-rx
code/plugiciel.so
code/appelant

View File

@ -350,7 +350,8 @@ Il y a plein d'autres exemples de code en C, sur des sujets
divers comme Open Sound Control (page \pageref{chap:OSC}) ou divers comme Open Sound Control (page \pageref{chap:OSC}) ou
libsndfile (page \pageref{chap:son}). libsndfile (page \pageref{chap:son}).
Et pour les gens du système~: Et pour les gens du système~:
l'utilisation des signaux (page \pageref{get-signal}). l'utilisation des signaux (page \pageref{get-signal}),
le chargement dynamique (page \pageref{ex_dlopen}.
% --------------------------------------------------------- % ---------------------------------------------------------

View File

@ -96,6 +96,8 @@ Ce marqueur temporel sera obtenu par l'appel à
pour tenter d'avoir une précision pour tenter d'avoir une précision
significative. significative.
% ----------------------------------------------------------------
\subsection{Émetteur} \subsection{Émetteur}
Son role est simple~: il met le timestamp dans l'enveloppe, et Son role est simple~: il met le timestamp dans l'enveloppe, et
@ -103,6 +105,11 @@ la poste vers l'adresse qu'on lui passe sur la ligne de commande.
\lstinputlisting[language=c]{code/fifo-tx.c} \lstinputlisting[language=c]{code/fifo-tx.c}
Vous remarquerez que nous nettoyons le message avant utilisation
avec un \texttt{memset(3)}, une étape trop souvent oubliée.
% ----------------------------------------------------------------
\subsection{Récepteur} \subsection{Récepteur}
Pour faire simple, le récepteur des messages va passer l'intégralité Pour faire simple, le récepteur des messages va passer l'intégralité
@ -115,7 +122,12 @@ Sauf que ça n'est pas tout à fait ça.
\lstinputlisting[language=c]{code/fifo-rx.c} \lstinputlisting[language=c]{code/fifo-rx.c}
J'avoue ne pas avoir encore bien capté le deuxième argument J'avoue ne pas avoir encore bien capté le deuxième argument
de mkfifo\dots de mkfifo, mais la lecture de
\texttt{fifo(7)} et de \texttt{pipe(7)} peut être
utile pour comprendre\footnote{modulo les références circulaires.}
la chose\dots
% ----------------------------------------------------------------
\subsection{Timestamp} \index{timestamp} \subsection{Timestamp} \index{timestamp}
@ -136,6 +148,8 @@ the system time). If you need a monotonically increasing clock, see
clock\_gettime(2). clock\_gettime(2).
\end{quote} \end{quote}
% ----------------------------------------------------------------
\subsection{Message} \subsection{Message}
Pour des raisons pas si évidente que ça, les messages transmis Pour des raisons pas si évidente que ça, les messages transmis
@ -146,6 +160,8 @@ une structure (page ???) contenant les données à transmettre.
C'est rudimentaire, mais ça fera l'affaire pour claquer un Bonaldi. C'est rudimentaire, mais ça fera l'affaire pour claquer un Bonaldi.
% ----------------------------------------------------------------
% ================================================================ % ================================================================

7
chap/README.md Normal file
View File

@ -0,0 +1,7 @@
# Les chapitres
Le label d'un chapitre est de la forme
`chap:filename`.

21
chap/buzybox.tex Normal file
View File

@ -0,0 +1,21 @@
\chapter{Buzybox}
\label{chap:buzybox}
\index{buzybox}
Buzybox est un peu le couteau suisse des systèmes Unix minimalistes,
tels que ceux que l'on peut trouver dans des routeurs WiFi
(OpenWrt\index{OpenWrt}, par exemple. Cf page \pageref{chap:openwrt}),
ou des systèmes embarqués de toutes natures.
%
% https://opensource.com/article/21/8/what-busybox
%
\begin{quote}
BusyBox is an open source (GPL) project providing simple implementations
of nearly \textbf{400} common commands, including ls, mv, ln, mkdir, more, ps,
gzip, bzip2, tar, and grep. It also contains a version of the programming
language awk, the stream editor sed, the filesystem checker fsck, the
rpm and dpkg package managers, and of course, a shell (sh) that provides
easy access to all of these commands.
\end{quote}

30
chap/cd-dvd.tex Normal file
View File

@ -0,0 +1,30 @@
\chapter{CD \& DVD}
\label{chap:cd-dvd}
\index{cdrom} \index{dvd}
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
en explorer quelques uns.
% --------------------------------------------------------
\section{CD Audio}
\subsection {Riping}
Le \textsl{ripage} est l'action d'extraire les pistes d'un
ce audion pour les convertir en fichier numérique audio.
\subsection {Mastering}
% --------------------------------------------------------
\section{DVD}
% --------------------------------------------------------
% --------------------------------------------------------

View File

@ -7,17 +7,23 @@
En fait, nous allons plutôt parler de \textbf{ncurses} qui est En fait, nous allons plutôt parler de \textbf{ncurses} qui est
l'implémentation actuelle de l'ancêtre \texttt{curses}. Voic ce l'implémentation actuelle de l'ancêtre \texttt{curses}. Voic ce
qu'en dit une page de man : qu'en dit une page de man~:
\begin{quote} \begin{quote}
The ncurses library routines give the user a terminal-independent The ncurses library routines give the user a terminal-independent
method of updating character screens with reasonable optimization. method of updating character screens with reasonable optimization.
This implementation is ``new curses'' (ncurses) and is the approved This implementation is ``new curses'' (ncurses) and is the approved
replacement for 4.4BSD classic curses, which has been discontinued. replacement for 4.4BSD classic curses, which ha been discontinued.
\end{quote} \end{quote}
Plus concrètement, Curses est un moyen optimisé de gestion des
écrans textes (Rappellez-vous notre ami le \textsc{Minitel}) afin
de créer des interfaces 'full-screen'. Vous pouvez adresser
chaque cellule de votre écran (la case où l'on peut mettre
un caractère) pour y écrire quelque chose, en gérant des
attributs tels que gras ou souligné.
\section{premier exemple} \section{Premier exemple}
Bien entendu, nous commencerons par l'ECM traditionnel de rigueur. Bien entendu, nous commencerons par l'ECM traditionnel de rigueur.
@ -28,12 +34,35 @@ interne de ncurses, et à régler l'interaction clavier/écran.
Ensuite, avec \texttt{mvaddstr}, nous écrivons le texte passé Ensuite, avec \texttt{mvaddstr}, nous écrivons le texte passé
en paramètre à une position fixée ligne,colonne en paramètre à une position fixée ligne,colonne
dans un écran virtuel dans un écran virtuel (qui n'existe qu'en mémoire)
qui sera ensuite transféré dans l'écran réel qui sera ensuite transféré dans l'écran réel (celui qui est affiché)
par le \texttt{refresh()}. par le \texttt{refresh()}.
Dans ma grande mansuétude, je n'aurais pas l'audace de vous montrer
une capture d'écran, puisque je me permet de supposer que vous
avez pris le temps de compiler l'exemple, et de voir par vous même
ce que ça donne.
\section{astuces} \section{Bell and whistles}
Voici comment centrer sur la ligne du haut
un texte écrit en \textbf{gras} grace à l'attribut
\texttt{A\_BOLD} :
\begin{verbatim}
attron(A_BOLD);
mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text);
attroff(A_BOLD);
\end{verbatim}
Il existe tout un tas d'autres attributs:
\texttt{A\_UNDERLINE} pour le soulignement ou
\texttt{A\_BLINK} pour clignoter, par exemple.
La liste complète est dans le man~: \texttt{attr(3NCURSES)},
avec plein
de fonctions spécialisées dans le traitement des attributs.
\section{Astuces}
Dans une boucle interactive, on va utiliser \texttt{getch()}, qui va Dans une boucle interactive, on va utiliser \texttt{getch()}, qui va
bloquer tant qu'on n'a pas tapé sur une touche. Mais que faire si bloquer tant qu'on n'a pas tapé sur une touche. Mais que faire si

View File

@ -8,12 +8,22 @@ Gnuplot - an interactive plotting program
There is an on-line demo collection at http://gnuplot.info/demo There is an on-line demo collection at http://gnuplot.info/demo
\begin{verbatim}
gnuplot> splot "cam.indoor" using 2:4:3, "cam.indoor" using 5:7:6
\end{verbatim}
% ------------------------------------------------------------------- % -------------------------------------------------------------------
\section{Exemple : le phytotron} \section{Exemple : le phytotron}
\index{phytotron} \index{phytotron}
Un exemple réel, issu d'un projet d'élevage d'algues
bio-luminescentes dans un frigo bricolé.
Le fichier des données contient cinq champs séparés par des blancs.
Le premier est
un \textsl{timestamp} exprimé en secondes depuis l'\textsl{epoch},
et les quatre suivants sont des températures en degrés Celsius.
\begin{verbatim} \begin{verbatim}
#!/bin/bash #!/bin/bash
@ -48,6 +58,10 @@ __EOC__
display ${IMAGE} & display ${IMAGE} &
\end{verbatim} \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 ».}
% ------------------------------------------------------------------- % -------------------------------------------------------------------
\section{Questions} \section{Questions}

View File

@ -1,5 +1,7 @@
\chapter{Graphisme} \chapter{Graphisme}
Quelques notes en vrac.
% ------------------------------------------------ % ------------------------------------------------
\section{Flydraw}\index{Flydraw} \section{Flydraw}\index{Flydraw}
@ -17,6 +19,53 @@ GIF, JPEG, or PNG\index{PNG} files.
\textbf{Persistence Of Vision} est un logiciel de raytracing qui \textbf{Persistence Of Vision} est un logiciel de raytracing qui
existe depuis plus de trente ans. existe depuis plus de trente ans.
\subsection{Caméra}
Vous avez des problèmes pour caler les mouvement de la caméra ?
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
lors du calcul de la séquence~:
\begin{verbatim}
#if (0 = clock)
#fopen CL "cam.log" create
#else
#fopen CL "cam.log" append
#end
#write (CL, clock, " ", CamX, " ", CamY, " ", CamZ,
" ", LatX, " ", LatY, " ", LatZ,"\n")
#fclose CL
\end{verbatim}
Et la seconde, l'exploitation des données~:
\begin{verbatim}
#!/bin/bash
FILE="cam.log"
TMPF="/dev/shm/cam.data"
IMAGE="graphe.png"
tail -360 $FILE | sort -n > $TMPF
gnuplot << __EOC__
set term png size 720,720
set output "${IMAGE}"
set ytics 2
set xtics 2
set grid front
set title "Rush Camera"
plot "$TMPF" using 2:4 title "Cam", \
"$TMPF" using 5:7 title "Lat" with dots
__EOC__
display "${IMAGE}" &
\end{verbatim}
% ------------------------------------------------ % ------------------------------------------------
% ------------------------------------------------ % ------------------------------------------------

11
chap/openwrt.tex Normal file
View File

@ -0,0 +1,11 @@
\chapter{OpenWrt}
\label{chap:openwrt}
\index{openwrt}
\begin{verbatim}
TP Ling
AC 1750
Archer C7
\end{verbatim}

View File

@ -1,9 +1,26 @@
\chapter{Plugins} \chapter{Plugins}
\index{plugin} \index{plugin}
\texttt{dlopen}\index{dlopen} % ------------------------------------
dlclose, dlopen, dlmopen - open and close a shared object Le concept de bibliothèque partagée
(\textsl{shared library} en anglais est apparu, du moins
dans le monde Unix, avec \textsl{SunOS 4}, en 1989.
Mais il est probable que ce concept existait déja dans
d'autres mondes, peut-être avec \textsl{AmigaOS} ou
\textsl{VAX/VMS}\index{VMS}\dots
Et c'est en partie sur ce concept qu'est basé le premier
mécanisme que nous allon découvrir~:
\texttt{dlopen} et sa petite famille.
% ------------------------------------
\section{Mécanique}
\index{dlopen}
\texttt{dlclose, dlopen, dlmopen - open and close a shared object}
\begin{quote} \begin{quote}
The function dlopen() loads the dynamic shared object (shared library) The function dlopen() loads the dynamic shared object (shared library)
@ -13,9 +30,58 @@ functions in the dlopen API, such as dlsym(3), dladdr(3), dlinfo(3),
and dlclose(). and dlclose().
\end{quote} \end{quote}
\section{Un exemple ?} % ------------------------------------
XXX\index{XXX} \section{Un exemple ?}
\label{ex_dlopen}
Comme d'habitude, je vais proposer un exemple un peu artificiel,
mais qui, de part sa simplicité, illustrera clairement
les concepts de base. Partons du principe que nous avons
un tableau de quatre nombres flottants, et que nous souhaitons
proposer un affichage de ce tableau modifiable à volonté.
Nous allons donc écrire notre fonction personnelle d'affichage
dans un fichier \textsc{.c} indépendant (le plugiciel) et qui
sera chargé dynamiquement au \textsl{run-time} par le logiciel
principal (l'appelant).
\subsection{Le plugiciel}
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.
\lstinputlisting[language=c]{code/plugiciel.c}
On peut difficelement faire plus simple pour une première
approche, mais attendez la suite.
\subsection{L'appelant}
\lstinputlisting[language=c]{code/appelant.c}
Ah, les choses se corsent un peu, il y a un pointeur bien
tortueux à déchiffrer. Il était temps.
\texttt{void (*funcname)(const char*, const float *);}
\subsection{Le run}
\begin{verbatim}
tth@fubar:~/Documents/TetaTricks/code$ make plugin
gcc -Wall -shared -fPIC plugiciel.c -o plugiciel.so
gcc -Wall appelant.c -ldl -o appelant
tth@fubar:~/Documents/TetaTricks/code$ ./appelant
rgb * a = : 6.685000 8.320000 1.570795
tth@fubar:~/Documents/TetaTricks/code$
\end{verbatim}
% ------------------------------------
\section{Autres langages}

View File

@ -19,11 +19,13 @@ arguments: arguments.c Makefile
no-op: no-op.c Makefile no-op: no-op.c Makefile
gcc -Wall $< -o $@ gcc -Wall $< -o $@
#------------- IPC #------------- IPC -----------------------
get-signal: get-signal.c Makefile get-signal: get-signal.c Makefile
gcc -Wall $< -o $@ gcc -Wall $< -o $@
fifo: fifo-rx fifo-tx
dtime.o: dtime.c my-fifo.h Makefile dtime.o: dtime.c my-fifo.h Makefile
gcc -Wall -c $< gcc -Wall -c $<
@ -33,3 +35,13 @@ fifo-tx: fifo-tx.c my-fifo.h dtime.o Makefile
fifo-rx: fifo-rx.c my-fifo.h dtime.o Makefile fifo-rx: fifo-rx.c my-fifo.h dtime.o Makefile
gcc -Wall $< dtime.o -o $@ gcc -Wall $< dtime.o -o $@
#------------- PLUGIN --------------------
plugin: plugiciel.so appelant
plugiciel.so: plugiciel.c plugiciel.h Makefile
gcc -Wall -shared -fPIC $< -o $@
appelant: appelant.c plugiciel.h Makefile
gcc -Wall $< -ldl -o $@

31
code/appelant.c Normal file
View File

@ -0,0 +1,31 @@
/* appelant.c */
#include <stdio.h>
#include <dlfcn.h>
void affichage(char *titre, float vals[4]);
int main(int argc, char *argv[])
{
void *handle;
float values[4];
void (*funcname)(const char*, const float *);
handle = dlopen("./plugiciel.so", RTLD_LAZY);
if (!handle) {
/* fail to load the library */
fprintf(stderr, "Error: %s\n", dlerror());
return 1;
}
*(void**)(&funcname) = dlsym(handle, "affichage");
values[0] = 13.37; values[1] = 16.64;
values[2] = 3.14159; values[3] = 0.5;
funcname("rgb * a =", values);
dlclose(handle);
return 0;
}

View File

@ -1,6 +1,6 @@
#include <stddef.h> #include <stddef.h>
#include <sys/time.h> #include <sys/time.h>
#include "my-fifo.h"
double dtime(void) double dtime(void)
{ {
struct timeval tv; struct timeval tv;

View File

@ -5,8 +5,10 @@ int main(int argc, char *argv[])
{ {
int key; int key;
if (2 != argc) exit(1); if (2 != argc) {
fputs("need an argument\n", stderr);
exit(1);
}
initscr(); /* first initialization */ initscr(); /* first initialization */
cbreak(); /* no line buffering */ cbreak(); /* no line buffering */
noecho(); /* be silent on input */ noecho(); /* be silent on input */
@ -14,11 +16,9 @@ keypad(stdscr, TRUE); /* acces touches curseur */
mvaddstr(10, 3, argv[1]); mvaddstr(10, 3, argv[1]);
refresh(); refresh();
key = getch(); key = getch();
endwin(); endwin();
printf("code touche %d\n", key); printf("code touche %d 0x%X\n", key, key);
return 0; return 0;
} }

View File

@ -13,9 +13,12 @@ int fifo;
Message message; Message message;
double localTS; double localTS;
if (argc!=2) exit(1); if (argc!=2) {
fifo = mkfifo(argv[1], 0400); fprintf(stderr, "%s need a fifo name\n", argv[0]);
if (fifo) { exit(1);
}
fifo = mkfifo(argv[1], O_RDONLY|O_CREAT);
if (-1==fifo) {
perror("mkfifo fail"); perror("mkfifo fail");
exit(2); exit(2);
} }

View File

@ -1,6 +1,7 @@
/*** named pipe --- transmiter ***/ /*** named pipe --- transmiter ***/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include "my-fifo.h" #include "my-fifo.h"
@ -15,6 +16,7 @@ if (-1==(fifo = open(argv[1], O_WRONLY))) {
perror("open fifo for wr"); perror("open fifo for wr");
exit(1); exit(1);
} }
memset(&message, 0, sizeof(Message));
message.pid = getpid(); message.pid = getpid();
message.timestamp = dtime(); message.timestamp = dtime();
write(fifo, &message, sizeof(Message)); write(fifo, &message, sizeof(Message));

11
code/plugiciel.c Normal file
View File

@ -0,0 +1,11 @@
/* plugiciel.c */
#include <stdio.h>
#include "plugiciel.h"
void affichage(char *titre, float vals[4])
{
printf("%s : %f %f %f\n", titre,
vals[0]*vals[3], vals[1]*vals[3],
vals[2]*vals[3]);
}

1
code/plugiciel.h Normal file
View File

@ -0,0 +1 @@
void affichage(char *titre, float vals[4]);

View File

@ -90,7 +90,7 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
% peut-être trouver un ordre des chapitres plus logique ? % peut-être trouver un ordre des chapitres plus logique ?
% %
\input{chap/boot} % \input{chap/boot}
\input{chap/shell} \input{chap/shell}
% \input{chap/editeurs} % \input{chap/editeurs}
\input{chap/manpages} \input{chap/manpages}
@ -108,21 +108,22 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
\input{chap/video} \input{chap/video}
\input{chap/graphisme} \input{chap/graphisme}
\input{chap/gnuplot} \input{chap/gnuplot}
\input{chap/print} % \input{chap/print}
\input{chap/webcam} \input{chap/webcam}
% \input{chap/SCSI} % \input{chap/SCSI}
\input{chap/X11} \input{chap/X11}
\input{chap/manpages} % \input{chap/manpages}
\input{chap/Fortran} % \input{chap/Fortran}
\input{chap/GMP} % \input{chap/GMP}
\input{chap/Python} \input{chap/Python}
\input{chap/dino} \input{chap/dino}
\input{chap/C.tex} \input{chap/cd-dvd}
\input{chap/C}
\input{chap/textes} \input{chap/textes}
\input{chap/MINITEL} % \input{chap/MINITEL}
\input{chap/Raspberry} % \input{chap/Raspberry}
\input{chap/Fedora} \input{chap/Fedora}
\input{chap/IPv6} % \input{chap/IPv6}
\input{chap/threads} \input{chap/threads}
\input{chap/IPC} \input{chap/IPC}
\input{chap/dosbox} \input{chap/dosbox}
@ -131,9 +132,10 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
\input{chap/plugins} \input{chap/plugins}
\input{chap/Bonjour} \input{chap/Bonjour}
\input{chap/debug} \input{chap/debug}
\input{chap/buzybox}
\input{chap/gif89a} \input{chap/gif89a}
\input{chap/IRC} \input{chap/IRC}
\input{chap/SCCS} % nouveau 18 mars 2021 % \input{chap/SCCS} % nouveau 18 mars 2021
\input{chap/Usenet} \input{chap/Usenet}
\input{chap/DNS} \input{chap/DNS}
\input{chap/ssh} \input{chap/ssh}
@ -141,8 +143,9 @@ en ligne sur le site du Tetalab. Your mileage may vary\dots
\input{chap/gadgets} \input{chap/gadgets}
% \input{chap/slang} % \input{chap/slang}
\input{chap/curses} \input{chap/curses}
\input{chap/openwrt}
\input{chap/WiFi} \input{chap/WiFi}
\input{chap/GIT} % \input{chap/GIT}
\input{chap/divers} \input{chap/divers}
% \input{chap/peer2peer} % \input{chap/peer2peer}