Di che si tratta? Un protocollo di sicurezza che impedisce ad un computer, all’accensione, di avviare un software che non sia certificato… In sostanza rende impossibile avviare un live CD o un sistema operativo che non sia certificato.

I fatti:

  • la certificazione a Windows 8 richiede che il sistema abbia UEFI Secure Booting ABILITATO
  • la certificazione a Windows 8 NON richiede che l’utente abbia la possibilità di disabilitare l’UEFI, e vi sono dei produttori di hardware (computer) che hanno già affermato che questo non sarà possibile
  • la certificazione a Windows 8 NON richiede che il computer venga fornito con altre chiavi se non quelle Microsoft (ovvero, certificati firmati da Microsoft)
  • Un sistema che viene venduto con UEFI abilitato (e non disabilitabile) e contiene solo chiavi Microsoft avvierà sempre e solo sistemi operativi Microsoft

Avete presente quel bollino che trovate sui vostri computer con il logo di Windows?

Sul mio portatile ne ho uno con il simbolo di Windows e la scritta “Windows 7″.

I produttori di computer, per ottenere la certificazione di Microsoft DEVONO sottostare al programma di certificazione di Microsoft, chi ottiene il Logo di certificazione ottiene incentivi da Microsoft.

Ogni produttore può decidere, in autonomia, se sottostare al programma di certificazione ma, siccome Windows è in posizione dominante (90% del mercato circa) ottenere la certificazione è fondamentale per non perdere competitività con gli altri produttori. È facile prevedere che tutti i produttori venderanno PC con UEFI Secure Booting attivo, come richiesto per la certificazione Microsoft.

In genere questa certificazione si applica ai PC OEM, ovvero quelli con Windows preinstallato, la quasi-totalità dei computer acquistati dai comuni mortali :)

Fonte: Mathew Garret (aka mjg59) e nello specifico questo e questo post sul suo blog; mjg59 è uno sviluppatore Red Hat molto attivo nella community Linux; ultima fonte è Microsoft stessa.

Interrompo il lungo silenzio per riassumere quanto dice mjg59 nei suoi due articoli linkati qui sopra: in italiano, sia per dar eco alla notizia che NON DEVE passare inosservata sia per permettere anche ai non anglofoni di venirne informati.

È presto per andare nel panico ma è il caso di iniziare a preoccuparsi.

Vi state chiedendo, più nello specifico, cosa questo comporta?

Comincio subito spiegando un po’ meglio a cosa serve e come funziona questo UEFI Secure Booting, senza andare troppo nel tecnico:


Se anche a voi capita che per il vostro mouse con 3 bottoni (o più) venga abilitato talvolta l’emulazione del terzo bottone nonostante abbiate specificato in xorg.conf l’opzione Emulate3Button Disable/false/off/no qui vi spiego come risolvere il problema.

L’emulazione del terzo bottone, per chi non sapesse, è questa: pressione contemporanea di Bottone sinistro + Bottone destro = Terzo bottone (o centrale – tipicamente la rotellina)

Se avete dei giochi o programmi (io per esempio gioco a QuakeLive) per cui è necessario usare sinistro e destro contemporaneamente l’emulazione è fastidiosa, ma a prescindere da questo rallenta il mouse (nei pc moderni non si nota neppure).

Bene il responsabile di tutto è Hal.

e per risolvere basta creare un file /etc/hal/fdi/policy/mouseEmulate3Button.fdi (serve essere root) e copiarci questo contenuto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
 <device>
  <match key="info.capabilities" contains="input.mouse">
   <merge key="input.x11_options.Emulate3Buttons" type="string">false</merge>
  </match>
 </device>
</deviceinfo>

quindi riavviare oppure rimuovere il mouse e lanciare /etc/init.d/hal restart da root prima di ricollegarlo.

abbiamo detto ad hal che non vogliamo l’emulazione dei 3 bottoni!

Hal, semplificando, è un server che “ascolta” eventi hardware per scatenare delle operazioni, per esempio quando inserite una chiavetta o un disco esterno questo viene montato grazie ad Hal.[¹]

[¹] Hal è uno dei software più criticati, con udev, perché introduce negli ambienti Linux comportamenti “random / casuali” tipici di ambienti windows: la stessa operazione effettuata due volte da due risultati diversi… d’altra parte senza non funzionerebbe alcuni automatismi come il mount delle chiavette.


Andate su un sito web con flash e non potete utilizzare il sito perché Flash copre un menù? o l’intero sito web (flash come “sfondo”)?

