1
1

Era la mia app preferita per reddit, con la versione lemmy (anche se ancora incompleta) mi sembra di essere finalmente tornato a casa noncelafacciotroppiricordi.gif

2
1
submitted 1 year ago by iam0day@feddit.it to c/caffeitalia@feddit.it
3
1
submitted 1 year ago by Saturn_V@lemm.ee to c/caffeitalia@feddit.it

Cioè, ok ci sono le istanze, ma devo creare un profilo per ogni istanza per postare?

4
1

Ciao a tutti! La discussione dell'altro giorno riguardo a Bot per Lemmy mi ha invogliato a perder un po' di tempo libero e buttare giù un semplicissimo script in Rust che crea un nuovo post quando viene invocato, seguendo i dati in un file di configurazione.

Anche se si tratta, fondamentalmente, di qualcosa d'incredibilmente semplice l'ho creato in modo da dar esempi pratici a molti degli argomenti che spesso, chi inizia Rust, ha difficoltà a trovare in un insieme coerente.

Per esser chiari questa non è - volutamente - la più efficiente o idiomatica versione del codice per eseguire il compito, ma ho cercato di mantenerla semplice da capire e tendenzialmente idiomatica, evitando tutte quelle forme che potrebbero intimidire o confondere, anche se migliori.

E, soprattutto, questo non è un tutorial. Vuole solo dare una prospettiva ampia.

Dentro ci sono esempi di:

  • Option
  • match
  • Del crate reqwest, usato per inviare una richiesta POST.
  • Come leggere un file di configurazione con toml e serde.
  • Il random in Rust, che non è integrato direttamente nella Standard Library ma per cui bisogna usare il crate rand (o similari).
  • Come ottenere e formattare una data con il crate time. Normalmente ho sempre usato chrono, quindi questa è stata un'esperienza nuova anche per me! haha
  • Diversi modi per interpolare le stringhe.
  • Come attivare per un crate delle feature non default nel proprio cargo.toml
  • panic! AKA Come far crashare il proprio programma! ...volutamente!
  • expect non è il male! Ha il suo posto anche all'interno di programmi più solidi e non solo per veloce prototipi.

Ora non voglio venderlo per più di quello che è, ma credo sia una buona base di partenza per qualcuno che è interessato a Rust ma non lo ha mai visto con esempi reali, semplici e non mono argomento. Ho aggiunto anche diversi commenti che spero possano aiutare a comprenderne il flusso.

Quindi, per finire, funziona? Sì! È solido e resiliente? Nope. È una buona base per far qualcosa di meglio se volessi imparare e giocare un po' con Rust? Credo di sì.

Se volete provarlo e fare dei test, il metodo migliore è usare le istanze di test ufficiali di Lemmy:

Oppure la palestra qui su feddit.it (credo?)

Una buona alternativa sono anche i servizi come https://httpbun.org/ o https://httpbin.org/ (down al momento dei miei test).

FAQ

Perché non su github?

Al momento non ho un account che posso usare per queste cose, mi dispiace!

Ma basta che copio i file?

Beh, sì, ma sarebbe il caso di creare un nuovo progetto con cargo new --bin simplecofeebot e sovrascrivere/modificare i file.

Cosa succede se faccio cargo run?

Che invii una richiesta errata a feddit.it, perché non c'è alcun token jwt nel file di configurazione. Nel caso in cui tu inserisca un token jwt allora - se non modifichi nulla - dovrebbe inviare una nuova discussione nella comunità del Caffé, chiamata "Caffè Italia DD/MM/AAAA" con la data del giorno d'invio, ed un messaggio fra quelli nella body_pool. Quindi meglio non farlo, o si finisce per spammare il caffé. :D

Perché nel Caffè invece di Informatica?!

Leggendo le regole della comunità !informatica@feddit.it mi sembra di capire sia solo incentrata sulle notizie!

Puoi compilarlo per me?

Nope. Non consiglio di usarlo seriamente così come è.

