Informatica per script kiddies 8 – Containers, cosa e perché

Oggi Informatica per script kiddies ospita finalmente un articolo di u/Sudneo invece che del solito u/LBreda. Siamo sempre alla ricerca di collaboratori, scrivete pure a LBreda se volete dare una mano! Trovate qui tutti gli articoli della rubrica.

L’argomento di oggi è qualcosa che da un paio di anni a questa parte è sulla bocca di tutti: i containers. C’è chi ne ha sentito parlare riguardo Docker, chi magari ha sentito parlare di Kubernetes, Podman o chissà cos’altro. Tutto si basa però su dei concetti che generali, che tenteremo di trattare in quanto tali.

(altro…)

Informatica per script kiddies 7 – Che succede quando andiamo su un sito

Eccoci di nuovo qui! Trovate qui tutti gli articoli della rubrica.

Oggi, invece, parliamo un po’ di come è fatto il web. Le cose possono ovviamente essere molto più semplici o molto più complesse di come le mostrerò qui, ma cercherò di dare un buon inizio per capire meglio come funzioni tutto l’accrocco, che non è sempre troppo chiaro.

Il web infatti nasce con un’idea molto semplice: dare a ogni risorsa un indirizzo composto dall’indirizzo del computer su cui risiede e dall’indirizzo della risorsa specifica. Digiti l’indirizzo in un browser (o clicchi su un link), e ottieni la risorsa. Le cose si sono però rapidamente fatte più complicate, principalmente perché i volumi di richieste sono diventati rapidamente molto grandi. Ma vediamo un po’ come funziona tutto.

(altro…)

Informatica per script kiddies 6 – Arduino, Raspberry Pi e quelle cose

Eccoci di nuovo la nostra rubrica mensile preferita. Ci siamo spostati sul blog di ItalyInformatica, dove prossimamente metterò in copia gli altri articoli per avere tutto insieme. Trovate qui tutti gli articoli della rubrica.

Oggi parliamo di cose che molti percepiscono come “schede piccole con cui fare cose strane”, e nemmeno a torto, ma che vengono di solito chiamati col nome piú tecnico di “sistemi embeded”.

(altro…)

Informatica per script kiddies 5 – Il contact tracing

Eccoci di nuovo con questa rubrica mensile. Trovate qui tutti gli articoli della rubrica.

Oggi voglio parlare un po’ dei sistemi di contact tracing. Ne parlerò dal punto di vista prettamente tecnico, perché siamo pur sempre su /r/ItalyInformatica (se volete, qualcosina la scrissi a suo tempo su /r/italy).

(altro…)

Informatica per script kiddies 4 – Linux

Di nuovo il terzo mercoledí, ed eccoci qui a parlare di informatica a chi ci si avvicina baldanzosamente. Trovate qui tutti gli articoli della rubrica.

Oggi si parla di Linux. Per chi già ne sa: è un argomento con altissima probabilità di guerra a colpi di lanciafiamme, quindi vi chiedo di fare un bel respiro prima di andare avanti e cercare di fare commenti il piú costruttivi possibile. Non stiamo qui a presentare la lunghezza del nostro stack sistemistico, ma a far capire qualcosa a chi si avvicina a questo mondo.

(altro…)

Informatica e COVID-19

Comprensibilmente, il tema di questi giorni su /r/ItalyInformatica è stato soprattutto il SARS-CoV-2, che sta costringendo tutti noi a casa. Fortunatamente, il virus non impatta direttamente sulle nostre professioni, che si possono spessissimo svolgere da casa senza troppo rischio di ammalarci di COVID, e quindi moltissimi di noi si sono dati da fare nel grande sforzo che si sta facendo per mitigare, e risolvere il prima possibile, questa crisi.

(altro…)

Informatica per script kiddies 3 – Il deep web, il dark web e quelle robe lì

Di nuovo il terzo mercoledì! Trovate qui tutti gli articoli della rubrica.

Ultimamente, complice il periodo particolarmente esposto al complottismo, si sta parlando spesso di dark web, e davvero non mi aspettavo che questo articolo, già programmato, cadesse così a proposito.

Volevo parlare infatti di questa cosa, tanto apparentemente oscura e misteriosa quanto in realtà assai semplice.

(altro…)

Informatica per script kiddies 2 – Le VPN

È il terzo mercoledì del mese, e quindi rieccoci con Informatica per script kiddies. Sì, esce il terzo mercoledì di ogni mese, non temete. Trovate qui tutti gli articoli della rubrica.

Oggi, invece, parliamo di VPN. Trovo sia un argomento utile anche a molte persone non così vicine al mondo informatico, ma che sono costantemente bombardate da pubblicità su questo o quel servizio per la privacy senza che si capisca di cosa si parli.

(altro…)

Informatica per script kiddies 1 – Le rainbow table

Prima di tutto un’introduzione: a parte il titolo colorito, questa rubrica vuole spiegare in poche semplici parole alcuni argomenti su cui i giovani (talvolta neanche troppo) che si avvicinano al mondo dell’informatica hanno le idee un po’ confuse.

L’informatica è un mondo affascinante, ma bisogna coglierne il fascino, come in qualunque disciplina. Spesso ci si innamora di aspetti che non esistono, e si rimane delusi prima di scoprire quelli belli davvero. Spero che queste righe servano a qualcuno per scoprirli prima possibile.

