Lunga vita al lonzino di fichi

Butto giù giusto due note su questa bella tradizione contadina, perché proprio oggi ne ho fatti un paio – per la seconda volta quest’anno – e mi ha dato la solita soddisfazione di quando aiutavo nonna da piccolo.

Per chi non sa di cosa sto parlando, c’era un tempo in cui nelle Marche ad agosto si affogava nei fichi, e dopo qualche mese si stentava a superare l’inverno. Si cercava allora di preservarne un po’ per avere qualcosa di calorico da mangiare quando le calorie servivano di più. In pratica si mettevano a seccare al sole i fichi maturi tagliandoli a metà, poi una volta secchi si macinavano con un tritacarne e si impastavano con pezzi di noci e mandorle, e qualche spruzzata di mistrà che aiutava anche a far conservare l’impasto. Si dava quindi forma di lonzino e lo si avvolgeva nelle foglie di fico.

Dal 1999 è divenuto presidio Slow Food, si trovano in commercio e non sono nemmeno tanto economiche, ma per me il valore è dato principalmente dal farsele da soli e regalarle o mangiarsele dopo qualche settimana/mese per dargli il tempo di asciugarsi e per ravvivare la tradizione delle lonzette di fico come aiuto per superare l’inverno. Lonzino o lonzette… a me ricorda più un salame perché ha i “lardelli”, ma forse sbaglio io 🤷‍♂️

La ricetta varia da casa a casa, ma tendenzialmente si usa quello che ho scritto sopra tutto in Q.B. (quanto basta). Qualcuno aggiunge del cacao amaro perché ci sta bene, e io invece del mistrà ho usato l’anisetta Meletti, ma solo perché ce l’ho aperta a casa. Una parte di noci e mandorle può aver senso usarla in forma di farina per dare una compattata al tutto. Le noci c’è chi le mette nel tritacarne, e chi le passa al coltello per avere i pezzi più grandi, io preferisco questo secondo metodo ma consapevole che i pezzi più grandi rimangono più visibili all’esterno e più difficilmente sono attaccati dalla muffa. Da tradizione bisognerebbe usare le foglie di fico, ma io sono pigro e preferisco la carta forno, principalmente per un fatto di igiene ma anche perché poi le foglie si frantumano e rimangono attaccate, facendo perdere la pazienza quando è ora di mangiare.

Nota sui fichi secchi: ai tempi si facevano seccare al sole, ma ci vuole di più, si perde qualcosa in igiene e c’è sempre il rischio di dimenticarseli fuori quando piove o di perdersene una parte a causa della muffa. Molti optano per il lasciarli un quarto d’ora/mezz’ora nel forno a temperatura non troppo alta, mentre io preferisco un essiccatore, tipo quelli che si usano per i funghi. Ci vogliono una decina di ore ma consumano abbastanza poco e fanno un lavoro ideale, specialmente se si ha un impianto fotovoltaico si riesce a seccarli “gratis” con il sole… ma a corrente.

Nota numero due sui fichi secchi: avendoli tutti pronti a faccia un su secondo me conviene dargli una passata con il mistrà (o similare) uno per uno, o con pennellino o con contagocce. Così l’alcool viene assorbito meglio e distribuito meglio.

Segue una carrellata di foto. Quella quantità di fichi è sufficiente per due lonzette piuttosto grandi da 250g (quelle in commercio di solito sono più piccole).

Una volta modellate il mio consiglio per la confezione è: carta forno e spago, e magari la retina da insaccati/arrosti. Se volete fare le cose per bene potete provare con le foglie, ma da soli è più difficile e comportano qualche rischio in più, anche per la muffa. A me piace con quella forma a caramellona, ma forse è meglio tagliare quei pezzi di carta 🤔

Foglio di calcolo per punteggi Fantacalcio

Di recente con i miei amici abbiamo deciso di fare il grande salto e abbandonare quell’insieme di fogli Excel e script VBScript che usavo da vent’anni per calcolare i punteggi e preparare stampe dei risultati, in favore del blasonato fantacalcio.it. Se per anni sono riuscito a mantenere tutto in vita semplicemente con una macchina virtuale Windows XP su VirtualBox, dal 2022 essendo passato ad un Mac M1 ho dovuto abbandonare VirtualBox perché la mia versione di XP era (ovviamente) compilata per x86. Tra problemi di condivisione cartelle e crash improvvisi per un paio d’anni ho tirato avanti con un Windows XP emulato su UTM, ma il tutto stava su veramente troppo con lo sputo, quindi dopo due anni di dubbi e bestemmie ci ho rinunciato.

La decisione l’ho presa – anche se non a cuor leggero – perché era diventato sempre più difficile stare dietro a quella roba vecchia. Inutile dire che tutto quell’insieme di query e report con cui ero in grado velocemente di mostrare statistiche su più anni si ferma lì. In compenso si sono ridotti i tempi per l’inserimento dei dati e il calcolo delle giornate, oltre ad avere semplificato la configurabilità di formazioni e cambi, e i cambiamenti nelle modalità di calcolo dei punteggi. Inoltre in caso di mia indisponibilità, c’è un amministratore in seconda che può traghettare il tutto con poco sforzo.

Schermata “super-admin” della nostra lega su fantacalcio.it

Nel nostro caso però abbiamo un’esigenza che non si riesce a gestire automaticamente dal loro sito, vale a dire il conteggio degli ultimi posti di giornata, che utilizziamo per raccogliere quei pochi euro da ridistribuire in primi alla media più alta e al punteggio più alto, anche questo da tenere sotto osservazione. Ragion per cui ho deciso di farmi questo foglio di calcolo (Google Spreadsheets) condividendolo in visualizzazione con tutti, e in modifica con l’amministratore in seconda.

Uniche cose inseribili/da inserire sono i punteggi di ciascuna squadra per ogni giornata, e i punti-classifica raccolti, in due fogli distinti. Il resto dei fogli servono per i calcoli e si può nascondere per evitare che chi è poco pratico ci si perda.

In fondo ai punteggi c’è il pannello di visualizzazione con dati aggregati basati su queste due cose inserite. Grazie ai gradienti da rosso a verde (o viceversa) già a colpo d’occhio si notano le squadre vincitrici, quelle che hanno vinto meritatamente, quelle che hanno avuto più fortuna, quelle che hanno avuto un’annata disastrosa.

Niente di trascendentale, ma è anche un modo per mantenere i risultati fuori dal sito senza starsi a smattire a fine anno. Se lo trovate utile sentitevi liberi di copiare o prenderci spunto.

Le statistiche del 2023/24, inserite per prova

I fogli che nel mio caso ho nascosto

“Fare casa”: retrospettiva e appunti

“Fare casa” è stata un’attività lunga e travagliata, costellata di imprevisti di ogni genere e da cui ho imparato molto. Ho deciso quindi di scrivere alcune note sintetiche per il giorno in cui mi dovessi accingere nuovamente a una follia simile, o perché no per mettere in guardia chi si appresta a fare lo stesso e per caso è finito su questa pagina.

Nel mio caso la genesi è stata il voler provare a riutilizzare una specie di magazzino in una casa “di famiglia”, pensato per poter essere un giorno trasformato in appartamento. La proprietà di quest’unità immobiliare (non registrata come abitazione) era frammentata e in minima parte anche mia, da qui anche complicazioni in fase di pagamento IMU che volevo andare a risolvere una volta per tutte.

Cambio di destinazione d’uso

Prima di prendere ogni decisione fatevi fare un preventivo (grazie al …), ma accertatevi anche di quale potrebbe essere l’importo degli oneri comunali per il cambio di destinazione d’uso se l’unità in questione non è registrata come appartamento. Questi sono proporzionali al volume (non alla superficie), quindi l’importo non è così scontato, e nel mio caso ad esempio è risultato essere di alcune migliaia di euro inferiore rispetto a quello che mi aveva anticipato il geometra che ho contattato per seguire la pratica. C’è da dire però che a parte alcune centinaia di euro di oneri di segreteria, il resto può essere messo in detrazione al 50% per la ristrutturazione.

Sulle donazioni