Questo codice è un macello!

Grazie, mi sono impegnato! Se hai notato bug, typo o cose insensate per favore commenta qui sotto!

Licenza???

MIT o Apache 2!


Cargo.toml

[package]
name = "simplecofeebot"
version = "0.1.0"
edition = "2021"
publish = false
license = "MIT OR Apache-2.0"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
toml = "0.7.6"
reqwest = { version = "0.11.18", features = ["blocking", "json"] }
time = { version = "0.3.23", features = ["std", "local-offset", "formatting"] }
serde = { version = "1.0.174", features = ["derive"] }
serde_json = "1.0.103"
rand = "0.8.5"

/simplecofeebot.toml

[instance]
url = "https://feddit.it"
# curl --get -d "name=caffeitalia" https://feddit.it/api/v3/community
community_id = 11869

[authentication]
# curl --header "Content-Type: application/json" --request POST --data '{"username_or_email":"UsernameFigo","password":"PasswordComplicata"}' https://feddit.it/api/v3/user/login
session_token = ""

[text]
body_pool = [
    "Salve!",
    "Che piacere vederla, commendatore, il solito?",
    "Un bel caffettino?",
]
# title_pool = ["hmhm", "oh no"]

src/main.rs

// In poche parole questi sono gli import.
use std::{fs::File, io::Read, path::Path};

use rand::{rngs::ThreadRng, Rng};
use serde::Deserialize;
use serde_json::json;
use time::{format_description, OffsetDateTime};

// Creiamo una serie di Struct per contenere i vari
// dati presenti nel file di configurazione.
// derive è una macro procedurale che
// genererà per noi determinate parti di codice.
// Deserialize è fondamentale e proviene dal crate
// serde, su cui toml fa affidamento.
#[derive(Debug, Deserialize)]
struct Config {
    instance: InstanceConfig,
    authentication: AuthenticationConfig,
    text: TextConfig,
}

#[derive(Debug, Deserialize)]
struct InstanceConfig {
    url: String,
    community_id: i32,
}

#[derive(Debug, Deserialize)]
struct AuthenticationConfig {
    session_token: String,
}

#[derive(Debug, Deserialize)]
struct TextConfig {
    // Perché un Option? Perché la pool di titoli nel file
    // di configurazione può esserci o non esserci, è, per
    // l'appunto, opzionale.
    // Potremo facilmente controllare che il valore sia presente
    // in base al suo tipo:
    //   Some(Vec<String>) - un vettore contenente stringhe
    //   None - un'Option vuota
    title_pool: Option<Vec<String>>,
    body_pool: Option<Vec<String>>,
}