Cliccando con il destro su un oggetto flash vi dice che avete la versione 9 del flash player? Vi spiego come risolvere il problema su firefox e goggle chrome per Linux.

Il bug Adobe di riferimento è questo: transparency is not working in all version of firefox / konqueror / opera

Che è stato chiuso con Flash Player 10 per Linux. La soluzione, che sembra banale, è quella di aggiornare Flash :)

su Debian/Ubuntu (dopo aver abilitato i repository non-free):

(sudo) aptitude install flashplugin-nonfree

(sudo) update-flashplugin-nonfree –install –verbose

Con il secondo comando potete aggiornare flash quando esce una nuova versione.

Trovate queste informazioni ovunque…

Questo post è per chi ha aggiornato Flash ma continua a ritrovarsi con il problema perché Firefox/Chrome insistono ad usare Flash 9!

Non so sulle altre distribuzioni ma su Ubuntu e Debian quando, con Firefox, si visita per la prima volta un sito web con un oggetto Flash viene proposto di installarlo. Se avete installato il 10 ma Firefox / Chrome usano il 9 è per quell’installazione che avete fatto un po’ di tempo fa…

è sufficiente eliminare 2 file (non serve sudo):

rm ~/.mozilla/plugins/libflashplayer.so

rm ~/.mozilla/plugins/flashplayer.xpt

poi chiudere e riaprire Firefox/IceWeasel/Chrome. Eventualmente fatevi un backup dei 2 file invece che eliminarli :)


Quest’anno sono andato a Lodi e ho partecipato al Linux Day del LoLug..

Ho parlato di Git: uno dei più avanzati sistemi di versionamento distribuiti (e multipiattaforma)! Se scrivete software, tesi, libri, pagine internet vi farebbe davvero comodo!

Rispetto a SVN è un’altro pianeta… SVN è vecchio, scarno, scomodo! Git è al passo con la tecnologia, pieno di funzionalità, veloce e comodo!

Git è il sistema di versionamento ideato da Linus Torvalds e utilizzato da tutti i progetti legati a Linux, da grossi progetti in casa google e da moltissime altre aziende e progetti tecnologicamente avanzati.

Moltissimi progetti stanno inoltre migrando a git (fra pochi giorni verrà probabilmente annunciata l’avvenuta migrazione da parte di jquery¹ (migrazione iniziata meno di una settimana fa e che sta avvenendo silenziosamente).

La mia presentazione scaricabile QUI è un’introduzione a git: formati ODS (non supportato da wordpress, lo trovate nello Zip), PDF e PDF con le note che pressappoco dicono ciò che ho detto a voce nel talk.

[¹] jquery è una famosa libreria javascript per realizzare complessi effetti grafici con poche righe di codice! :) Se scrivete javascript e non lo conoscete dovete ASSOLUTAMENTE colmare questa mancanza.

Nota Off Topic: il blog non è morto, è solo semi-deceduto! Deceduto perché non vi scrivo da mesi, semi perché continuo a rispondere ai commenti e ho sempre la speranza di trovare il tempo per tornare a scriverci… Se ancora qualcuno mi segue battete un colpo! :D


Questa è una piccola configurazione che applico a qualunque installazione Debian/Ubuntu/Debian-derivati vari che mi passa tra le mani…

moltissimi già la conoscono immagino.. ritengo che senza l’utilizzo del terminale perda gran parte della sua utilità!

Semplicemente quando scrivete nel terminale un comando è molto molto molto comodo poter completare i comandi con il tasto [TAB].

Di default vengono completati solo i comandi semplici e i “path” ai file…

però se per esempio scrivete:

apt-get up[TAB]

non succede proprio nulla…

e ovviamente anche scrivendo

apt-get install gnome-[TAB]

non succede nulla… :)

questa configurazione semplice e veloce vi permette di attivare auto-completamenti “complessi” come questi qui sopra.

Tali auto-completamenti sono presenti non solo per il comando apt-get ma per moltissimi altri comandi anche non direttamente legati a Debian..

ma veniamo alla guida:

aprite un terminale:

$ gedit ~/.bashrc

scorrete in basso fino a:

# enable programmable completion features (you don’t need to enable
# this, if it’s already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ]; then
#. /etc/bash_completion
#fi