Io ho avuto bisogno di fare un “accorpamento” dal notaio per gestire il caos di varie proprietà frammentate, con la donazione in seguito da mio padre. In questo frangente ho capito come ci siano due opzioni e due fazioni (?): chi opta per la donazione perché i costi sono minori, e chi preferisce la compravendita perché mette al riparo (?) da eventuali terzi incomodi in futuro.
La questione è che molti purtroppo sono consigliati – da persone senza tanti scrupoli – a “inscenare” una compravendita per mettersi al riparo da futuri creditori e da eventuali futuri eredi che dovessero presentarsi all’incasso, senza chiarire che una compravendita simulata oltre a costare di più non mette al riparo da niente ed è reato, specialmente se portata avanti con l’emissione di un assegno scoperto. Prima di fare qualunque cosa parlate con un notaio in modo chiaro e valutate tutte le alternative.
Può essere saggio farsi fare una stima precisa di ciò che si riceve, in modo da avere dei riferimenti qualora un giorno si presenti qualcuno di inaspettato.

Sopralluoghi e accampamenti

Una cosa che purtroppo non ho fatto anche se avrei potuto, è stata quella di passare alcuni giorni nell’appartamento in questione (e notti, portandoci un materassino e un sacco a pelo). Questo mi avrebbe permesso di identificare tutta una serie di rumori e forse avrei potuto metterci delle pezze o decidere diversamente. Il problema è che sebbene ci siano “recenti” normative in merito, il comfort acustico è stato più o meno bellamente ignorato per decenni da imprese di costruzione e geometri, anche quando non avrebbe dovuto più dovuto esserlo. I tubi di scarico e dell’acqua sono coibentati? Sono stati messi gli isolamenti tra solaio e massetto? Ci sono ponti acustici? Inoltre: i vicini hanno passatempi rumorosi? Sulla strada vicino a casa è solito passare qualche mezzo estremamente rumoroso?
Sono tutte domande a cui è bene trovare una risposta prima di prendere una qualunque decisione, specialmente se (al 2019) il resto di casa ha poco più di dieci anni…

La ristrutturazione

Giusto le fasi salienti, con alcune sottolineature nei punti dove si potrebbero commettere sbagli significativi.

Suddivisione degli spazi, disegno di cucina e bagno

Cercate di farvi disegnare la cucina non appena la planimetria è “decisa”, questo per valutare se la suddivisione degli spazi può essere fatta in modo migliore. La cucina ha bisogno di tutta una serie di tracce, e sarebbe bene predisporre la stanza per l’utilizzo quanto più possibile di basi ed elettrodomestici a dimensioni standard, anche per risparmiare. Considerate anche che eventuali cambiamenti nella suddivisione delle stanze potrebbero portare le stesse ad avere meno superficie finestrata del necessario, e questo potrebbe rendere necessari ulteriori aperture o lavori su quel fronte a meno della perdita del permesso a costruire.
Discorso molto simile per il bagno, anche se in questo caso i componenti sono meno e il lavoro è certamente più veloce.

Se posso dire la mia: cucina e bagno devono essere ragionati in modo da rendere le operazioni giornaliere il più veloci e comode possibili, per facilitare la pulizia ed eventuali manutenzioni.

Prestate attenzione a seguire per quanto possibile la disposizione delle stanze negli altri piani o negli appartamenti adiacenti, specialmente per quanto riguarda bagni e cucine, non vorrete trovarvi con degli scarichi che vi passano proprio sopra la testa mentre dormite…

Massetto e isolamenti

Il massetto ha bisogno di uno shock termico per stabilizzarsi, vale a dire che deve essere riscaldato pesantemente per alcuni giorni. Questa cosa alcuni “professionisti” la considerano facoltativa, ma in realtà sarebbe necessaria, e oltre a portare via tempo costa anche parecchio se fatta utilizzando l’elettricità (a me sono partiti più di 300€ per questo scherzo non messo a preventivo).

Considerate che l’altezza minima del soffitto per richiedere l’abitabilità è 275, e se avete bisogno di fare controplaccaggi/controsoffitti per esigenze di acustica, potreste dover rinunciare a qualcosina sotto i piedi, come per esempio il riscaldamento a pavimento.
Se non siete a piano terra non lesinate sugli isolamenti a terra, potendo è meglio abbondare, ne va dell’armonia con i vicini. E nei casi peggiori non rischierete di perdere della cause.

Possibile controsoffitto di emergenza

Se ci si ritroverà ad aver bisogno di metterci una pezza, un controsoffitto “abbastanza compatto” che mi è stato consigliato è composto da: un cm di spazio vuoto (con le guide su cui attaccare il resto), due cm di lana di roccia, un cm di fibra di legno, un cm abbondante di cartongesso LaDura Plus. L’efficacia è pressoché nulla sotto i 100/120 Hz, ma poco dopo arriva a un guadagno di 15/20 dB.
Tenete a mente però che i rumori del piano di sopra si propagano sì attraverso il soffitto ma anche lungo le pareti, quindi se si procede con un controplaccaggio può aver senso far rivestire la/le pareti con cartongesso prima di fare il controsoffitto… spazio e finanze permettendo ovviamente.

Pavimento e piastrelle

Il costo della posa delle piastrelle è inversamente proporzionale alla loro dimensione fino a un certo punto, con piastrelle molto grandi questo poi aumenta per la maggior difficoltà a posizionarle. Le piastrelle molto grandi aumentano lo scarto, ma lo scarto può essere usato facilmente come zoccolino (se si prende questa strada). Una volta scelte le piastrelle decidete con il piastrellista da dove partire, e sebbene spesso l’estetica la faccia da padrona forse il primo riferimento dovrebbe essere quello di come è suddiviso il massetto, perché se le mattonelle non si ritrovano a cavallo di queste “placche” forse ci si possono risparmiare spiacevoli fratture in seguito.

Se sotto di voi abita qualcuno prima di fare il pavimento valutate se aggiungere un isolamento acustico sotto-pavimento (tra pavimento e massetto). Non è la soluzione ideale rispetto all’isolamento tra solaio e massetto, ma può essere un buon piano B se questa manca o non è stata fatta nel migliore dei modi.

Zoccolini

Andando contro il parere di tutti quelli che ho sentito, io ho optato per gli zoccolini in legno bianco, come tutte le pareti e gli stipiti delle porte. Il pavimento è in gres grigio non particolarmente scuro e nemmeno troppo uniforme. Il risultato è esattamente come me lo figuravo, molto luminoso e spazioso, e il pavimento non sembra mai sporco nonostante viva in campagna. Però: gli zoccolini ricavati dal gres sono più semplici da installare, si riutilizza lo scarto del piastrellista, e se ho capito bene è più difficile che dietro vi si annidino degli insetti.

All’inizio pensavo di far installare quelli passacavi da ufficio, ma devo dire che sono contento di non averlo fatto perché il costo era parecchio superiore e a conti fatti non li avrei sfruttati granché.

Idralica e impianti

Una cosa semplicissima da mettere: un filtro auto-pulente a monte dell’impianto, perché costa pochissimo e può evitare pulizie dell’impianto a seguito per esempio di rotture. Una cosa che può aver senso mettere è un addolcitore, valutate quanto è dura l’acqua con gli appositi strumenti e tirate le somme, tenendo conto che meno calcare significa anche una durata maggiore di rubinetteria, lavatrice e lavastoviglie.

Riscaldamento e acqua calda

Questa è sicuramente la sezione più complicata. Diciamo che io alla fine ho optato per un riscaldamento a pavimento con pompa di calore, la cui unità esterna fa funzionare anche un grosso condizionatore.
La pompa di calore ha un accumulo di acqua calda sufficiente a una piccola famiglia e un piccolo accumulo anche per l’acqua che serve al riscaldamento, in questo modo non ho dovuto aggiungere serbatoi esterni e ho potuto evitare locali tecnici. Pro di questa soluzione: il riscaldamento a pavimento non ha bisogno di temperature alte, e in questa modalità la PDC consuma poco e regge bene anche all’abbassarsi delle temperature. Avendo un fotovoltaico da 3kW cerco di sfruttare la PDC al massimo quando c’è il sole, così da usare tutta l’elettricità per i consumi domestici, stesso discorso in estate con il condizionatore, che a dire il vero uso abbastanza poco. In inverno se attacco il riscaldamento alle nove e lo stacco alle quattro del pomeriggio, anche se l’appartamento non ha una classe energetica eccezionale la capacità termica del pavimento è tale che la temperatura rimane quasi costante fino al mattino.