fn main() {
    // Specifica la posizione ed il nome del file di configurazione.
    let path = Path::new("./simplecofeebot.toml");
    // Apri il file di configurazione e controlla che l'operazione non dia errore.
    let (config, title, body): (Config, String, String) = match File::open(path) {
        // Il file è stato aperto con successo, quindi usiamo un pattern
        // per estrarre il contenuto del nostro tipo Result<File, Error>.
        Ok(mut file) => {
            // Creiamo una nuova Stringa che verrà utilizzata come buffer per il contenuto
            // del nostro file di configurazione.
            // Deve esser mut perché dobbiamo modificarla.
            let mut doc = String::new();
            // Ed ora tentiamo di trasportare il contenuto del file dentro la stringa di buffer!
            match file.read_to_string(&mut doc) {
                // Non siamo interessati a quello che read_to_string ritorna dentro l'Ok()
                // quindi usiamo _ per indicare che non serve una variabile dove inserirlo.
                Ok(_) => {
                    // Usiamo il crate Rand per creare un generatore di numeri casuali locale.
                    let mut rng = rand::thread_rng();
                    // Finalmente usiamo il crate toml per analizzare il file di configurazione.
                    let config: Config = match toml::from_str(doc.as_str()) {
                        // Il match può ritornare un valore al suo completamento, quindi,
                        // nel caso sia andato tutto bene, ritorniamo il valore contenuto
                        // all'interno del nostro Ok.
                        Ok(s) => s,
                        Err(err) => {
                            // Oh no!
                            // Qualcosa è andato storto e non ci è possibile recuperare
                            // da questo errore. Ci tocca chiudere il programma con un bel
                            // e salutare crash. Cerchiamo almeno di spiegare il perché...
                            panic!(
                                "Errore! Impossibile analizzare il file di configurazione!\n{}",
                                err
                            );
                        }
                    };
                    // Per rendere il titolo un po' meno monotono aggiungiamo un suffisso
                    // estratto a caso fra le stringhe date nell'apposito spazio nel file di
                    // configurazione.
                    // Useremo una funzione chiamata pick_random, definita poco sotto!
                    let title_suffix = config
                        .text
                        .title_pool
                        .as_ref()
                        .map_or(String::new(), |v| pick_random(&mut rng, v));

                    let body_default = "Salve!".to_owned();

                    let mut body = config
                        .text
                        .body_pool
                        .as_ref()
                        .map_or(body_default.clone(), |v| pick_random(&mut rng, v));

                    // Abbiamo fatto in modo che, in caso il nostro utente non
                    // abbia definito body_pool nella configurazione, allora vi sia
                    // la String "Salve!" come body, ma cosa succede nel caso in cui
                    // il nostro utente abbia passato [""] o []?
                    // Dato che abbiamo preso una decisione esecutiva d'avere come
                    // default "Salve!", allora è il caso d'aggiungere
                    // un altro controllo...
                    if body.is_empty() {
                        body = body_default;
                    }

                    // Rimandiamo indietro una bella Tupla d'elementi.. questo
                    // puzza solo a me?
                    // Se si fa affidamento su un dato strutturato, per muoverlo
                    // in giro, forse sarebbe il caso di creare direttamente una
                    // nuova Struct ed esser sicuri di quel che passiamo!
                    (config, generate_title(title_suffix), body)
                }
                Err(err) => {
                    // Hmm.. probabilmente il file non era codificato in UTF-8! Oh no! Anche qui...
                    // niente configurazione, niente funzionalità!
                    panic!(
                        "Errore! Sei sicuro che il file di configurazione sia in UTF-8 valido?\n{}",
                        err
                    );
                }
            }
        }
        // C'è stato un errore durante l'apertura del file!
        Err(err) => {
            // Niente file di configurazione significa che non abbiamo accesso al token JWT..
            // Anche se avessimo dei default per gli altri elementi non è possibile andare oltre,
            // l'unica via è un bel crash!
            panic!(
                "Errore! Impossibile aprire il file in \"{}\":\n{}",
                path.display(),
                err
            )
        }
    };

    // Ora che abbiamo il nostro titolo ed il nostro corpo del messaggio
    // è arrivato il momento di postarli! Ma come fare?
    // A piccoli passi!
    // Sarebbe opportuno controllare che l'url dell'istanza sia
    // almeno formalmente corretto.
    // Perché non fare tutti i controlli subito appena analizzato
    // il file di configurazione, così da non sprecare
    // tempo e computazioni? È un ottima domanda!
    // E la strategia giusta sarebbe di spostare tutto ciò che
    // riguarda la configurazione in un suo modulo a parte,
    // far tutte le validazioni del caso, e solo dopo procedere!
    // ...ma qui siamo bonari, ci fidiamo del nostro utente!
    // Saltiamo direttamente ad usare un nuovo crate per
    // inviare richieste: reqwest!
    let client = reqwest::blocking::Client::new();
    // Cosa succede se, per caso, l'url dell'istanza è malformato, pieno
    // di spazi bianchi o con un bel / alla fine..? E se non inizia con
    // il protocollo?
    let api_endpoint = format!("{}/api/v3/post", config.instance.url);
    // Questi son un sacco di dati da prendere e di cui fidarsi così, senza
    // pensarci..
    // Però siamo avventurosi! Creiamo direttamente il json sulla fiducia.
    // Per farlo utilizziamo una macro che proviene da serde_json.
    // Esistono molte altre vie, ma questa è quella più semplice da
    // gestire in modo sano, se dovessimo mai decidere d'implementare
    // altre casistiche.
    let req = json!({
        "auth": config.authentication.session_token,
        "name": title,
        "community_id": config.instance.community_id,
        "body": body,
    });
    // Ed ora proviamo ad inviare la richiesta!
    match client.post(api_endpoint).json(&req).send() {
        Ok(response) => {
            // Sembra esser tutto riuscito! Mettiamo un bel messaggino con
            // un sacco d'informazioni inutili nella console, giusto per
            // dar un po' di fastidio al nostro amato utente!
            // In più con un unwrap messo così c'è sempre la possibilità
            // d'avere un divertente crash al momento meno opportuno!
            println!("La discussione con il titolo \"{title}\" è stata inviata correttamente.\nRisposta: {}", response.text().unwrap())
            // Ma un momento... Se l'url era sbagliato e abbiam ricevuto
            // indietro un 404, 503 o qualche altro problema che ha impedito al
            // post d'esser ricevuto? Al momento il nostro script direbbe
            // sempre che tutto è andato bene! Ooooops!
            // Forse potremmo controllare response.status() e fare un bel match...
        }
        Err(err) => eprint!(
            "Errore! Non è stato possibile inviare la discussione!\n{}\n",
            err
        ),
    }
}

