Compare commits
12 Commits
fd3a4b8336
...
078d3d6b3a
Author | SHA1 | Date | |
---|---|---|---|
![]() |
078d3d6b3a | ||
![]() |
97f3cb336d | ||
![]() |
ae2f0d965e | ||
![]() |
0480a7a73f | ||
![]() |
4b438e7f7a | ||
![]() |
98334bd25e | ||
![]() |
f00a06b0c7 | ||
![]() |
f3289fc23c | ||
![]() |
f08879204f | ||
![]() |
717006e34a | ||
![]() |
1541deeff0 | ||
![]() |
48beb52b14 |
@ -7,8 +7,8 @@ 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.
|
||||
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
|
||||
@ -26,13 +26,39 @@ appelée une « trame » DMX).
|
||||
https://ryderdamen.com/blog/enttec-open-dmx-on-linux/
|
||||
|
||||
% -----------------------------------------------------
|
||||
\section{Enttec OpenDMX}
|
||||
\section{Enttec OpenDMX} \index{OpenDMX} \label{OpenDMX}
|
||||
|
||||
D'après le constructeur :
|
||||
\textsl{
|
||||
The OPEN DMX USB is a DMX widget used to output
|
||||
DMX from a computer. Simply connect it using it’s
|
||||
USB 2.0 Type B port and launch your compatible
|
||||
software.
|
||||
The OPEN DMX USB is discovered as a USB Serial
|
||||
Device or virtual COM Port dependent on the FTDI
|
||||
driver installed on your system.
|
||||
The Open DMX USB’s output is processed directly on
|
||||
the computer’s processor.
|
||||
}
|
||||
|
||||
Nous allon voir ce qu'il en est exactement.
|
||||
Après branchement, essayons d'identifier cette interface.
|
||||
|
||||
\begin{verbatim}
|
||||
Bus 001 Device 027: ID 0403:6001
|
||||
Future Technology Devices International, Ltd FT232 Serial (UART) IC
|
||||
\end{verbatim}
|
||||
|
||||
\begin{verbatim}
|
||||
SUBSYSTEM=="tty" ATTRS{idVendor}=="0403"
|
||||
ATTRS{idProduct}=="6001" SYMLINK+="phytotron"
|
||||
\end{verbatim}
|
||||
|
||||
Le tout sur une ligne et dans le fichier
|
||||
\texttt{/etc/udev/rules.d/70-emttec-opendmx.rules}.
|
||||
En général une erreur de syntaxe apparait dans
|
||||
\textit{varlogmessage}.
|
||||
|
||||
look at \texttt{tcsendbreak} !
|
||||
|
||||
% -----------------------------------------------------
|
||||
|
@ -96,7 +96,7 @@ La magie du shebang\index{shebang}
|
||||
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}).
|
||||
(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.
|
||||
|
@ -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}
|
||||
|
@ -196,7 +196,14 @@ Tue Oct 17 08:55:01 CEST 2023
|
||||
tth@redlady:~$
|
||||
\end{verbatim}
|
||||
|
||||
Simple et efficace.
|
||||
Simple et efficace. \textbf{Mais\dots}
|
||||
|
||||
Mais ça ne marche pas à tous les coups comme vous le montre
|
||||
clairement cet exemple. L'utilisation de la fonction
|
||||
\texttt{getenv(3)} est très facilement contournable.
|
||||
|
||||
\lstinputlisting[language=C]{code/C/use_envp.c}
|
||||
|
||||
|
||||
% ==============================================================
|
||||
|
||||
|
@ -20,7 +20,8 @@ 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.
|
||||
qu'une video totalement noire de 17 minutes, que des
|
||||
octets incongrus arrivent depuis l'Arduino.
|
||||
dmesg, lshw, lsusb, lspci\dots
|
||||
|
||||
% -----------------------------------------------------------
|
||||
@ -83,7 +84,8 @@ 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.}
|
||||
@ -98,6 +100,11 @@ périphérique \texttt{/dev/parport}
|
||||
|
||||
Question: comment faire du \textsl{bitbanging} ?
|
||||
|
||||
% -----------------------------------------------------------
|
||||
\section{USB} \index{USB} \label{USB}
|
||||
|
||||
Universal Serial Bus
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
\section{Disques durs}
|
||||
@ -158,8 +165,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}
|
||||
@ -167,6 +174,26 @@ 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}
|
||||
@ -195,7 +222,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
|
||||
|
||||
@ -225,8 +252,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
|
||||
|
||||
@ -241,7 +267,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...
|
||||
|
||||
|
||||
% -----------------------------------------------------------
|
||||
|
||||
|
||||
|
@ -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%
|
||||
@ -190,6 +192,10 @@ 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}
|
||||
@ -311,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.} ?
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
|
@ -37,7 +37,7 @@ 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/Canon600D/2022-12$ gphoto2 --auto-detect
|
||||
tth@redlady:~/Photos$ gphoto2 --auto-detect
|
||||
Model Port
|
||||
----------------------------------------------------------
|
||||
Canon EOS 600D usb:002,005
|
||||
|
@ -12,6 +12,8 @@ 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 connective USB\index{USB} demande peut-être
|
||||
un chapitre à part entière.
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
|
@ -39,24 +39,47 @@ 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, 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 l'utilisation d'outils
|
||||
extérieurs\footnote{Grep, Sed, Awk, BwBasic...}
|
||||
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 \textsc{shebang}} \index{shebang}
|
||||
\subsection{Le shebang} \index{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', coupant en français. C'est
|
||||
Le 'she' est l'abréviation de 'sharp', qui veut dire 'coupant' en français.
|
||||
C'est
|
||||
probablement une allusion aux cotés tranchants du \texttt{\#}.
|
||||
Quand au 'bang', c'est le point d'exclamation après l'explosion
|
||||
de la forkbomb.
|
||||
@ -67,6 +90,26 @@ octets. Si les deux premiers sont \textsl{0x23 0x21}, le reste
|
||||
de la première ligne sera interprété pour lancer un autre exécutable,
|
||||
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 "%d" 85 >> foo.sh
|
||||
tth@redlady:~$ chmod u+x ./foo.sh
|
||||
tth@redlady:~$ ./foo.sh
|
||||
55
|
||||
tth@redlady:~$ cat foo.sh
|
||||
#!/bin/bash
|
||||
printf "%x\n" 85
|
||||
tth@redlady:~$
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
% ==============================================================
|
||||
\section{Le pipeline}\index{pipeline}\label{pipeline}
|
||||
|
||||
@ -96,6 +139,8 @@ $
|
||||
|
||||
\section{Structures de contrôle}
|
||||
|
||||
Les plus importantes sont là : le choix, la boucle, l'attente.
|
||||
|
||||
% --------------------------------------------------------------
|
||||
|
||||
\subsection {Les tests}
|
||||
|
@ -62,7 +62,6 @@ Il existe bien une alternative, mais je n'ai pas encore essayé~:
|
||||
\# 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
|
||||
@ -149,8 +148,6 @@ OMFG! Il manque le son.
|
||||
% mais où ai-je bien pu trouver ça ?
|
||||
%
|
||||
|
||||
|
||||
|
||||
\begin{verbatim}
|
||||
read -p "*** Press Enter to start recording ***"
|
||||
"$FFMPEGBIN" \
|
||||
@ -224,11 +221,11 @@ 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 vari‐
|
||||
ety of sources other than disk files. Depending on platform, a variety
|
||||
of different video and audio output methods are supported.
|
||||
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
|
||||
|
1
code/C/.gitignore
vendored
1
code/C/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
fgets-simple
|
||||
demo-strtok
|
||||
packtest
|
||||
use_envp
|
||||
|
@ -2,7 +2,7 @@
|
||||
# exemples pour le chapitre sur le C
|
||||
# new Sat Feb 11 12:06:34 CET 2023
|
||||
|
||||
all: no-op slowprint fgets-simple packtest
|
||||
all: no-op slowprint fgets-simple packtest use_envp
|
||||
|
||||
no-op: no-op.c Makefile
|
||||
gcc -Wall $< -o $@
|
||||
@ -19,3 +19,8 @@ demo-strtok: demo-strtok.c Makefile
|
||||
# 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 $@
|
||||
|
||||
|
16
code/C/use_envp.c
Normal file
16
code/C/use_envp.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* using envp for fun and profit */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
char *cptr;
|
||||
int idx = 0;
|
||||
cptr = envp[idx];
|
||||
while ( NULL != (cptr=envp[idx]) ) {
|
||||
fprintf(stderr, "envp[%d] %p --> %s\n",
|
||||
idx, cptr, cptr);
|
||||
idx++;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -127,7 +127,7 @@ Your mileage may vary, film at 11\dots
|
||||
\input{chap/video}
|
||||
\input{chap/graphisme}
|
||||
\input{chap/gnuplot}
|
||||
% \input{chap/print}
|
||||
\input{chap/print}
|
||||
\input{chap/webcam}
|
||||
% \input{chap/SCSI}
|
||||
\input{chap/X11}
|
||||
@ -147,7 +147,7 @@ Your mileage may vary, film at 11\dots
|
||||
% \input{chap/MINITEL}
|
||||
% \input{chap/Raspberry}
|
||||
% \input{chap/Fedora}
|
||||
% \input{chap/IPv6}
|
||||
\input{chap/IPv6}
|
||||
\input{chap/threads}
|
||||
\input{chap/IPC}
|
||||
\input{chap/dosbox}
|
||||
@ -174,7 +174,7 @@ Your mileage may vary, film at 11\dots
|
||||
\input{chap/curses}
|
||||
% \input{chap/openwrt}
|
||||
\input{chap/WiFi}
|
||||
% \input{chap/GIT}
|
||||
\input{chap/GIT}
|
||||
\input{chap/divers}
|
||||
% \input{chap/peer2peer}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user