rimuovete i cancelletti (#) dalle ultime 3 righe

ottenendo questo:

# enable programmable completion features (you don’t need to enable
# this, if it’s already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi

già che ci siete cercate questa riga:

# Comment in the above and uncomment this below for a color prompt
#PS1=’${debian_chroot:+($debian_chroot)}\[33[01;32m\]\u@\h\[33[00m\]:\[33[01;34m\]\w\[33[00m\]\$ ‘

e togliete il cancelletto davanti a PS1:

# Comment in the above and uncomment this below for a color prompt
PS1=’${debian_chroot:+($debian_chroot)}\[33[01;32m\]\u@\h\[33[00m\]:\[33[01;34m\]\w\[33[00m\]\$ ‘

salvate e chiudete!

Ora vi basta chiudere e riaprire il terminale per vedere l’effetto funzionante!!!

oppure potete lanciare questo comando per attivarlo senza chiudere e riaprire il terminale:

. ~/.bashrc

un punto seguito da uno spazio e poi il path al file .bashrc nella vostra home directory :)

la prima cosa che vi ho fatto fare attiva l’auto-completamento avanzato, la seconda rende più colorato il prompt dei comandi!

Se volete le stesse cose per l’utente root non vi resta che diventare root (su o sudo -i) e copiare quelle linee nel file /root/.bashrc

Ci sono molte altre cose che potete fare per personalizzarvi il terminale… qualcuna già “preimpostata” in quel file.. dategli un’occhiata ma fatevi un backup per evitare casini  se volete sperimentare :)

NOTA: l’autocompletamento funziona anche ad un settaggio che c’è altrove nel vostro sistema, e precisamente in /etc/bash.bashrc. Normalmente non è necessario far nulla in questo file

ps: sto cambiando look al blog nella speranza che i caratteri siano più leggibili! L’altro layout aveva alcuni caratteri davvero troppo piccoli!


(rieccomi dopo mesi di nulla.. a casa malato e mi do da fare :P )

Quest’articolo fa parte di una serie di articoli sui tool GNU (e quindi Linux) per manipolare testi.

L’esempio che si era visto in quell’articolo, con awk, è il seguente:
cat sottotitoli.srt | awk 'NR%2==1' > sottotitoli-dispari.srt

il cui scopo era rimuovere tutte le righe pari… fra poco sarà tutto più chiaro!

awk è un altro software per la manipolazione dei testi, secondo il mio parere si adatta meglio a lavorare su testi con una struttura rigida, ad esempio divisi per colonne (tipo tabella), ogni elemento di questa “tabella” è chiamato ‘campo’. Per elaborare il risultato di molti comandi Linux questo strumento è comodissimo :)

Per comprendere cosa intendo ecco un piccolo esempio che potete replicare facilmente aprendo un terminale:

$ cal
luglio 2009
lu ma me gi ve sa do
1  2  3  4  5
6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Il comando cal senza parametri stampa il calendario del mese corrente (Luglio 2009 in questo caso).
Vediamo cosa succede se diamo in pasto il risultato del comando cal ad awk.

$ cal | awk '{ print $3; }'
me
3
8
15
22
29

Quel che ho fatto qui è semplicissimo: eseguo il comando cal, quindi il risultato lo butto in pasto al comando awk (si ottiene grazie al pipe, ovvero la linea verticale ‘|’).
il “programma” che viene fatto girare da awk è semplicemente: { print $3; }. Ovvero: stampa la terza colonna (Mercoledì).

In realtà awk è un vero linguaggio di programmazione e quindi più potente, per certi versi, di sed: contiene funzioni richiamabili e permette di effettuare operazioni matematiche con i dati in elaborazione!

In questo breve tutorial impareremo il significato del comando visto qui sopra e cercherò di insegnarvi ad utilizzare awk in modo più approfondito: applicando pattern “per riga” ed effettuando operazioni su stringhe e numeri!

Prerequisiti

Per poter comprendere appieno questo tutorial è necessario che abbiate compreso e fatto un po’ di pratica con le regular expression (o regex) di cui vi ho parlato qui.
Non sono richieste particolari esperienze di programmazione ma aiutano parecchio.

il software si chiama gawk

Si.. non awk ma gawk! awk è il linguaggio, gawk è l’implementazione GNU del linguaggio!
Cioè { print $3; } è un comando nel linguaggio awk che dice di stampare la terza colonna, mentre il software che esegue codice awk si chiama gawk in sistemi GNU/* come Linux.

lanciare gawk

Il manuale di gawk è molto ben scritto, anche se in inglese, e io ho imparato ad utilizzare awk semplicemente leggendo questo manuale e provando di volta in volta.

man gawk

le opzioni principali per lanciare gawk (per le altre guardate il manuale):

  • -F fs o --field-separator fs « l’opzione del comando awk vi permette di specificare quali sono i caratteri che volete siano considerati come separatori di campo (se omessa verranno usati gli spazi e le tabulazioni) e indovinate un po? si può, volendo, indicare quali sono i separatori di campo con una espressione regolare (regex)
  • -f script-file o --file script-file « specifica un file di script awk invece che indicarlo dalla linea di comando tra apici

awk si lancia con questa sintassi (notate gli apici prima e dopo i comandi):

awk '<programma>' nome-file-su-cui-lavorare

oppure

cat nome-file-su-cui-lavorare | awk '<programma>'

oppure

awk -f programma-awk.awk nome-file-su-cui-lavorare

Se ad esempio vogliamo chiedere ad awk di usare la virgola come carattere di separazione dei campi (Field Separator, FS) possiamo invocare awk così:

awk -F, '<programma>'

esiste un caso particolare in cui questo non funziona: se cercate di impostare il SOLO carattere tabulazione (che si indica con ‘\t’) come FS non riuscirete a scriverlo in questo modo… dovrete usare questa scrittura:

awk -F "\t" '<programma>'

che poteva comunque essere utilizzata anche per la virgola o per passare una regex ad awk

un altro modo per fare la stessa cosa è impostare la variabile FS all’interno del programma così:

awk 'BEGIN {FS = ","} { ... }'

Questo metodo è più comodo se volete scrivere uno script invece che lanciare da linea di comando…

Inoltre con l’esempio vediamo 2 cose nuove: BEGIN e l’utilizzo di variabili (cioè contenitori di dati che possono cambiare durante l’esecuzione del codice).

Per chiarificare immaginate di avere questa riga di testo: “tizio,caio,sempronio” e di voler effettuare una separazione utilizzando la virgola anziché gli spazi… Otterreste quindi i campi “tizio”, “caio” e “sempronio”.

$ echo 'tizio,caio,sempronio' | gawk -F, '{ print "1=" $1 " - 2=" $2 " - 3=" $3; }'
1=tizio – 2=caio – 3=sempronio

Con quest’esempio abbiamo anche visto come concatenare delle stringhe (del testo): quello che vuoi volete scrivere potete metterlo tra virgolette doppie… per concatenare più stringhe (metterle una dopo l’altra) è sufficiente elencarle separate da spazio!

Struttura di base di un programma awk

Il testo è suddiviso in record e campi: possiamo pensare ai record come le “righe” di un file di testo e ai “campi” come le sue “colonne”.
Come abbiamo visto prima nell’esempio del calendario i campi sono separati automaticamente dove ci sono spazi, i record sono separati con degli “a capo”. Entrambe questi limitatori si possono cambiare modificando le variabil FS (Field separator, separatore di campo) e RS (Record Separator, separatore di record).

gawk legge un record alla volta, lo suddivide in campi e vi permette di lavorarci.

La struttura di un programma awk è la seguente:

pattern1 { azioni }
pattern2 { azioni }
function nome(parametri) { azioni }

I pattern selezionano dei record su cui verranno svolte delle azioni.
Le funzioni sono comode quando dobbiamo ripetere le stesse operazioni più volte nelle nostre azioni.

Ora vedremo come si utilizzano le variabili in un programma awk, quindi cosa sono i pattern e come sfruttarli…
Il tutto verrà supportato da esempi!

Variabili

Come in qualunque linguaggio di programmazione una variabile è un etichetta: un contenitore!
Le variabili gawk possono contenere numeri o testo e awk si occupa automaticamente di convertire dall’uno all’altro all’occorrenza.

Dichiarare una variabile è semplice:

numero = 12;
testoNumero = "4";
saluto = "ciao";
nome = "daniele";
concatenamento = testo " " nome; /* ciao daniele */
risultato = numero / testoNumero; /* 3 */

Le variabili, una volta che assumono un valore, sono utilizzabili ovunque nel programma awk: sono “globali”.

Ci sono alcune variabili “speciali” già definite da awk, ed alcune le abbiamo già usate:

  • $1: primo campo del record
  • $2: secondo campo del record
  • $0: l’intero record
  • NF: (Number of Fields) numero di campi ($1, $2, …)
  • FS: (Field Separator) separatore di campo, può essere modificato durante l’esecuzione e cambia i valori delle variabili $1, $2, $3, …
  • NR: (Number of Records) numero di record processati (per semplicità pensatelo come il numero di riga per ora)
  • FNR: Numero del record corrente nel file (questo è effettivamente il numero di riga/record)
  • RS: (Record Separator) carattere separatore tra record (predefinito è l’a-capo)

Le trovate tutte nel manuale di gawk.

Vediamo alcuni esempi:

conta il numero di righe di un file di testo. (stesso risultato del comando wc -l di Linux):

gawk '{numeroRighe = numeroRighe +1;} END { print numeroRighe; }'

inserisce i numeri di riga di un file (1. prima riga, 2. seconda riga, ecc…):

gawk '{ print FNR ". " $0;}'

Supponente poi di avere una file con una lista “nome: numero”:

primo salto: 170
secondo salto: 175
terzo salto: 180

si può facilmente calcolare e stampare una media con awk:

BEGIN {
FS = ":"; /* imposto come separatore i 2 punti */
}
{
conteggioRighe = conteggioRighe +1; /* questo può anche essere scritto conteggioRighe++; */
totale = totale + $2; /* il secondo campo è quello dopo i due punti */
print $0; /* stampo tutta la riga invariata */
}
END {
print "-----------"; /* un separatore */
print "media: " totale/conteggioRighe;
}

vettori

tra le variabili si possono anche definire vettori!

mioArray[indice] = valore;
print mioArray[indice];

l’indice e il valore possono essere qualunque variabile: un numero o una stringa.
Quindi questo è perfettamente legale:

mioArray["febbre"] = 38;
mioArray["vomito"] = "si purtroppo";
mioArray[1] = "tutto chiaro?";

pattern di riga

Vi siete chiesti il perché delle parentesi graffe? O perché BEGIN è stato scritto di fronte ad esse nell’ultimo esempio? Qui viene spiegato il perché.

Il linguaggio awk va definito in questo modo:

BEGIN { comandi da eseguire all'inizio }
PATTERN1 { comandi da eseguire per le righe che corrispondono al pattern 1 }
PATTERN2 { comandi da eseguire per le righe che corrispondono al pattern 2 }
END { comandi da eseguire alla fine}

Si ma cos’è un pattern?

Il pattern è in sostanza qualcosa che dice ad awk su quali parti del testo lavorare!
Il pattern può essere un espressione regolare, una espressione di una qualche relazione o una combinazione di queste cose!

Ad ogni pattern sono associate una o più azioni che vengono racchiuse tra parentesi graffe ‘{ }’. Se l’azione viene omessa questa corrisponde all’azione ‘{print}’ che semplicemente stampa l’intero pattern senza azioni su di esso!

Quindi un pattern può essere:

  • una regex: /regex/ { fai qualcosa per le righe che soddisfano la regular expression }
  • un confronto NR%2 == 1 { fai qualcosa con i numeri di riga dispari }: NR è la variabile “numero di riga”, NR%2 è il modulo 2, cioè il resto della divisione per 2.

più pattern possono essere messi in OR/AND/NOT. Cioè ad esempio si può dire che si vuole effettuare un particolare comando per le righe pari che cominciano con dei numeri mettendo in AND un confronto (righe pari) e una regolar expression (cominciano con un numero):

NR%2==0 && /^[0-9].*/ { comandi da applicare a righe pari che cominciano con un numero }

! /topo/ { fai qualcosa con le righe che NON contengono la parola "topo" }

Ci sono due pattern speciali: BEGIN e END. Questi pattern ignorano i dati d’ingresso (il testo).
Con BEGIN la parte “azione” viene eseguita tutta PRIMA di leggere un qualsiasi input.
Con END la parte “azione” viene eseguita DOPO aver finito di processare l’intero testo in input.

Nell’esempio con il file dei sottotitoli abbiamo utilizzato solamente il pattern indicando che volevamo awk lavorasse solo sulle righe dispari.

le funzioni

gawk vi mette a disposizione diverse funzioni già pronte, qui ve ne elenco qualcuna ma vi rimando al manuale di gawk per una lista completa.

  • print(stringa): l’abbiamo già vista, stampa a video delle stringhe
  • lenght(stringa): restituisce la lunghezza di una stringa
  • tolower(stringa): restituisce la stringa in caratteri minuscoli
  • toupper(stringa): restituisce la stringa in caratteri maiuscoli
  • int(numero): restituisce l’intero del numero (toglie i decimali)
  • cos(numero): calcola il coseno di un numero
  • sqrt(numero): calcola la radice quadrata di un numero
  • system(stringa di comando): esegue un comando Linux

supponiamo di voler rendere più evidenti tutte le righe di un testo con la scritta “important” all’interno.
Solo le righe che contentono la parola “important” sono state convertite in TUTTO MAIUSCOLE, le altre sono state stampate così come sono (notare il ! di NOT davanti alla seconda regex):

awk '/important/ { print toupper($0);} !/important/ { print $0; }'

nuove funzioni possono essere definite anche da voi seguendo la sintassi, vediamo una modifica del comando precedente:

awk '/important/ { print maiuscolo($0);} !/important/ { print $0; } function maiuscolo(stringa) { return toupper(stringa); }'

Cicli e condizionali

Come tutti i linguaggi di programmazione anche awk mette a disposizione dei comandi per gestire il flusso di operazioni!

  • if (condizione) { azione } else { altra azione }
  • while (condizione) { azione da ripetere }
  • for (inizializzazione; condizione; avanzamento) { azione da ripetere }
  • for (indice in array) { azioni con gli elementi di un array }

Per chi ha famigliarità con un linguaggio di programmazione non serve aggiungere altro a questa lista, per gli altri non sarà così ovvia…
Mi limiterò a fare qualche esempio per lasciar “intuire” come utilizzarli ma non è presunzione di questo tutorial insegnare a programmare a chi non lo ha mai fatto:

Riprendiamo l’esempio con i salti di prima (notate in fondo il comando if):


BEGIN {
FS = ":"; /* imposto come separatore i 2 punti */
}
{
conteggioRighe = conteggioRighe +1; /* questo può anche essere scritto conteggioRighe++; */
totale = totale + $2; /* il secondo campo è quello dopo i due punti */
print $0; /* stampo tutta la riga invariata */
}
END {
print "-----------"; /* un separatore */
calcoloMedia = totale/conteggioRighe;
if (calcoloMedia < 120) { print "media: CHE SCHIAPPA!!!"; }
else { print "media: " totale/conteggioRighe; }

}

Stavolta se la media di altezza per il salto in alto è inferiore a 120 verrà stampato CHE SCHIAPPA!!! :)

Come altro esempio immaginate di avere questo file:

salto in alto: 190
salto in alto: 174
salto in lungo: 5.3
100 metri: 9.5
salto in lungo: 4.8
salto in alto: 193
100 metri: 10.2

Ora vedremo, come ultimo esempio, come calcolare le medie di tutte le varie discipline in un colpo solo:


BEGIN {
FS = ":"; /* imposto come separatore i 2 punti */
}
{
conteggioRighe[$1]++;
totale[$1] = totale[$1] + $2; /* l'indice è il nome della disciplina ($1), il valore il risultato ($2) */
print $0; /* stampo tutta la riga invariata */
}
END {
print "-----------"; /* un separatore */
print "MEDIE:";
/* per ogni indice dell'array stampa una media */
for (indice in totale) { print indice ": " totale[indice]/conteggioRighe[indice]; }
}

ecco quello che si ottiene eseguendo questo programmino:

$ awk -f programmino.awk attletica.txt
salto in alto: 190
salto in alto: 174
salto in lungo: 5.3
100 metri: 9.5
salto in lungo: 4.8
salto in alto: 193
100 metri: 10.2
———–
MEDIE:
salto in alto: 185.667
100 metri: 9.85
salto in lungo: 5.05

sono disponibile per domande :)
se vi sembra ci siano parti poco chiare fatemelo notare e farò del mio meglio per renderle più chiare

ps: scusate ho fatto casini con il copia incolla.. ora dovrebbe essere a posto


Ieri l’annuncio: Debian ha aggiunto alle architetture distribuite fin ora (i368, amd64, …)  due nuove architetture: kfreebsd-i386 e kfreebsd-amd64.

In altre parole Debian non è più, da ieri, una distribuzione esclusivamente Linux. Stiamo infatti parlando di un sistema GNU/FreeBSD dove quest’ultimo sostituisce il kernel del pinguino.

Non ho provato la distro ma mi limito a segnalare la notizia che è passata nella mailing list del mio Lug proprio oggi.

L’annuncio linkato spiega che le due nuove architetture (che sarebbe meglio chiamare sistemi operativi visto che il kernel cambia) sono al momento in Experimental e Unstable e un ristrettissimo numero di package è disponibile al momento (solo lo stretto necessario).

Con questo rompo un lungo silenzio sul mio blog… Un giorno ritornerò a scrivere :)

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.