fn pick_random(trng: &mut ThreadRng, trg: &Vec<String>) -> String {
    // hmm.. cosa succede se viene passato un vettore vuoto...?
    // Meglio controllare! E in Rust anche l'if può direttamente
    // ritornare un valore.
    if trg.is_empty() {
        // È un po' triste e non esattamente il massimo.. Ma una stringa
        // vuota è pur sempre un'opzione!
        // Notare come trasformiamo "" da una &'static str in una String usando
        // to_owned().
        "".to_owned()
    } else {
        // Invece se c'è almeno un elemento allora procediamo all'estrazione!
        // Notare come len() ritorni la lunghezza del vettore, quindi
        // [0, 1, 2] ha una len() di 3, però l'ultimo elemento ha un'id
        // di 2!
        // Un'altra ottimizzazione possibile sarebbe nel caso avessimo
        // un solo elemento... ma.. Ne vale la pena?
        trg.get(trng.gen_range(0..=(trg.len() - 1)))
            .unwrap()
            .to_owned()
    }
}

fn generate_title(suffix: String) -> String {
    // Creiamo un descrittore per il formato della data da inserire nel titolo.
    // Nel caso ci sia qualche errore crashamo direttamente usando expect,
    // perché siamo bravi mettiamo anche un messaggio che cerca di spiegare il
    // motivo più probabile per il nostro crash.. Potrebbe esser utile in futuro, se
    // qualcuno decidesse di render il descrittore configurabile!
    let date_format = format_description::parse("[day]/[month]/[year]").expect(
        "La stringa che stai cercando di usare per formattare la data non sembra corretta!",
    );
    // Cerchiamo d'ottenere la datetime della macchina locale...
    let date = match OffsetDateTime::now_local() {
        Ok(datetime) => datetime.date(),
        Err(_) => {
            // Impossibile ottenere la data locale, con tristezza usiamo quella UTC.
            // Potrebbe capitare che il giorno sia diverso, per colpa dei fusi orari..
            eprintln!("Errore! Impossibile ottenere la data locale: verrà usata quella UTC.");
            OffsetDateTime::now_utc().date()
        }
    }
    .format(&date_format)
    .expect("Non siamo riusciti a formattare la data..?");

    format!("Caffè Italia {} {}", date, suffix)
        .trim()
        .to_owned()
}