Ci poteva stare un impianto solare termico sul tetto per riscaldare l’acqua, ma a conti fatti non mi avrebbe aiutato granché perché in estate la PDC scalda l’acqua con un niente, e in inverno il solare termico non aiuta moltissimo. Ad avere spazio per un locale tecnico (per le vasche di espansione) e l’accesso facile al tetto forse poteva aver senso, ma avrebbe anche reso più complesso e “fragile” tutto l’impianto.

Avrei potuto utilizzare le serpentine sotto al pavimento anche per il raffreddamento estivo, ma la cosa mi è stata sconsigliata perché a detta di alcuni la condensa avrebbe fatto inumidire i pavimenti di tutta casa, a meno di installare costosi de-umidificatori nelle varie stanze.

Un errore certo, anche se marginale: il condizionatore poteva funzionare in alternativa all’impianto a pavimento se ci fosse stata portata la linea dell’acqua calda, cosa che purtroppo non è stata fatta e devo ancora capire il perché. Peccato perché così quell’attrezzo in mezzo alla sala così se ne sta spento per nove mesi l’anno, l’impianto a pavimento ha un’inerzia notevole, e in casi di bisogno avrei potuto usare quel grosso termoconvettore alimentato da PDC al posto di stufette improvvisate.

Stufa a legna

Come aiuto per la stagione fredda ho messo una stufa a legna indipendente che può essere usata anche per cucinare. Più piccola ed economica di un camino, anche lei arreda abbastanza e fa una bella fiamma.
Qui c’è stato da perdere un po’ di tempo perché ho scoperto troppo tardi che le canne fumarie a mia disposizione non erano adatte alla stufa che ho scelto inizialmente (troppo piccola quella per la caldaia, troppo grande quella per il camino), e in un secondo momento mi sono reso conto che questa seconda canna fumaria non poteva essere intubata a causa di serpentine fatte all’interno del solaio nel piano di sopra. Alla fine ho risolto prendendo una stufa meno efficiente che ha bisogno di un tubo più grande ma non troppo più piccolo di quello del camino, e il tiraggio risulta essere buono.

Impianto elettrico

Non molto da dire, giusto un paio di accorgimenti che consiglio.
Il primo è un interruttore astronomico per le luci esterne, per evitare di dover stare sempre ad accenderle a mano (anche per quella sopra il portone d’ingresso).
Seconda cosa forse più importante è quella di aggiungere un gruppo di continuità sul circuito delle luci. Questo per tre motivi: se avete delle luci accese e state facendo qualcosa, queste rimangono accese abbastanza a lungo per finire l’attività in caso di mancanza di corrente; uno “online” agisce anche da stabilizzatore e puoi aiutarvi a far durare di più le luci; vi risparmiate l’installazione delle luci d’emergenza.

Impianto di aspirazione centralizzato

Questa è una chicca che può aver senso predisporre specialmente in una casa con più abitazioni, ma nel qual caso valutate bene dove installare l’unità centrale di aspirazione per una questione di rumore e di accesso per la pulizia del filtro. Inoltre conviene prendere un tubo e valutare bene dove piazzare quelle due/tre/quattro bocchette, perché il rischio è che vi ritroviate con delle bocchette con cui non riuscite ad arrivare in tutta casa. Io all’inizio non le volevo far mettere perché le vedevo come una spesa extra nonostante nella casa ci fosse già un’unità di aspirazione, poi all’ultimo ho chiesto di far mettere due bocchette piazzate in modo da coprire il massimo della superficie, ma così facendo ho lasciato fuori un pezzetto di sala e la cucina. Facendone mettere tre avrei speso qualcosina in più ma avrei potuto usarlo in tutta casa oltre che fuori (per l’auto per esempio). Finisce che non lo uso mai perché vado sempre di scopa ma comunque è un attrezzo che ha il suo perché.

Illuminazione

Se optate per delle strisce a led su profili di alluminio preparate dall’elettricista, come me, tenete a mente che i profili di alluminio sono soggetti a dilatazione termica perché le strisce di led scaldano parecchio. Questo comporta dei rumori sia da accese che una volta spente, rumori che si propagano sul muro e possono sentirsi anche dalle altre stanze. Tenete conto che potreste sentire come “dei rintocchi” saltuari in camera per un po’ di tempo (anche un’ora o due) se dall’altra parte del muro (in sala) avete lasciato accese quelle luci per un po’. Storia vera.

Echi e riverberi

Stanza enorme: eco.

Modi per ridurlo: riempire di mobili in modo da occupare il volume e le pareti (magari delle belle librerie piene di libri), montare delle tende a finestre e porte-finestre.

Volete lasciare la stanza vuota, le pareti spoglie o quasi e non vi piacciono le tende? Allora vanno applicati dei pannelli fono-assorbenti, magari al soffitto. Se ne trovano di vari tipi, dimensioni, colori e materiali.

Per concludere

Il mio approccio in sintesi è stato: “ottimizzare” bagno e cucina, camera e cameretta di dimensioni non eccessive e senza perderci troppo tempo, il resto di casa uno stanzone unico per guadagnare in versatilità, ovviamente predisposto per la suddivisione futura con pareti di cartongesso e per l’installazione di un nuovo bagno (senza bisogno di spaccare il riscaldamento a pavimento).

Inutile dire che una di queste pareti che ho voluto lasciare spoglie ora serve a riflettere le luci colorate di un proiettore installato a soffitto, le cui tracce sono state fatte prima di quelle delle luci 😉

Su rifiuti, riciclo e inceneritori

Immagine tratta da “C’era una volta la Terra”, episodio di “C’era una volta l’uomo”

Premessa: non sono del settore, e ho deciso di buttare giù due pensieri sull’argomento solo perché ogni tanto scrivere un temino non fa male, per vedere la nuova versione di WordPress e perché volevo rispondere a dei tizi su Twitter, che come è noto non si presta molto alle conversazioni dettagliate.

Il tweet è questo: https://twitter.com/sebmes/status/1148574456438231041
Si parla dell’impossibilità di risolvere l’emergenza rifiuti di Palermo, che imperversa ormai da tanti anni, e dell’opposizione nella regione alla costruzione di un termovalorizzatore, sinonimo politicamente corretto di inceneritore.

Nota: a Palermo ci “ho vissuto” per più di un mese tra gennaio e marzo 2019, in centro, e ho toccato il problema con mano. Per più di un mese ho fatto la differenziata a casa, cercando di separare tutto per bene e buttando via una/due volte a settimana soltanto l’umido (nei grossi bidoni neri stradali con tutto il resto, per la gioia dei gabbiani); alla fine non sapendo dove buttare plastica, carta e metalli anche questi hanno fatto la stessa fine… ma almeno li ho lasciati separati (speravo di trovare una soluzione negli ultimi giorni ma poi per mancanza di tempo ho evitato giri assurdi). L’idea che mi sono fatto è che alle persone non interessa, non per niente tutte le persone che ho interpellato – giovani e meno giovani – tutte mi hanno invitato a non farmi problemi “tanto va bene uguale”. Per la cronaca una situazione non molto diversa dal punto di vista del menefreghismo l’ho trovata a Edimburgo (ci ho passato due mesi nel 2017), ma lì almeno lungo la strada ogni tanto un contenitore per la differenziata c’era…

