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

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 -

sintaxis

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

Doxyfile

JAVADOC_AUTOBRIEF = YES

MULTILINE_CPP_IS_BRIEF = YES

paqueteria para desarrollo

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

linker

gdb

directory sin args olvida todas las sources y así fuerza la posterior recarga

print a=50 asigna valor a var a (ademas de pintarla ya con su nuevo valor)

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 ;)

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

db

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;
    

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-elementsy tb puede servir [este ejemplo](http://zvon.org/xxl/XIncludeTutorial/Output/example12.html)

programming

dynload

No hace tanto que anoté cosas sobre esto a partir del contenido de un howto que encontré por ahí, pero ahora no lo encuentro, creo que fue a raíz de hacer fdS7 un módulo cargable, pero no lo encuentro ahí ni en los leeme ni el código de fdS7 (quizá era esto: https://dwheeler.com/program-library/Program-Library-HOWTO/index.html, el original, que tb está aki: https://tldp.org/HOWTO/Program-Library-HOWTO/index.html)

Bien, pues ahora he encontrado tb esto: https://www.akkadia.org/drepper/dsohowto.pdf y esto, que no aporta muxo mas de lo que ya sé, pero sí algunos detalles, como la razón de establecer tb una destructora dentro del módulo: https://tldp.org/HOWTO/pdf/C++-dlopen.pdf

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/