Alcune possibili migliorie semplici ed interessanti potrebbero esser:

  • Una gestione migliore degli errori, usando l'operatore '?', ed il crate anyhow.
  • Potremmo anche creare degli errori migliori con thiserror!
  • Abbiamo già il crate time.. Perché non aggiungere dei timestamp ai messaggi nella console?
  • Creare diversi moduli per gestire in modo più generale e specifico (Ah! Sembra un ossimoro ma non lo è!) le varie funzioni!
  • Dopo aver creato la discussione, se ha accesso ai poteri da mod, pinnarla!
  • Magari sanitizzare un po' le stringe provenienti dal file config? Anche solo un trim sarebbe un bel passo avanti! Anche quando l'utente è fidato cercare di coprire gli errori più comuni è sempre una buona idea!
  • Cosa succede se il session_token è scaduto..? Magari si potrebbe direttamente fare il login?
  • Magari trasformarlo per, oltre al file di configurazione, accettare anche dei parametri da linea di comando, usando un crate come Clap!
  • Attualmente lo script posta quando è invocato.. Magari potremmo creare un loop e una configurazione per postare a determinate date/orari? Certo, un cron job quando disponibile è sempre la scelta migliore.. Ma se proprio ci si sta annoiando...!
5
1

È venuto un volontario di un'associazione. Hanno già un sito, ma quest'anno gli hanno imposto un rinnovo a quattro zeri. Leggo il preventivo e vedo un vps dedicato, sito fatto apposta con djangocms, email con tanto di exchange per ogni singolo volontario ecc ecc.

Mi dice che è disperato, fino all'anno scorso gli chiedevano un rinnovo simbolico, ma quest'anno gli impongono questo redesign che assolutamente non possono permettersi e che comunque da Google analytics vedono che gli accessi si contano sulle dita di una mano, anche se il tizio dell'altra web agency gli giura che no, in realtà ha 100x più accessi, è che nessuno clicca su accetta cookie, però questo tutto sulla fiducia, senza mostrare nulla, fosse vero mostragli una pagina generata dall'analisi dei log server con awstats come si faceva nel 1999.

Insomma mi dice che vuole semplicemente fare un sito con scritto chi siamo, contatti, indirizzo, seguici sui social. Per email, semplice redirect della casella info perché se no tutti si dimenticano la password e non la guardano mai. Caselle personali sono inutili e non le vogliono

Gli faccio vedere una pagina demo fatta con mobirise e mi dice perfetto così. Gli spiego che però non è un sistema che prevede modifiche, login o upload. Dice perfetto così non ci dobbiamo preoccupare di password, noi non vogliamo mai fare alcuna modifica tanto scriviamo solo sulla pagina Facebook

A questo punto quoto un quarto d'ora di lavoro a 200 euro l'ora arrotondato all'ora più vicina e mi dice perfetto cominciamo subito contatta la web agency attuale per il trasferimento

Li chiamo e mi pare abbastanza stizzito "ah queste richieste me le devono fare per raccomandata entro 30 giorni dalla scadenza al telefono non faccio nulla", come se gli avessi rubato la gallina d'oro

Allora mi sono chiesto: ma sono io ad aver chiesto troppo poco oppure sono loro ad aver sbagliato ad aver fatto un preventivo da "matrimonio con otto portate in ristorante tre stelle Michelin" quando il cliente si accontenta anche solo di un kebab?

Se gli va bene una pagina statica fatta in 5 minuti con mobirise e poi lo metto su Tophost a 6 euro l'anno, a me sembra di aver chiesto anche troppi soldi

6
1
submitted 1 year ago* (last edited 1 year ago) by banana_meccanica@feddit.it to c/caffeitalia@feddit.it

Domanda per chi si è imbarcato in questa impresa. Quale è stato il periodo piú lungo che avete dovuto attendere? In particolare con priorità bassa. Chiedo perchè sono rimasto di stucco ricevendo nel ultimo mese (con impegnativa) più volte la porta in faccia sentendomi dire che è impossibile prendere una data, che è tutto occupato per i prossimi 90 giorni, che dovrei telefonare tutti i giorni per avere un posto (???). Mi demoralizza molto questo modo di gestire le cose casualmente.