A casa mia nelle Marche la raccolta differenziata si è sempre fatta: plastica e carta separate per loro conto e ammucchiate per qualche settimana prima di portarle dove si conveniva, il metallo lo raccoglieva il ferracciaro e l’umido andava nella compostiera, aka “il grasciaro”. Poi piano piano ci si è evoluti e da qualche anno abbiamo persino la raccolta porta a porta. In quest’angolo di mondo quasi tutti i paesi stanno nell’intorno del 70% di differenziata, e in alcuni comuni virtuosi si fa anche di meglio. I dati relativi al mio paese si possono consultare qui.
Sarà che da piccolo mi rimase impressa questa puntata di C’era una volta l’uomo ma a me l’idea di vivere in mezzo all’immondizia ha sempre spaventato (quella puntata finiva con gli stati che si tiravano i rifiuti a vicenda perché non si sapeva più dove buttarli…).

Inceneritori e rischi per la salute

Quello degli inceneritori è un argomento controverso. Secondo alcuni sono fabbriche di morte perché disperdono nell’aria una gran quantità di micro-nano-pico o non so cosa polveri, per altri sono l’invenzione del secolo perché permettono di recuperare energia da materiale totalmente inutile ed emettono soltanto aria pulita.
Per quanto mi riguarda la verità sta da qualche parte a metà strada, e ci sta che in un paese ci siano degli inceneritori, a patto che siano sotto controllo statale, che si paghi per portarci i rifiuti e che siano costruiti con le ultime tecnologie e il più possibile lontani da centri abitati.

Studi ne sono stati fatti tanti qui ad esempio uno commissionato dal Comune di Pisa in cui si rilevano potenziali rischi per la salute anche se con numeri statisticamente non significativi, anche se “le mamme” chiaramente non vogliono saperne di rischi… non a torto secondo me. Tra l’altro mia sorella ha tre figli piccoli e so come ragiona.

Parlando delle polveri a me risulta difficile credere che una volta bruciata una tonnellata di rifiuti resti soltanto una piccola frazione di ceneri, un po’ di energia recuperata, e tanta aria pulita, principalmente perché questa cosa va contro la legge di Lavoisier. Scrivo questa cosa però senza alcuna certezza perché non ho numeri e non ho studiato chimica.

Dulcis in fundo, anche se è un po’ fuori argomento, il controsenso di bruciare ciò che è complesso per ricavarne semplice energia quando quella complessità, che ha richiesto moltissima energia per formarsi, potrebbe essere riutilizzata con un cambiamento di forma minimo e dispendio di energia minimo. Non fa male ricordare che viviamo in un mondo quasi completamente isolato (a parte l’irradiazione solare) e con risorse finite, e sarebbe bene aver cura di ciò che ci passa per le mani.

L’assurdità degli incentivi pubblici agli inceneritori privati

Ricordo un’inchiesta di Report in cui si sottolineava come il giro di soldi attorno all’incenerimento dei rifiuti era la più grande zavorra alla gestione intelligente dei rifiuti, ovvero la raccolta differenziata con conseguente riciclo.

UOMO 1
Se bruci qualcosa incenerisci. Poi, lo vuoi chiamare termovalorizzatore, termo…come c…o ti
pare però è sempre un inceneritore.

UOMO 2
Logicamente che interesse c’è a riciclare quando poi lo Stato finanzia privati con i soldi pubblici
per incenerire i rifiuti?

https://www.report.rai.it/dl/docs/1317375313971oro_di_roma_pdf.pdf (il filmato purtroppo credo non sia più disponibile)

A distanza di tanti anni i problemi di Roma non sono stati risolti e al contrario sono divampati in estate come succede più o meno tutti gli anni: https://www.nextquotidiano.it/rifiuti-roma-report/
Inutile sorprendersi visto che gli attori in gioco non hanno alcun interesse (economico) a risolverli.

Conclusioni

Non sono un giornalista, e stando tutto il giorno davanti al computer non me ne va di passarci troppe ore anche prima di andare a letto. Concludo con i “miei due centesimi” su quello che è un problema complesso e che troppe volte si cerca di risolvere con soluzioni sbrigative.

In natura i rifiuti non esistono, tutto ciò che è rifiuto per un anello della catena è un’utile risorsa per un altro. Una volta nemmeno l’umanità ne produceva tanti, perché si cercava di riutilizzare tutto il più possibile, mentre da qualche decina d’anni si è incominciato a produrre una quantità immonda di scarti e non si prova più nemmeno a riutilizzarli perché con “il benessere” non ha senso perdere tempo per cercare di recuperare tutto, meglio buttare ciò che non serve…

Il problema dei rifiuti si risolve con tanti piccoli accorgimenti quotidiani di ciascuno di noi:

  1. se una cosa può servire non va buttata, se è riparabile va riparata, se non serve più ma a qualcun altro può servire bisogna venderla/regalarla, così da allungare la vita dei prodotti
  2. differenziare, sempre e comunque, perché è un comportamento dal basso che può spingere le amministrazioni a far sì che i rifiuti differenziati siano raccolti separatamente e riciclati
  3. se proprio fare la differenziata non ha senso o non è possibile per mancanza di spazio, conviene comunque separare l’umido ammucchiando tutto il resto insieme, perché l’unica cosa che puzza dopo pochi giorni è l’umido
  4. raccolta porta a porta o centralizzata (con incentivi alla popolazione) poco importa: bisogna spingere affinché le amministrazioni si occupino di far riciclare tutto il possibile
  5. acquistare le merci che hanno meno imballaggi (magari lasciandoli in negozio se superflui)
  6. bisogna scegliere le merci i cui imballaggi residui sono più facilmente riciclabili
  7. evitare l’utilizzo di ogni usa e getta non biodegradabili (sperando che vengano tutti resi illegali prima o poi)

Ci può stare che la parte residua venga bruciata per recuperare energia, ma producendone pochi quest’esigenza viene meno e potenzialmente si può anche decidere di lasciarli in discarica… la bellezza della scelta.

Postscritto

Visto che su Twitter sono arrivate altre critiche, rispondo anche a queste.

  1. “non statisticamente significativo” non vuol dire “piccolo” vuol dire che non c’è: nì, perché con la statistica si può dimostrare tutto e il contrario di tutto (un po’ l’ho anche studiata), dipende chi conduce la ricerca e come interpreta i dati. In fatto di salute bisogna sempre usare cautela, e sparare in cielo “aria arricchita” non è certo che non possa far ammalare qualcuno, questa cosa è in permanente corso di verifica.
  2. i “non sono un esperto ma non credo agli esperti” sono il male della nostra società: vale quello che ho scritto sopra, mi piace pensare che gli esperti abbiano ragione, e infatti non escludo a priori la costruzione di inceneritori; dico soltanto che dovrebbero essere l’ultima risorsa, per tutti i motivi spiegati. Se non altro ho specificato che non essendo un esperto le cose che ho scritto potrebbero essere minchiate. E comunque non vedo che male c’è ad esprimere un parere su Twitter, boh.
  3. la soluzione passa anche dagli inceneritori: nì. In un mondo giusto non dovrebbe essercene bisogno, ma il nostro non lo è. Essendo in Italia la terrei proprio come ultima carta da giocare anche per evitare quello che è successo a Roma, ovvero il fallimento pilotato della differenziata perché non c’era l’interesse economico a farla funzionare. Riducendo al massimo sprechi e scarti, rendere questi riciclabili e riciclando tutto il possibile, la quantità residua di rifiuti sarebbe talmente bassa che se ne potrebbe fare anche a meno di bruciarla… così magari per usare gli inceneritori che ormai avremo poi potremo chiedere agli altri paesi di mandarci la loro tanto per non sottoalimentarli…

Piccole automazioni con Powershell

Molti si chiedono perché esiste Powershell e a che pro bisognerebbe incominciare a usarlo. Me lo sono chiesto anch’io quando un ex collega ha iniziato a introdurlo in azienda preferendolo ad altri linguaggi più o meno di scripting.
Il primo risultato che mi ha restituito Google alla domanda “Why Powershell”: Why Powershell?

Ebbene, anche a non aver bisogno di mandare razzi sulla Luna è uno strumento che è giusto conoscere, specialmente se si lavora con tecnologie Microsoft ma non necessariamente. Un gran bel punto a suo favore è inoltre la facilità con cui si può sviluppare e debuggare uno script utilizzando Visual Studio Code, indipendentemente che ci si trovi su Windows, macOS o Linux. Tra l’altro quando si ha bisogno di automatizzare un qualche processo si finisce per usare quasi sempre le stesse istruzioni combinate in modo diverso, quindi appena se ne hanno alcuni a portata di mano diventa tutto un copia-e-incolla.

