Mas chuletas

Mi desarrollo

revoltillo

find ../ESP8266_RTOS_SDK/ -name '*.c' -exec grep -H whatever '{}' +

rm compile_commands.json; make clean; bear -- make -j

ldconfig

los char no utf8 válidos los convierte vim: :set fileencoding=utf-8 y salvar

man 3 fileno para file descriptor de un FILE *

:%s/.../.../g para sustituir en vi en todo el fixero

La librería que usamos para poder incrustar imágenes svg en cairo pd

markdown

Según la spec:

We can think of a document as a sequence of blocks—structural elements like paragraphs, block quotations, lists, headings, rules, and code blocks. Some blocks (like block quotes and list items) contain other blocks; others (like headings and paragraphs) contain inline content—text, links, emphasized text, images, code spans, and so on.

Akí usamos cmark:

cmark -t xml {file}.md | tail -n +3 | xsltproc --stringparam csspath chuletas.css -o {file}.html cmark-html.xsl -

cheat sheet

sintaxis

... se pueden incluir listas o párrafos dentro de listas, indentando los elementos con cuatro espacios

nvim

:red[o] deshace último undo

:e# volver al fichero anterior

vscode

Doxyfile

INPUT = ....

JAVADOC_AUTOBRIEF = YES

MULTILINE_CPP_IS_BRIEF = YES

Preparación máquinas para desarrollo

paquetería

sudo apt-get install g++ make pkgconf automake autoconf libtool
sudo apt-get install libsqlite3-dev libpq-dev nettle-dev libxml2-dev libmariadb-dev
sudo apt-get install libxslt1-dev libcairomm-1.0 libneon27-dev nlohmann-json3-dev librsvg2-dev fonts-unifont

preparación directorio proyecto:

libtoolize
aclocal
autoconf
automake --add-missing
autoheader
./configure

Meson

From autotools

La extensión vscode que uso dice que se ocupa de configurar intellisensse para que utilice compile_commands.json del dir build de meson.

Flujo de trabajo ( Comandos, meson <comando> --help )

Un port a c99 con pequeñas diferencias.

versiones

En debian el ejecutable se llama muon-meson; a día de hoy, la versión es 0.4.0-1, publicada (la 4.0) hace 15 meses; para usar esa versión casi que: ln -s /bin/muon-meson /usr/local/bin/muon. La 0.5.0 de repositorio git tiene 9 meses. A juzgar por la página de manual, la 0.4.0 está bastante atrasada respecto al estado actual, pero quizá no tanto respecto a la 0.5.0. Para utilizar el repositorio git viene bien el paquete debian, pq con el comando de éste se construye el del repositorio git sin tener que hacer bootstraping (que tampoco parece nada del otro mundo).

La impresión que da es que muon es mas estricto, con menos inconsistencias. Tb es mas rápido, pero eso hay que tomarlo con distancia, pq al final el build quien lo hace es ninja; solo en los pasos de setup y luego install se notará diferencia importante: muon ni siquiera interviene en la compilación.

Diferencias

manejo

linker

gdb

Linux Applications Debugging Techniques

Símbolos de librería ausentes inspeccionando cores

Hay que indicarle el ejecutable mediante: file <path>. Y, no sé por qué, en algunos sistemas gdb no encuentra librerías compartidas en sitios estándar como /usr/local/lib. El resultado es, por ejemplo, que back no te proporciona nombres de funciones. Entonces hay que hacer: sharedlibrary <path>

Programas con mas de una hebra.

Normalmente, gdb avisa cuando se inicia y termina una hebra adicional a la principal. Según el manual, cuando una hebra encuentra un punto de ruptura por defecto se paran todas y cuando se establecen puntos de ruptura también se hace para todas ellas. El comando info threads proporciona lista de las existentes. Siempre hay una activa, que se puede cambiar con thread , en la que se aplican los comandos ejecutados.

fork

set follow-fork-mode child|parent (default: parent)

... pero cuidado pq si es child abandona el parent: los breaks válidos seran los que haya en la ruta del child, si alguno, e igual a la inversa, al menos si no hay algún otro ajuste que afecte a esto, claro ;)

Guardando breakpoints

save breakpoints <filename>

y para restaurarlos:

source <filename>

usando entrada estándar

gdb <programa>
(gdb) r ... < input.txt
o
(gdb) set args ... < input.txt
(gdb) r

db

admin gráfica

omnidb, en debian, prácticamente se limita a permitirte hacer queries y presentarte resultados.

adminer

tb en debian, me gusta mas que omnidb, pq directamente te muestra lista de tablas de la db; hasta le perdono que sea php pq no parece que haya nada mejor en debian que incluya pg

trick: el login se hace directamente a la base de datos, y HAY que marcar la casilla de conex permanente

pg

maria

Para la actividad normal de crear databases de aplicación con su usuario:

  1. Crear la base de datos
    -- Create the database
    CREATE DATABASE app_db;
    
  2. ... el usuario
    -- Create the user 'app_user' with a secure password, allowing connections from any IP address
    CREATE USER 'app_user'@'%' IDENTIFIED BY 'your_secure_password';
    
  3. ... permisos
    -- Grant full privileges to the 'app_user' user on the 'app_db' database
    GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
    
  4. y activar:
    -- Reload the privilege tables to apply changes
    FLUSH PRIVILEGES;
    