7
1
submitted 1 year ago* (last edited 1 year ago) by mayoaddict@pawb.social to c/caffeitalia@feddit.it

Title, per svariate motivazioni (mercato del lavoro migliore/bilancio stipendio-costo della vita migliore, cosa confermata da vari connazionali che ho conosciuto a Parigi), vorrei trasferirmi in Francia per lavoro, la prima barriera da superare è quella linguistica: siete a conoscenza di corsi validi (possibilmente online, dato che per lavoro sto in un paesello sperduto in cima al niente) che mi permettano di raggiungere almeno il livello B1?

8
1

Un'interessante video sulle origini della nostra nazione. Guardatelo e fatemi sapere cosa ne pensate!

9
1

Lo so, sono stati fatti enormi passi avanti da parte di feddit da quando c'è stata la faccenda sulle app di terze parti e le chiamate API, la comunità si è allargata tantissimo ma io ancora non riesco a godermi questo posto quanto prima mi godevo reddit su infinity.

10
1

Hola! Programmi per la domenica?

E cosa ne direste di fare aprire automaticamente il post del Caffe da un bot e di pinnarlo in alto?

11
1
Avete visto Barbie? (media.tag24.de)
submitted 1 year ago* (last edited 1 year ago) by Casiraghi@feddit.it to c/caffeitalia@feddit.it

Mi aspettavo un film divertente con qualche trovata brillante e tanti richiamini nostalgici agli anni 90, e quello era. La storia è anche carina, gli sviluppi "politici" sono molto banali.

Insomma, a me è piaciuto.

12
1

DiGiotto DiGiotto DiGiotto

DiGiotto DiGiotto DiGiotto DiGiotto DiGiotto DiGiotto

13
1
14
1
submitted 1 year ago by amoroso@lemmy.ml to c/caffeitalia@feddit.it

Se passate in un bar nel pomeriggio o verso fine giornata noterete che in genere sono avanzati dei croissant integrali al miele, con marmellata ai frutti di bosco, o di altri tipi ma sepolti dallo zucchero a velo.

Questo non sorprende perché probabilmente sono i tipi di croissant meno richiesti dai clienti. Quello che sorprende è che ne avanzino così tanti.

Questa situazione viene notata dai gestori dei bar? Perché non provano a ordinare qualche pezzo in più dei croissant più richiesti, per esempio quelli alla crema o alla marmellata di albicocche, e qualche pezzo in meno di quelli meno richiesti?

Avete qualche ipotesi o esperienza diretta, specialmente se lavorate in un bar o nella ristorazione?

15
1
16
1

Oggi alle 14:30 sul centrale contro Djokovic, sapevatelo.

17
1

Ho appena assaggiato una cosa ed è immediatamente nuova droga.

Non vorrei spoilerare, vorrei usarla come post di esordio di

/c/aldivslidl

Che ne dite, la creiamo?

18
1

Da secoli ho sempre richiesto un taglio "normale", cioè corto ai lati e dietro, e leggermente più lungo sopra. Però è veramente noioso lol, le donne hanno molte più possibilità per farsi belle, da quel punto di vista.

Io ho i capelli boccolosi che fanno il cespuglio se lasciati crescere (quindi poco estetico e soprattutto molto caldo), e al momento ho una treccina da 25cm stile padawan dietro l'orecchio sinistro.

Idee? Consigli? Cose strane da provare?

19
1
submitted 1 year ago* (last edited 1 year ago) by Sulex@lemmy.world to c/caffeitalia@feddit.it

Blip-Blop I'm not a bot,ecco il suo caffè all'ananas

20
1

La legge è passata nonostante la mozione contraria, sostenuta da destre e popolari europei.

21
1

La Banca Centrale Europea ha annunciato un sondaggio per scegliere il tema con cui saranno ridisegnate le banconote in euro.