Qui sotto un semplice esempio di script Powershell che:

  • Compila un progetto .NET
  • Prende soltanto file dll e exe generati e li comprime in un archivio
  • Legge una stringa dal file .csproj (xml) per utilizzarla come nome del file zip
  • Prende in ingresso un parametro come argomento dello script (usandolo eventualmente come nome del file zip)
  • Utilizza un metodo del .NET Framework (System.String.IsNullOrWhiteSpace)

Dubito che qualcuno abbia bisogno di fare le stesse cose e in quest’ordine, ma anche preso a pezzi può comunque tornare utile (a me senza dubbio).

$workingDir = "./"
$projectName = "Dotnet.Project.Test"
$projectDir = "./src/$projectName/"
$csProjectFile = "$($projectDir)$($projectName).csproj"
$buildDir = "$($projectDir)bin/Release"

# args[0]: version
$interactive = $args.Length -eq 0 # if interactive can prompt questions

if ($interactive -eq $true) {
    $versionFromFile = (Select-Xml -Path $csProjectFile -XPath '/Project/PropertyGroup/Version' | Select-Object).Node.InnerText
    $versionToUse = Read-Host -Prompt "Current version is $versionFromFile, write anything if you don't want to use this one"
    if ([string]::IsNullOrWhiteSpace($versionToUse)){
        $versionToUse = $versionFromFile
    }
} else {
    $versionToUse = $args[0]
}

$zipFileName = "$versionToUse.zip"
$zipFile = "$workingDir/$zipFileName"

if (Test-Path $zipFile) {
    if ($interactive -eq $true) {
        $ShouldDeleteZip = Read-Host -Prompt "File $zipFileName already exists. Would you like to delete it now? [y/N]"
        if ($ShouldDeleteZip -eq "y") {
            Remove-Item $zipFile
        } else {
            Read-Host -Prompt "Impossible to continue without removing $zipFileName file, press a key to exit"
            Break
        }
    } else {
        Write-Host "Existing $zipFileName file, deleting it..."
        Remove-Item $zipFile
    }
}

Write-Host "Building $projectName..."

Start-Process -WorkingDirectory $workingDir -Wait -NoNewWindow -FilePath "dotnet" -ArgumentList "build ""$($csProjectFile)"" -c Release"

Write-Host "Compressing archive $zipFileName..."

Get-ChildItem -Path $buildDir |
    Where-Object { $_.Extension -eq '.dll' -Or $_.Extension -eq '.exe' -Or $_.Extension -eq '.config' } |
    Compress-Archive -DestinationPath $zipFile -Update

if (Test-Path $zipFile) {
    Write-Host "File $zipFileName created"
} else {
    Write-Host "An unknown error occurred while compressing the file"
}

Read-Host -Prompt "Press a key to exit..."

Weee! Xamarin Forms anche su web “grazie a” Ooui