De interes

SVG

esto es mejor que inkscape para experimentar

path

M x y Mover puntero a x y sin dibujar

L x y Línea recta a pos absoluta x y

l x y Línea recta a pos relativa x y

H x Línea recta horizontal a x absoluta

h [-]x Línea recta horizontal a x relativa

V y Línea recta horizontal a y absoluta

v [-]y Línea recta vertical a y relativa

z|Z Cierra sub-trayecto actual trazando línea hasta el punto inicial

XML

xinclude

El uso es fácil, xpointer

Se define el fragmento del doc fuente que se incluye en el doc destino mediante xpointer, cuya spec, como todas, resulta complicada de entender, pero con esto es suficiente:

<xi:include href="common.view.xml#view-header"/> ... y el elemento con xml:id = view-header en common.view.xml pasa a ocupar la ubicación del xi:include; tb se puede hacer <xi:include href="common.view.xml" xpointer="xpointer(/view/style)"/>.

El ns de xinclude: http://www.w3.org/2001/XInclude, pero cuidado pq hubo x ahí uno posterior que al final no cuajó y el que vale es éste.

Un ejemplillo aki: (ver su propia respuesta) https://stackoverflow.com/questions/16563106/how-to-use-xpointer-with-xinclude-to-reference-elements y tb puede servir [este ejemplo](http://zvon.org/xxl/XIncludeTutorial/Output/example12.html)

programming

dynload

Tenemos dos casos relativos a dyn loading:

Referencias:

cores

Los parámetros mas útiles de la posible plantilla de nombre de fichero son:

%p: pid %s: signal causante %t: time in seconds from de epoch %e: exex name (no path)

... p.e. en un fichero terminado en .conf y ubicado en /etc/sysctl.d/:

kernel.core_pattern=%e-%t-%s.core

/usr/lib/systemd/systemd-sysctl --prefix kernel.core_pattern

comprobación: sysctl kernel.core_pattern

daemons

njctl envía los procesos a bg y eso funciona pq a partir de cierto momento bash dejó de enviar señal SIGHUP a sus procesos hijos en background cuando él termina, por lo que éstos siguen su curso con init como parent y desligados del terminal al que estaban ligadas sus entrada y salida estándar como descendientes del bash que ejecuta el terminal; solo entonces el proceso queda desligado de ése, su líder de sesión y de su terminal. (man credentials y man setsid)

Para no depender de ese comportamiento de bash, se puede usar el comando setsid, que hace lo que habría que hacer en caso de implementar nosotros la desconexión en el propio programa mediante llamada a setsid(): un fork primero para evitar que falle setsid() por ser líder de un grupo para que sea el hijo (que ya no es lider) quien haga setsid() y se ejecute (podría incluso hacerse un segundo fork en ese hijo para evitar que sea lider de sesión, que es lo que ocurre cuando se llama a setsid() y ésta no falla.

repito: man credentials (primera parte, relativa a grupos y sesiones de procesos y controlling terminal), y man setsid, que es lo que hay que ejecutar.

Hay alguna cosilla mas que hacen en general los daemons, como cerrar 0, 1 y 2 (o quizá duplicando en 2 la salida de log), quizá cambiar el dir de trabajo ... ... de hexo, hay función daemon() en gnu c lib que sintetiza lo mas común y que explica en su man page tb p.e. https://biriukov.dev/docs/fd-pipe-session-terminal/3-process-groups-jobs-and-sessions/

debugeando librerías debian:

cd ~/src
mkdir mariadb
cd mariadb
apt-get source libmariadb3
sudo apt-get install libmariadb3-dbgsym

... y en gdb:

directory ~/src/mariadb/mariadb-11.8.2/
symbol-file /usr/lib/x86_64-linux-gnu/libmariadb.so.3

(no vale solo ~/src/mariadb, no preguntes por qué)

... y con un poco de suerte, s en el lugar adecuado te adentra en el código de librería

Parece que en algún momento, lo conseguí incluso con paquetes que no tienen el -dbg correspondiente (sacado de http://wiki.debian.org/DebugPackage):

 - apt-get source tal (descarga, crea el dir con el paquete y aplica parches debian)
 - en debian/control (ejemplo para libpng):
   Package: libpng12-dbg
   Architecture: any
   Section: debug
   Priority: extra
   Depends: ${shlibs:Depends}, ${misc:Depends}
   Description: PNG library - runtime
    libpng is a library implementing an interface for reading and writing
    PNG (Portable Network Graphics) format files.
    .
    This package contains the debugging symbols for libpng12
 - en debian/rules (ejemplo para linpng):
    añadir override_dh_strip override_dh_installdocs a .PHONY
    definir esos dos targets:
    override_dh_strip:
    	dh_strip --dbg-package=libpng12-dbg
    (CUIDADO: ese override de dh_strip no ha funcionado con libpng, y he tenido que meterle
     la opción en la llamada a dh_strip real, que por otra parte es como viene, p.e., libcairo-2-dbg)
    override_dh_installdocs:
      dh_installdocs --link-doc=libpng12-0
 - construir con debuild -us -uc (deja los paquetes en el dir superior, donde estan los
                                  que se descargaron con apt-get source)

 - INSTALAR tanto el -dbg como el binario normal, solo con el -dbg no funciona