Qui trovate il link al sondaggio. No, non possiamo avere delle banconote con sopra dei peni.

22
1

Buongiorno! Oggi giro di boa della settimana, sarà difficile per voi o la produttività ormai è stata completamente sciolta dal sole estivo?

23
1
submitted 1 year ago* (last edited 1 year ago) by Mannivu@feddit.it to c/caffeitalia@feddit.it

Pochi minuti fa su Instagram mi è arrivata questa notifica in cui si pubblicizza la possibilità di comprare la verifica del profilo. Cosa potrà mai andare male?

EDIT: per curiosità ho cliccato per vedere il prezzo. 16,99€ al mese. Follia!

24
1
submitted 1 year ago* (last edited 1 year ago) by skariko@feddit.it to c/caffeitalia@feddit.it

Trascrivo una bella opinione da parte di Massimiliano Loizzi (sicuramente l'avrete visto come attore in molti video de Il Terzo Segreto di Satira) sullo stato della satira in Italia. È un argomento a cui tengo molto, mi piacerebbe anche creare una comunità /c/satira ma temo non ci sia molto seguito (oltre al quasi inesistente materiale italiano negli ultimi 10-15 anni).

Comunque non ho trovato una comunità più affine (forse !culture@feddit.it? Ma secondo me non andava troppo bene) quindi lascio qui :)

Articolo originale su Fanpage

L’eredità di Berlusconi: come è cambiata la satira negli ultimi trent’anni

È vero che non si può più ridere di niente? Ed è vero che la satira è morta? Eppure la stand-up comedy e i social dimostrerebbero il contrario. Ma allora Berlusconi come ha fatto a cambiare (anche) tutto questo?

Non vi è dubbio: ridere ha un importante significato etico. E la satira ne è, forse (qui il dubbio lecitamente si insinua ma solo per il timore di risultare dogmatico), l’espressione più alta se non necessaria. Persino la Corte di Cassazione lo ha affermato, fornendo una definizione giuridica di satira: “È quella manifestazione di pensiero talora di altissimo livello che nei tempi si è addossata il compito di ‘castigare ridendo mores’, ovvero di indicare alla pubblica opinione aspetti criticabili o esecrabili di persone, al fine di ottenere, mediante il riso suscitato, un esito finale di carattere etico, correttivo cioè verso il bene”. E allora come mai la satira in ogni sua forma sembra essere scomparsa dalle varie forme di trasmissione culturale generaliste?

Forse l’eredità più grande di Berlusconi, è proprio quella di aver modificato letteralmente il paese, di averlo plasmato in quarant’anni di dominio pubblico, politico e privato a sua immagine e somiglianza, perché in definitiva – che lo si voglia o no, che sia vero o meno – siamo tutte e tutti figli di Colpo Grosso e Drive in. La polarizzazione, l’estremizzazione del confronto, la demonizzazione dell’avversario, la versione italiana del self-made man, la televisione come la vediamo oggi, la spettacolarizzazione di qualunque cosa finanche della vita privata, fino ad arrivare a quel che sembra meno ovvio ovvero i social, i Reel, la mini tv di Instagram con il suo zapping-scrolling compulsivo e ossessivo, la fomentazione dell’io, del personalismo, dell’individualismo, della ribellione agli schemi solo per fottere gli altri e non per produrre benessere comune, sono tutte vittorie del Cavaliere. Senza ombra di dubbio. O quantomeno sono parte di un percorso avviato da lui, dalle sue televisioni, dai suoi soci-fratelli-collaboratori-massoni, un percorso simile in ogni suo aspetto al Progetto Rinascita della P2. E di conseguenza è ovvio che abbia cambiato anche la satira o perlomeno l’idea che ne abbiamo.