Chi frequenta il mondo .NET e in particolare quello di Xamarin non può non conoscere Praeclarum, al secolo Frank A. Krueger, sviluppatore al limite del mitologico con un profilo pubblico Github che tra le altre cose annovera sqlite-net (libreria per usare Sqlite con Xamarin) e Continuous (IDE per iOS sviluppato in F#).
Ebbene il buon Frank da giugno dell’anno scorso sta lavorando a Ooui, libreria nuget con cui far girare applicazioni Xamarin Forms su un browser.

Il logo è una puzzola

Detta così potrebbe sembrare quasi una minaccia perché è cosa nota che Xamarin Forms non vada proprio del tutto a genio a molti sviluppatori, e il sottoscritto è tra questi, ma è anche innegabile lo sforzo della Microsoft di far evolvere e stabilizzare questa tecnologia, quindi ben venga l’apertura di nuovi filoni che possano aiutare a farla crescere.

Come è stata accolto Ooui nell’ambiente

La faccio breve: seppur sia ancora un progetto quanto meno acerbo, si è manifestato un certo entusiasmo. L’idea di riutilizzare su più piattaforme la stessa base di codice e di conoscenze fa festa. Un bell’articolo da leggere è quello di Telerik, dove l’autore cerca di spiegare i vari approcci e il perché non bisogna a vederla come una rinascita di Silverlight.

https://www.telerik.com/blogs/xamarin-forms-on-the-web

Molto interessante anche il contributo di Adam Pedley altro soggetto che non si può non conoscere se si lavora con Xamarin, in cui Adam spiega come percorrere l’ultimo miglio per far diventare la nostra applicazione web basata su Xamarin.Forms una Progressive Web App a tutti gli effetti aggiungendo manifest e webworker.

https://xamarinhelp.com/create-a-pwa-in-xamarin-forms-with-ooui-wasm/

Il mio esperimento


https://decimaltime.azurewebsites.net/

Un orologio. Decimale. C’è un motivo, e potete leggerlo nel readme del repository. L’orologio è anche tra gli esempi di Xamarin e tra quelli di Ooui, ma nel nostro ci sono un po’ di casi in più: mix di binding e non, immagine di sfondo, popup, libreria nuget per il calcolo delle date… un esempio abbastanza interessante su come trasformare velocemente un’applicazione mobile scritta con Xamarin Forms in webapp utilizzando Ooui.
Nel repository trovate l’applicazione iOS, quella Android (pubblicata anche su PlayStore), l’applicazione web basata su WebAssembly, e quella web ma con backend in cloud e web-socket. Quella sopra è la versione “non wasm”, avviando quella wasm si nota che a differenza dell’altra vengono scaricate tutte le dll e che non si apre alcuna web-socket perché gira tutto in-process all’interno del browser, ma la trasformazione dei componenti Forms in Html5 funziona allo stesso modo.

La versione basata su web socket…

… e quella che usa wasm

Se per qualche misterioso e irrazionale motivo vi piace l’idea dell’orologio decimale con calendario repubblicano sappiate che su Azure ho pubblicato anche delle API web, basate sulla stessa libreria usata nell’app Xamarin Forms.

À la guerre!

Chat (Ro)bots con Microsoft Bot Framework

Da più di un mese volevo scrivere due righe introduttive su come si crea un bot utilizzando il framework Microsoft, e finalmente agli sgoccioli delle vacanze natalizie sono riuscito a raccogliere quel poco di voglia e tempo necessari.

Quella che segue è una rielaborazione – spero semplificata – di ciò che Giulio Santoli e Vito Flavio Lorusso ci hanno mostrato al Bot Revolution Lab dell’ultimo Codemotion di Milano.

Il repository Github: github.com/vflorusso/botrevolution/
Le slides: www.slideshare.net/gjuljo/bot-revolution-lab-at-codemotion-milan-2016

Alternative al framework Microsoft

Chiaramente questa della Microsoft è solo una delle tante opzioni per creare un bot e collegarlo ai canali che ci interessano, e cercando un po’ se ne trovano molte che possono essere migliori per certi aspetti e peggiori per altri.

La differenza credo la facciano il motore di comprensione del linguaggio (più o meno imprescindibile), il costo, il linguaggio di sviluppo, la compatibilità con i principali programmi di messaggistica, la modularità di tutte le varie componenti e la facilità di integrazione con api di terze parti. Tra le altre cose al Codemotion la Cisco (uno degli sponsor) ha mostrato Tropo, delle api con cui – pagando un tanto al chilo – si possono aggiungere funzionalità ai propri bot come la possibilità di effettuare chiamate con voce registrata o text-to-speech, di interpretare la voce di chi risponde utilizzando lo speech-to-text, di inviare sms… in sostanza è un mondo in grande evoluzione e con moltissimi contendenti.
Starli a descrivere a grandi linee sarebbe inutile, un po’ perché non li conosco e un po’ perché andrei off-topic, ritorno quindi sul framework Microsoft ipotizzando che sia “il migliore” in circolazione.

Panoramica sugli strumenti utilizzati

Il laboratorio del Codemotion è durato un’ora e mezza, e in questo lasso di tempo siamo partiti da un ambiente più o meno già configurato per lo sviluppo arrivando a collegare vari bot – pubblicati sulla propria macchina – a Skype, Telegram e Slack.
Si sono utilizzati vari strumenti, che conviene introdurre brevemente perché per lo più possono tornare utili a prescindere dai bot.

ngrok

Si pronuncia “en grok” ed è un sistema di tunneling – http ma non solo – utilissimo quando si vuole sviluppare qualcosa localmente rendendolo accessibile temporaneamente dal web ma senza aprire porte su eventuali firewall.
ngrok.com

Bot Builder SDK

L’sdk con cui scrivere il bot, in C# o NodeJS. Sul repository Github ci sono moltissimi esempi in entrambi i linguaggi.
github.com/Microsoft/BotBuilder

Bot Framework Emulator

Un emulatore desktop multipiattaforma con varie funzionalità utili per testare il proprio bot, sia in locale che dopo averlo pubblicato.
docs.botframework.com/en-us/tools/bot-framework-emulator

LUIS

“Language Understanding Intelligent Service”, ovvero le API Microsoft per la comprensione del linguaggio, utilizzabili in ogni genere di applicazione.
www.luis.ai

Visual Studio Code

Si può utilizzare l’ide o l’editor che si preferisce, ma Visual Studio Code può essere una soluzione ideale sia che si decida di scrivere in Javascript che in C#.
code.visualstudio.com

Preparazione dell’ambiente di sviluppo per l’sdk NodeJS

Per iniziare a sviluppare il proprio bot in locale:

  • procurarsi una versione aggiornata di NodeJS
    Nota: a me la versione 7 diede qualche problema e finii per usare la 6.9.x.
  • installare il bot framework emulator
  • scaricare l’eseguibile di ngrok e copiarlo dove rimane più comodo
  • inizializzare un progetto Node nella cartella di lavoro:
    npm init
  • installare le dipendenze del progetto:
    npm install botbuilder restify dotenv-extended --save

Se si vuole chiudere il cerchio andando a pubblicare il proprio bot collegandolo a un sistema di messaggistica:

  • pubblicare il proprio bot da qualche parte sul cloud (temporaneamente si può usare la propria macchina e ngrok)
  • farsi un account Microsoft su login.live.com
  • crearsi un account sui servizi di messaggistica che ci interessano (Slack, Skype, Telegram, …)

Bot Sanculotto – Salut world

L’obiettivo sarebbe stato quello di sviluppare un bot capace di dire all’utente la data o l’ora usando il calendario rivoluzionario/repubblicano francese o l’orologio decimale, con un minimo di capacità di interpretazione della domanda. In corso d’opera però mi sono reso conto che per sviluppare i pezzi che mi mancano ci avrei messo troppo, e che forse in questa prima parte era meglio fare una panoramica del framework, quindi per non fargli dire “Hello world” al momento Sanculotto risponde “Salut” a tutti.

var builder = require('botbuilder');
var restify = require('restify');

var connector = new builder.ChatConnector();
var bot = new builder.UniversalBot(connector);

bot.dialog('/', [
    function(session) {
        session.send('Salut');
    },
]);

/* LISTEN IN THE CHAT CONNECTOR */
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
server.post('/api/messages', connector.listen());

Questo codice risponde “Salut” a qualunque tipo di messaggio, il resto se mai vedrà la luce lo metterò su Github e cercherò di sfruttarlo per una secondo articoletto.

Test in locale con il framework emulator

Conviene partire dal caso più semplice, sufficiente per sviluppare l’eventuale logica del bot – qui assente – senza stare a scomodare servizi in cloud e sistemi di messaggistica vari.

Configurazione dell’emulatore per rendergli accessibile ngrok

Avvio del bot con “node index.js”, per comodità possiamo usare il terminale integrato in Visual Studio Code

Test con l’emulatore dopo aver specificato l’endpoint locale

Collegamento con account Microsoft e test su Skype

Lo script è come quello di prima con la differenza che questa volta per creare il chat connector dobbiamo usare delle credenziali Microsoft.
Per far questo creiamo nella stessa directory dello script un file .env contenente le credenziali di cui sopra, e nello script le utilizziamo dopo aver caricato il modulo dotenv-extended. Le inseriremo nel file subito dopo aver registrato il bot sul portale della Microsoft.

require('dotenv-extended').load();
// ...
var connector = new builder.ChatConnector({appId: process.env.MICROSOFT_APP_ID, appPassword: process.env.MICROSOFT_APP_PASSWORD});
// ...
MICROSOFT_APP_ID=
MICROSOFT_APP_PASSWORD=

Registrazione del bot sul portale della Microsoft

Lancio di ngrok con ./ngrok http 3978

Un piccolo chiarimento sull’ordine temporale delle operazioni è d’obbligo.
Il portale Microsoft vuole sapere l’endpoint di pubblicazione del nostro bot, che in questo caso è ancora sulla nostra macchina. Sappiamo che la porta è la 3978 perché abbiamo messo in ascolto il nostro server node su quella porta, quindi avviamo ngrok per fare il tunneling http in quella posizione, e copiamo l’indirizzo di forwarding in https sul portale aggiungendo /api/messages perché è quella la nostra root.
A questo punto possiamo generare le credenziali (app-id e password) dal portale e copiarle nel file .env; se tutto è stato configurato correttamente dovrebbe ora essere sufficiente avviare l’applicazione per poter dialogare con il bot dall’interfaccia web del portale Microsoft. Inserendo l’endpoint completo e le credenziali generate sopra sull’emulatore possiamo testare l’applicazione anche con quest’ultimo.

Test dall’interfaccia web del portale Microsoft

Canali disponibili

Una volta registrato sul portale possiamo collegare il nostro bot su tutti i canali che si vuole, la lista è lunga. Naturalmente è necessario avere un account sul sistema di messaggistica che ci interessa, e la procedura di registrazione è diversa per ciascun canale. Quella di Skype chiaramente è la più semplice essendo tutta roba Microsoft, un paio di click e possiamo usarlo per comunicare con Sanculotto.

Test tramite Skype

Nota: ricordiamoci che per la Microsoft l’endpoint del bot è (ancora) l’url generato da ngrok, ed è dinamico. Ogni volta che arrestiamo e riavviamo quest’ultimo dobbiamo quindi andare a sostituire l’url sul portale, almeno finché non pubblichiamo il codice del bot da qualche parte in cloud.

Per concludere

Questa è chiaramente solo un’introduzione al framework, che al primo approccio potrebbe risultare un po’ ostile anche perché abbastanza modulare.
Su Github ci sono molti esempi di bot più o meno complessi, alcuni anche basati su Luis – le api di comprensione del linguaggio – che qui non ho affrontato minimamente un po’ perché meritano un articolo a parte e un po’ perché le ho viste solo cinque minuti più di un mese fa.

Il prossimo passo dovrebbe essere quello di dare a Sanculotto qualche capacità in più, perché al momento il suo rispondere sempre “Salut” a qualunque messaggio lo rende abbastanza poco utile. Conto di farlo nelle prossime due o tre settimane.
A grandi linee penso di pubblicare le api di calcolo del calendario in ASP.NET su Azure perché ho già del codice in c#, e il bot in Javascript sempre su Azure all’interno dello stesso service plan così da minimizzare il traffico tra i due; per l’interpretazione delle richieste in linguaggio naturale c’è Luis, che chiaramente dovrà essere istruito a dovere. In queste ultime quattro righe credo di aver riassunto le potenzialità di questo framework, la cui forza principale è l’enorme ecosistema Microsoft su cui può (ma non necessariamente deve) far affidamento.

Decompilare applicazioni Android di ogni genere, dal dispositivo ai sorgenti

Qualche tempo fa scrissi due righe su come utilizzare l’adb per andarsi a leggere le cartelle private di un’applicazione Android installata sul proprio dispositivo, cosa molto utile per esempio quando si vuole leggere i dati contenuti in un database sqlite.

Quest’oggi invece mi sono tolto la curiosità di provare a tirarmi giù dal telefono varie applicazioni – scritte nei modi più disparati – e “strucinare” un minimo al loro interno giusto per capire quali sono gli strumenti di sviluppo più sicuri.

File apk partendo da un’app installata su un telefono Android

Come già detto nell’altro articolo l’adb nient’altro è che un bridge tra dispositivo e macchina di sviluppo, e lo si può trovare nel percorso android-sdk/platform-tools/adb, dove “android-sdk” è il percorso di installazione dell’sdk Android (la posizione dipende da cosa si utilizza per sviluppare: Android Studio, Xamarin, Titanium, Ionic, …).

Utilizzando l’adb si può scaricare sulla propria macchina l’apk dell’applicazione che ci interessa con questi comandi:

adb shell pm list packages

adb shell pm path com.boh.nonso

adb pull /data/app/com.boh.nonso-2.apk path

Il primo elenca tutte le applicazioni installate, con il secondo si ottiene il path di quella che ci interessa e con il terzo la si scarica.

Listato con tutte le applicazioni installate sul dispositivo

“Esplorazione” dell’apk

Qui si va sul difficile… è sufficiente rinominare il file sostituendo l’estensione “apk” con “zip” e scompattare lo zip.

Studio dei sorgenti dell’applicazione

La fase più complessa principalmente perché l’applicazione potrebbe essere stata sviluppata nei modi più disparati.
Uno strumento utile è sicuramente il Dex2Jar, che come dice il nome permette di convertire il/i file .dex in dei .jar.
Quest’attrezzo però non va molto d’accordo con l’osx, e per farlo funzionare potrebbe essere necessario lavorare un po’ di martello e Stackoverflow, per esempio togliendo la cartella dove si trova il dex2jar dalla quarantena con xattr -rd com.apple.quarantine path.
Una volta dati i permessi di esecuzione allo script d2j-dex2jar.sh basterà eseguirlo e andare a prendere il file generato all’interno della directory del’applicativo:
sh d2j-dex2jar.sh -f apk_path

I file .dex

Qualunque sia lo strumento utilizzato per sviluppare l’applicazione almeno un file .dex c’è sempre, ma non è detto che il codice contenuto al suo interno sia significativo. Se infatti l’applicazione non è stata scritta nativamente in Java (o c++) il .dex serve solo come container/ponte per l’applicazione vera e propria, che potrebbe essere stata sviluppata in Javascript, C#, …
Un file .dex c’è ma non è detto che sia da solo; questo accade quando l’applicazione è stata compilata utilizzando il MultiDex per superare l’infame limite dei 65536 metodi della piattaforma Android.

Decompilazione dei .jar

Una volta ottenuti i jar, ovvero degli archivi contenenti i file .class (classi Java compilate), decompilarli per ottenere il codice Java originario è un gioco da ragazzi, ed è sufficiente aprirli con un decompilatore Java come Java Decompiler.

Senza aver studiato i vari casi nel dettaglio devo dire che tra tutti il sistema apparentemente più difficile da crackare sembra quello di Titanium, che minimizza e cripta il codice javascript originario inserendolo in delle HashMap contenute all’interno del codice java autogenerato dall’sdk di Titanium.

Applicazione scritta in Xamarin, decompilazione delle DLL

Se l’applicazione è stata sviluppata con Xamarin, ovvero scritta in C#, il codice contenuto nel file jar non è molto significativo; all’interno dell’apk però ci sono le dll che possono essere decompilate facilmente con un decompilatore .NET come ILSpy.

Libreria scritta con Xamarin e decompilata con ILSpy


Il processo di decompilazione potrebbe non essere perfetto, e infatti alcuni dettagli si perdono. Per esempio ILSpy non sembra (ancora) in grado di riconoscere le stringhe ottenute con un nameof sulle proprietà di un oggetto, o le stringhe scritte con sintassi $"{code}" (che vengono tradotte con delle string.format), ma per lo più si tratta di zucchero sintattico introdotto nelle ultime versioni del .NET mentre il grosso viene interpretato esattamente così com’era stato scritto originariamente.

Su reverse engineering ed offuscamento

La reverse engineering non è mai vista di buon occhio e, salvo rari casi come lo studio di sistemi esistenti al fine di garantirne l’interoperabilità con altri, è più o meno proibita.
Di certo quelli descritti sommariamente qui sopra sono esercizi molto utili a fini didattici e che in alcuni casi possono aiutarci a scovare bug in strumenti che utilizziamo tutti i giorni, quindi conoscere un po’ queste tematiche è cosa buona e giusta. Inoltre è bene sapere che il nostro lavoro potrebbe essere studiato con grande facilità da malintenzionati e/o concorrenti al fine di danneggiarci o copiare il nostro lavoro, ed è qui che entrano in gioco tutta una serie di buone pratiche su cosa includere o no all’interno della nostra applicazione.

L’offuscamento del codice è argomento controverso senza risposte precise, e in rete si possono trovare moltissime discussioni sull’argomento e vari strumenti per ciascun linguaggio.
In generale a mio avviso non conviene farci affidamento se è vostra intenzione proteggere delle password o rendere incomprensibile il codice di applicazioni molto famose per evitare che dei cracker trovino eventuali vulnerabilità, perché non esiste offuscamento che regga contro il tempo e la pazienza di pirati informatici degni di questo nome.
Al contrario potreste aver sviluppato un’applicazione che deve funzionare offline e al cui interno ci sono soluzioni avanzate e che vi danno un vantaggio competitivo su eventuali concorrenti; in questo caso può aver senso sviluppare tutte le “logiche di calcolo” in una libreria a parte e offuscare solo quella in modo da renderne più difficile lo studio e l’utilizzo da parte di malintenzionati… che poi magari uno sta a pagare per un offuscatore, a rallentare tutta la catena di deploy, a rischiare di inserire bug dovuti all’offuscamento, e il repository con il codice è accessibile via web da molti utenti con password deboli, o ancora più comune si pagano gli sviluppatori come degli operai di basso livello e li si lascia partire con la conoscenza o peggio con i sorgenti, ma questa è un’altra storia.

Xamarin.UITest: il nome inganna, ci si può testare (quasi) tutto

Al recente Xamarin Day di Roma l’MVP Massimo Bonanni ci ha parlato dello Xamarin UITest, framework basato su Calabash per la scrittura e l’automazione di test di accettazione nel mondo dello sviluppo mobile.
Niente di nuovo sotto il sole, se non che in precedenza mi ero fatto ingannare troppo facilmente dall’apparentemente elevato costo del servizio in cloud e non avevo approfondito.

Detto che su GitHub ci sono molti esempi di utilizzo, e che io stesso in un progetto al lavoro ho preso “fortemente spunto” dall’app sviluppata per Xamarin Evolve 2016, riporto qui un mio piccolo esperimento fatto con un’applicazione sviluppata in Titanium. Ebbene sì, il framework è stato sviluppato dal team di Xamarin, ma può essere usato per automatizzare il processo di test su ogni applicazione mobile per Android e iOS. Per Windows non ancora, e la cosa può far sorridere considerato chi è il nuovo padrone di Xamarin, ma magari un giorno colmeranno la lacuna.
Per intenderci, funziona con tutte le tecnologie, ma ha senso usarlo soltanto con quelle che renderizzano componenti nativi: Android, iOS, Xamarin, Titanium, React Native, Native Script, … con i framework ibridi basati su Cordova/Phonegap questo approccio è sbagliato perché tutta l’applicazione gira all’interno di una webview.

Esperimento con Appcelerator Titanium

L'albero degli elementi in un'applicazione Titanium, visualizzato tramite repl

L’albero degli elementi in un’applicazione Titanium visualizzato tramite repl

Quello sopra è l’albero degli elementi in una delle maschere dell’applicazione, così come Titanium l’ha generato a runtime. Gli elementi ci sono tutti, ma scriverci sopra dei test non è sempre banale perché non sempre ci sono degli id a cui poter fare riferimento e a volte bisogna ripiegare sul contenuto testuale. Mmmmm.

Quando si crea un progetto di tipo Xamarin.UITest Xamarin Studio genera in automatico una coppia di file, l’AppInitializer.cs e il Tests.cs. Naturalmente saremo poi liberi di modificare la struttura del nostro progetto come preferiamo (vedi l’app di Xamarin Evolve), ma in quei due file ci sono comunque tutti gli elementi di cui abbiamo bisogno per partire.

public class AppInitializer
{
    public static IApp StartApp(Platform platform)
    {
        if (platform == Platform.Android)
        {
            return ConfigureApp
                .Android
                .ApkFile ("/Users/m.piccotti/src/ti_eatevolution/build/android/bin/Eat Evolution.apk")
                .EnableLocalScreenshots()
                .StartApp();
        }

        return ConfigureApp
            .iOS
            //.AppBundle ("../../../iOS/bin/iPhoneSimulator/Debug/XamarinForms.iOS.app")
            .StartApp();
    }
}
[TestFixture(Platform.Android)]
//[TestFixture(Platform.iOS)]
public class Tests
{
    IApp app;
    Platform platform;

    public Tests(Platform platform)
    {
        this.platform = platform;
    }

    [SetUp]
    public void BeforeEachTest()
    {
        app = AppInitializer.StartApp(platform);
    }

    [Test]
    public void AppWorks()
    {
        //app.Repl();

        Func<AppQuery, AppQuery> title = (arg) => arg.Marked("Eat Evolution");
        Func<AppQuery, AppQuery> barFofoGarden = (arg) => arg.Marked("Bar Fofo Garden");
        Func<AppQuery, AppQuery> filtersButton = (arg) => arg.Class("ActionMenuItemView").Marked("Filters");

        // 1 - info page
        app.WaitForElement(title);
        app.Screenshot("1 - info page");
        Assert.IsNotNull(app.Query("JOIN US OR RECOMMEND").First().Text);

        app.TapCoordinates(100, 300);

        // 2 - list
        app.WaitForElement(barFofoGarden);
        app.Screenshot("2 - list");

        app.Tap(barFofoGarden);

        // 3 - Fofo Garden detail
        app.WaitForElement(barFofoGarden);
        app.Screenshot("3 - Fofo Garden detail");
        Assert.IsNotNull(app.Query("Bar Fofo Garden").First().Text);

        app.TapCoordinates(100, 100);
        app.WaitForElement(barFofoGarden);
        app.Tap(filtersButton);

        // 4 - filters screen
        app.WaitForElement(x => x.Marked("Confirm"));
        app.Screenshot("4 - filters screen");
        Assert.IsNotNull(app.Query("Confirm").First().Text);
        Assert.IsNotNull(app.Query("Cancel").First().Text);

        app.Back();
    }
}

Ora… chi è un po’ pratico di test automatici di unità potrebbe rimanere inorridito al vedere quell’unico metodo AppWorks; certo sarebbe bello se ogni asserzione potesse essere verificata isolatamente, il problema è che questi test sono più lenti di quanto si possa immaginare, e i servizi cloud si pagano a ore. In sostanza entro certi limiti può aver senso anche una robaccia come quella sopra.

Il log generato dal test

Il log generato dal test

Per la cronaca quelle sotto sono le schermate catturate dal test.

Giusto un giretto tra le altre piattaforme

Che tutto avrebbe funzionato anche con le altre tecnologie concorrenti di Xamarin e Titanium non avevo dubbi, ma un giro di prova ho preferito farlo comunque. Sotto potete vedere i miei esperimenti fatti con le applicazioni demo delle varie piattaforme.

Il tree in un'applicazione Native Script

Il tree in un’applicazione Native Script

Per qualche ragione che non ho avuto voglia di approfondire con React Native l’applicazione è esplosa, come se il bridge tra l’applicazione di test e quella da testare non abbia funzionato. Il comando tree richiamato con il repl (strumento utilizzabile da cli) ha visualizzato comunque l’albero degli elementi della schermata rossa.

Il tree in un'applicazione React Native

Il tree in un’applicazione React Native

Il tentativo con Ionic 2 l’ho fatto solo a scopo didattico, per vedere la famosa WebView. Teoricamente si può interagire con l’applicazione a furia di TapCoordinates, ma il test risultante sarebbe così fragile che non ha proprio senso perderci tempo. Per le applicazioni ibride basate su html tanto vale usare Protractor.

Il tree in un'applicazione Ionic 2

Il tree in un’applicazione Ionic 2

Conclusioni

Xamarin.UITest è una figata.

PRO:

  • È possibile interagire con il dispositivo mentre il test automatico è in atto, sia fisicamente che attraverso il repl
  • Con il comando tree da riga di comando si può visualizzare la struttura reale della propria applicazione così com’è stata renderizzata sul dispositivo, cosa che può tornare molto utile
  • Funziona su Android e iOS.
  • Con Xamarin Test Recorder si può registrare il proprio test andando poi a modificarne il codice
  • Il test in cloud è utile non solo per testare automaticamente su molti dispositivi diversi, ma anche per fare test specifici quando ci vengono segnalati dei bug su un dispositivo particolare che non abbiamo a disposizione
  • L’interfaccia web dei test in cloud è spaziale, ci da un sacco di informazioni anche sulle performance ed è possibile fare degli screenshot mirati in presenza di errori e non solo

CONTRO:

  • Non funziona su Windows
  • Il test recorder funziona solo per Android ed è stabile solo per Visual Studio
  • L’esecuzione dei test è lenta da far schifo
  • Il test in cloud costa un occhio della testa anche nella versione Newbie

Le icone raster su Android sono una noia, viva le shape drawable

Chi sviluppa web, o mobile utilizzando strumenti “simil-web” come Titanium e Ionic, da tempo ha imparato a utilizzare asset vettoriali o font, così da rendere impeccabile la resa sui dispositivi con risoluzioni diverse e facilitare operazioni come la modifica dinamica dei colori.
Purtroppo nel mondo dello sviluppo Android si tende ancora a utilizzare icone raster; per la scalatura nelle varie risoluzioni c’è chi fa tutto a mano, chi utilizza script di varia natura in combinazione con ImageMagick e chi si serve di strumenti online come Android Asset Studio.

Su Android l’approccio migliore al momento sembra quello delle Shape Drawables, ovvero immagini vettoriali definite in xml secondo un determinato formato, funzionalità disponibile solo dalla versione 5 di Android (Lollipop), ma abilitabile anche nelle versioni precedenti abilitando la Support Library.

Segnalo un bell’articolo che spiega benissimo come abilitare l’utilizzo degli asset vettoriali anche sulle versioni pre-lollipop e le modifiche da fare per evitare errori abbastanza str.nzi che possono far perdere qualche ora. Con i dovuti adattamenti tutto ciò vale anche per chi (come me) utilizza Xamarin.

Creazione dell’asset vettoriale da icone material e da svg

Qui sotto ci sono i passi da fare, più o meno, per crearsi con Android Studio un’icona vettoriale utilizzabile in Android. Moltissime sono già presenti tra quelle precaricate (material design), ma è possibile anche generarsele a partire dai propri svg.

Creazione di asset vettoriale da Android Studio

Creazione di asset vettoriale da Android Studio

Selezione di una delle icone material già presenti

Selezione di una delle icone material già presenti

Definizione dei dettagli dell'icona scelta

Definizione dei dettagli dell’icona scelta

Importazione di un'immagine raster in Inkscape

Importazione di un’immagine raster in Inkscape

Ridimensionamento dell'immagine vettoriale

Ridimensionamento dell’immagine vettoriale

Vettorizzazione dell'icona raster

Vettorizzazione dell’icona raster

Modalità di vettorizzazione

Modalità di vettorizzazione

Allineamento del tracciato vettoriale nell'immagine

Allineamento del tracciato vettoriale nell’immagine

Errore in fase di importazione dell'icona vettoriale in Android Studio

Errore in fase di importazione dell’icona vettoriale in Android Studio

Correzione dell'xml

Correzione dell’xml

Anteprima dell'svg importato in Android Studio

Anteprima dell’svg importato in Android Studio

Il risultato: icona vettoriale in formato xml

Il risultato: icona vettoriale in formato xml