Ma veniamo all’argomento di oggi, le rainbow table.

(altro…)

Libmodule: libreria C per creare progetti modulari

Ciao a tutti! Sono u/nierro. Forse vi ricorderete di quando vi raccontai di un mio progetto proprio qui: https://tldr.italyinformatica.org/2017/05/clight-demone-utente-per-linux/.

Bene, libmodule nasce come “spin-off” di quel progetto: il codice di clight è molto modulare, e ha al suo interno tutta una serie di accorgimenti per gestire questi “moduli”.

Circa un mesetto fa mi resi conto che da un lato per clight questa gestione dei moduli era over-engineered, e dall’altro mi tornava utile in tanti progetti, personali e lavorativi.

Decisi quindi di mettermi al lavoro per creare una libreria come si deve, con lo scopo ultimo che dovesse essere semplice ed elegante.

Nasce così libmodule.

Cos’è libmodule?

È una libreria C, che ad oggi supporta linux, osx e BSD (tornerò su questo punto più in là), per scrivere progetti modulari e standardizzati.

L’approccio è piuttosto simile all’OOP; in particolare mi sono fortemente ispirato ad akka (https://akka.io/) e più in generale all’Actor Model per l’API.

Cos’è un modulo?

Un modulo è, manco a dirlo, l’entità chiave di libmodule; ogni modulo espone determinate callback che verranno usate per gestire il suo ciclo di vita.

Un modulo può inoltre reagire agli eventi, mettendosi in ascolto su dei File Descriptor.

Libmodule offre poi un loop interno che automaticamente ascolta su tutti gli eventi di tutti i moduli chiamando le callback corrette per ciascuno.

Supporta il mio OS?

Libmodule usa, per il suo loop interno, una struttura a compile-time-plugins; dipendentemente dalla piattaforma su cui viene compilato, seleziona il plugin corretto per implementare l’interfaccia di poll.
Ad oggi supporta epoll() su linux, e kqueue() su osx e bsd.

Lo svantaggio è che questi “plugins” dovranno avere una interfaccia simile a epoll.

Questa è una scelta specifica: l’ovvia soluzione portabile sarebbe stata usare poll(); trovo però l’API di kqueue/epoll molto più elegante e flessibile.

Esiste della documentazione?
Ovviamente: una libreria è completamente inutile se non esiste della documentazione.

La si può trovare qui: http://libmodule.readthedocs.io/en/latest/?badge=latest.

Tutto bello..ora però tira fuori il codice!

Mi sembra corretto ricompensare quei pochi coraggiosi giunti fin qui mostrando loro un breve esempio.


#include <module/modules.h>
#include <module/module.h>
#include 

MODULE("Test");

static void module_pre_start(void) {

}

static void init(void) {
     m_add_fd(STDIN_FILENO);
}

static int check(void) {
     return 1;
}

static int evaluate(void) {
     return 1;
}

static void receive (const msg_t *msg; const void *userdata) {
     if (!msg->msg) {
          char c;
          read(msg->fd,&c,sizeof(char));
               if (c=='q'){
               modules_quit();
          }
     }
}

int main () {
     modules_loop();
     return 0;
}

Per compilare, è sufficiente linkare libmodule tramite il linker flag “-lmodule” o usando lo script pkg-config installato.

Questo semplice programma crea un modulo, che si chiamerà “Test”, che ascolta su stdin.

Alla pressione di ‘q’, il programma uscirà.

Ben più utile, al fine di capire come funziona la libreria, è l’output generato (libreria compilata in debug, che la rende verbosa):

./sample.out Libmodule: Initializing libmodule 1.0.0. Libmodule: Creating context ‘default’. Libmodule: Registering module ‘Test’. a b c q Libmodule: Deregistering module ‘Test’. Libmodule: Destroying context ‘default’. Libmodule: Destroying libmodule.

 

Da qui appare ben chiaro lo scopo della macro MODULE(): registra un modulo in libmodule automaticamente all’avvio del programma, proprio come un ctor.

Il modulo viene poi de-registrato automaticamente da un dtor implicito.

Non mi dilungo su cosa sia un context, nella documentazione è ben spiegato.

Dall’esempio si possono evincere le caratteristiche principali di libmodule:

* Modularità (ovviamente)

* Semplicità

* Compattezza

Idealmente, ogni modulo costituisce un sorgente separato annotato dalla macro MODULE (anche se questa regola può essere aggirata utilizzando la “complex API”, che poi non è altro che l’API usata internamente dalla macro); forzando di fatto una standardizzazione del proprio progetto.

Hai citato gli actor, non vedo nulla però…

I moduli possono anche dialogare tra loro con un sistema PubSub: possono quindi inviare un messaggio a un altro modulo, o pubblicarlo su un “topic” che verrà ricevuto da tutti i moduli sottoscritti al suddetto topic.

Last, but not least (aka “la roba pallosa”)

Al momento mi sto concentrando sulla scrittura di unit test prima di rilasciare la prima versione stabile. Si noti che i test sono eseguiti automaticamente tramite travis sia su linux che su osx; inoltre su linux sono anche testati per la ricerca di memleak con valgrind.

L’API è in freeze in attesa della release; non ho comunque in mente alcun api break nel breve periodo.

Qualora per sbaglio dovessi aver stimolato il vostro interesse o la vostra curiosità, vi invito a farvi un giro al repo github: https://github.com/FedeDP/libmodule 🙂