Con l’editto Bulgaro Berlusconi ha fatto fuori dalla televisione in toto, ogni anima contrastante, ogni voce dissidente, ogni volto che proponesse una riflessione attraverso la risata, inondando però negli ultimi vent’anni la televisione di comicità, onnipresente e opprimente a tal punto fin quasi poi a sparire del tutto. Un po' perché l’assenza di qualità e di una risata alternativa a quella popolare e populista, ha fatto sì che la qualità si abbassasse notevolmente – probabilmente l’ultima grande trasmissione comico satirica è stata L’Ottavo nano del 2001 con Guzzanti (Corrado e Sabina) in stato di grazia e poi lentamente più nulla – e un po’ perché l’avvento dei social ha decisamente cambiato le carte in tavola.

Per i nativi digitali e per la generazione zeta la fruizione dei contenuti deve essere necessariamente istantanea, veloce come un click, più immediata e veloce e – attenzione – non vi è giudizio in questo ma è solo una constatazione di come i tempi siano cambiati e quindi anche la comicità e la satira. Per passare da Instagram a Youtube basta un click, e anche qui la situazione è pressoché la stessa: ci sono centinaia di canali comici che propongono più o meno nello stesso modo (chi più, chi meglio) una certa satira di costume che mette in scena i vari stereotipi dell’italiano medio, passando per le centinai di loro epigoni, di content creator che con il trend del giorno propongono tutti la medesima, identica scenetta priva di alcun contenuto, seppure poi ironicamente è proprio la parola contenuto a identificare quello che fanno e postano.

Ma la satira? Dov’è finita? Quella feroce de “il Male” o di “Cuore” o de “Il caso Scafroglia”, di “Su la testa”? Molte e molti dicono che la cosiddetta dittatura del politicamente corretto, impedirebbe di esprimersi liberamente e che ormai non si può più scherzare, ridere o far satira su niente. Ma non è vero. Certamente un tipo di satira è stata bandita dalle televisioni proprio a causa di quell’editto di ventidue ani fa ma seppure poi i governi siano cambiati, i vertici Rai anche e la parabola di Berlusconi sia stata un lento declino, nessuno si è premurato di creare uno spazio per la satira, anche se avrebbe potuto.

Eppure essa c’è. E si nasconde subdola tra i meandri dell’internet o della scena della stand-up (astro nascente della nuova comicità) o nel teatro, quantunque nessuno si sia mai veramente preoccupato del teatro, riserva indiana di esseri umani che continuano, nonostante tutto, a coltivare l’ambizione di partecipare a una forma d’arte dal vivo, per persone vive, fra persone vive che interagiscono fra di loro, nel solco di un’antica idea di comunità ormai superata e declassata dalla community. Chi dice che non si può dire più nulla e che siamo tutti schiavi della dittatura del politicamente corretto, evidentemente non ha mai assistito ad uno spettacolo di stand-up in qualche affollatissimo live club o teatro o birreria, dove effettivamente la libertà di pensiero e di espressione è messa alla prova in maniera inequivocabile.

Nei social, abbiamo assistito ad un ritorno della satira, ma sotto una veste diversa. E attraverso l’internet e la sua paradossale libertà, la satira sembrava essere tornata libera – appunto – di esprimere l’esercizio sacrosanto del sentimento del contrario, senza limiti, senza censure, senza deformazioni. E gli esempi negli ultimi anni sono stati tantissimi sia nella forma della sintesi del tweet, che del meme o delle pochissime esperienze video: il Terzo Segreto di Satira su tutti, un collettivo che ha spopolato sul web negli anni dieci fino ad arrivare in rare occasioni anche in televisione, seppure in terza serata, e ad un film e che cito come unico e solo esempio perché sono uno dei volti che negli anni lo hanno contraddistinto, e quindi lo faccio per poter dire, almeno per una volta nella vita, di essere vittima o carnefice del conflitto d’interesse.

L'articolo completo lo trovate su Fanpage

25
1
view more: next ›

Caffè Italia

0 readers
0 users here now

Caffé italia è la community dove poter parlar di tutto quello che non ha una community specifica in feddit.it

founded 1 year ago
MODERATORS